source: branches/UKMO/dev_r5518_GO6_under_ice_relax_dr_hook/NEMOGCM/NEMO/OPA_SRC/DIA/diawri.F90 @ 11738

Last change on this file since 11738 was 11738, checked in by marc, 13 months ago

The Dr Hook changes from my perl code.

File size: 60.7 KB
Line 
1MODULE diawri
2   !!======================================================================
3   !!                     ***  MODULE  diawri  ***
4   !! Ocean diagnostics :  write ocean output files
5   !!=====================================================================
6   !! History :  OPA  ! 1991-03  (M.-A. Foujols)  Original code
7   !!            4.0  ! 1991-11  (G. Madec)
8   !!                 ! 1992-06  (M. Imbard)  correction restart file
9   !!                 ! 1992-07  (M. Imbard)  split into diawri and rstwri
10   !!                 ! 1993-03  (M. Imbard)  suppress writibm
11   !!                 ! 1998-01  (C. Levy)  NETCDF format using ioipsl INTERFACE
12   !!                 ! 1999-02  (E. Guilyardi)  name of netCDF files + variables
13   !!            8.2  ! 2000-06  (M. Imbard)  Original code (diabort.F)
14   !!   NEMO     1.0  ! 2002-06  (A.Bozec, E. Durand)  Original code (diainit.F)
15   !!             -   ! 2002-09  (G. Madec)  F90: Free form and module
16   !!             -   ! 2002-12  (G. Madec)  merge of diabort and diainit, F90
17   !!                 ! 2005-11  (V. Garnier) Surface pressure gradient organization
18   !!            3.2  ! 2008-11  (B. Lemaire) creation from old diawri
19   !!----------------------------------------------------------------------
20
21   !!----------------------------------------------------------------------
22   !!   dia_wri       : create the standart output files
23   !!   dia_wri_state : create an output NetCDF file for a single instantaeous ocean state and forcing fields
24   !!----------------------------------------------------------------------
25   USE oce             ! ocean dynamics and tracers
26   USE dom_oce         ! ocean space and time domain
27   USE dynadv, ONLY: ln_dynadv_vec
28   USE zdf_oce         ! ocean vertical physics
29   USE ldftra_oce      ! ocean active tracers: lateral physics
30   USE ldfdyn_oce      ! ocean dynamics: lateral physics
31   USE traldf_iso_grif, ONLY : psix_eiv, psiy_eiv
32   USE sol_oce         ! solver variables
33   USE sbc_oce         ! Surface boundary condition: ocean fields
34   USE sbc_ice         ! Surface boundary condition: ice fields
35   USE icb_oce         ! Icebergs
36   USE icbdia          ! Iceberg budgets
37   USE sbcssr          ! restoring term toward SST/SSS climatology
38   USE phycst          ! physical constants
39   USE zdfmxl          ! mixed layer
40   USE dianam          ! build name of file (routine)
41   USE zdftke          ! vertical physics: one-equation scheme
42   USE zdfddm          ! vertical  physics: double diffusion
43   USE diahth          ! thermocline diagnostics
44   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
45   USE in_out_manager  ! I/O manager
46   USE diadimg         ! dimg direct access file format output
47   USE iom
48   USE ioipsl
49   USE dynspg_oce, ONLY: un_adv, vn_adv ! barotropic velocities   
50   USE insitu_tem, ONLY: insitu_t, theta2t
51#if defined key_lim2
52   USE limwri_2 
53#elif defined key_lim3
54   USE limwri 
55#endif
56   USE lib_mpp         ! MPP library
57   USE timing          ! preformance summary
58   USE wrk_nemo        ! working array
59
60   USE yomhook, ONLY: lhook, dr_hook
61   USE parkind1, ONLY: jprb, jpim
62
63   IMPLICIT NONE
64   PRIVATE
65
66   PUBLIC   dia_wri                 ! routines called by step.F90
67   PUBLIC   dia_wri_state
68   PUBLIC   dia_wri_alloc           ! Called by nemogcm module
69
70   INTEGER ::   nid_T, nz_T, nh_T, ndim_T, ndim_hT   ! grid_T file
71   INTEGER ::          nb_T              , ndim_bT   ! grid_T file
72   INTEGER ::   nid_U, nz_U, nh_U, ndim_U, ndim_hU   ! grid_U file
73   INTEGER ::   nid_V, nz_V, nh_V, ndim_V, ndim_hV   ! grid_V file
74   INTEGER ::   nid_W, nz_W, nh_W                    ! grid_W file
75   INTEGER ::   ndex(1)                              ! ???
76   INTEGER, SAVE, ALLOCATABLE, DIMENSION(:) :: ndex_hT, ndex_hU, ndex_hV
77   INTEGER, SAVE, ALLOCATABLE, DIMENSION(:) :: ndex_T, ndex_U, ndex_V
78   INTEGER, SAVE, ALLOCATABLE, DIMENSION(:) :: ndex_bT
79
80   !! * Substitutions
81#  include "zdfddm_substitute.h90"
82#  include "domzgr_substitute.h90"
83#  include "vectopt_loop_substitute.h90"
84   !!----------------------------------------------------------------------
85   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
86   !! $Id$
87   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
88   !!----------------------------------------------------------------------
89CONTAINS
90
91   INTEGER FUNCTION dia_wri_alloc()
92      !!----------------------------------------------------------------------
93      INTEGER, DIMENSION(2) :: ierr
94      INTEGER(KIND=jpim), PARAMETER :: zhook_in = 0
95      INTEGER(KIND=jpim), PARAMETER :: zhook_out = 1
96      REAL(KIND=jprb)               :: zhook_handle
97
98      CHARACTER(LEN=*), PARAMETER :: RoutineName='DIA_WRI_ALLOC'
99
100      IF (lhook) CALL dr_hook(RoutineName,zhook_in,zhook_handle)
101
102      !!----------------------------------------------------------------------
103      ierr = 0
104      ALLOCATE( ndex_hT(jpi*jpj) , ndex_T(jpi*jpj*jpk) ,     &
105         &      ndex_hU(jpi*jpj) , ndex_U(jpi*jpj*jpk) ,     &
106         &      ndex_hV(jpi*jpj) , ndex_V(jpi*jpj*jpk) , STAT=ierr(1) )
107         !
108      dia_wri_alloc = MAXVAL(ierr)
109      IF( lk_mpp )   CALL mpp_sum( dia_wri_alloc )
110      !
111      IF (lhook) CALL dr_hook(RoutineName,zhook_out,zhook_handle)
112  END FUNCTION dia_wri_alloc
113
114#if defined key_dimgout
115   !!----------------------------------------------------------------------
116   !!   'key_dimgout'                                      DIMG output file
117   !!----------------------------------------------------------------------
118#   include "diawri_dimg.h90"
119
120#else
121   !!----------------------------------------------------------------------
122   !!   Default option                                   NetCDF output file
123   !!----------------------------------------------------------------------
124# if defined key_iomput
125   !!----------------------------------------------------------------------
126   !!   'key_iomput'                                        use IOM library
127   !!----------------------------------------------------------------------
128
129   SUBROUTINE dia_wri( kt )
130      !!---------------------------------------------------------------------
131      !!                  ***  ROUTINE dia_wri  ***
132      !!                   
133      !! ** Purpose :   Standard output of opa: dynamics and tracer fields
134      !!      NETCDF format is used by default
135      !!
136      !! ** Method  :  use iom_put
137      !!----------------------------------------------------------------------
138      !!
139      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index
140      !!
141      INTEGER                      ::   ji, jj, jk              ! dummy loop indices
142      INTEGER                      ::   jkbot                   !
143      REAL(wp)                     ::   zztmp, zztmpx, zztmpy   !
144      !!
145      REAL(wp), POINTER, DIMENSION(:,:)   :: z2d      ! 2D workspace
146      REAL(wp), POINTER, DIMENSION(:,:,:) :: z3d      ! 3D workspace
147      INTEGER(KIND=jpim), PARAMETER :: zhook_in = 0
148      INTEGER(KIND=jpim), PARAMETER :: zhook_out = 1
149      REAL(KIND=jprb)               :: zhook_handle
150
151      CHARACTER(LEN=*), PARAMETER :: RoutineName='DIA_WRI'
152
153      IF (lhook) CALL dr_hook(RoutineName,zhook_in,zhook_handle)
154
155      !!----------------------------------------------------------------------
156      !
157      IF( nn_timing == 1 )   CALL timing_start('dia_wri')
158      !
159      CALL wrk_alloc( jpi , jpj      , z2d )
160      CALL wrk_alloc( jpi , jpj, jpk , z3d )
161      !
162      ! Output the initial state and forcings
163      IF( ninist == 1 ) THEN                       
164         CALL dia_wri_state( 'output.init', kt )
165         ninist = 0
166      ENDIF
167
168      ! Output of initial vertical scale factor
169      CALL iom_put("e3t_0", e3t_0(:,:,:) )
170      CALL iom_put("e3u_0", e3t_0(:,:,:) )
171      CALL iom_put("e3v_0", e3t_0(:,:,:) )
172      !
173      CALL iom_put( "e3t" , fse3t_n(:,:,:) )
174      CALL iom_put( "e3u" , fse3u_n(:,:,:) )
175      CALL iom_put( "e3v" , fse3v_n(:,:,:) )
176      CALL iom_put( "e3w" , fse3w_n(:,:,:) )
177      IF( iom_use("e3tdef") )   &
178         CALL iom_put( "e3tdef"  , ( ( fse3t_n(:,:,:) - e3t_0(:,:,:) ) / e3t_0(:,:,:) * 100 * tmask(:,:,:) ) ** 2 )
179      CALL iom_put("tpt_dep", fsdept_n(:,:,:) )
180      CALL iom_put("wpt_dep", fsdepw_n(:,:,:) )
181
182
183      CALL iom_put( "ssh" , sshn )                 ! sea surface height
184     
185      CALL iom_put( "toce", tsn(:,:,:,jp_tem) )    ! 3D temperature
186      CALL theta2t ! in-situ temperature conversion
187      CALL iom_put( "tinsitu", insitu_t(:,:,:))    ! in-situ temperature
188      CALL iom_put(  "sst", tsn(:,:,1,jp_tem) )    ! surface temperature
189      IF ( iom_use("sbt") ) THEN
190         DO jj = 1, jpj
191            DO ji = 1, jpi
192               jkbot = mbkt(ji,jj)
193               z2d(ji,jj) = tsn(ji,jj,jkbot,jp_tem)
194            END DO
195         END DO
196         CALL iom_put( "sbt", z2d )                ! bottom temperature
197      ENDIF
198     
199      CALL iom_put( "soce", tsn(:,:,:,jp_sal) )    ! 3D salinity
200      CALL iom_put(  "sss", tsn(:,:,1,jp_sal) )    ! surface salinity
201      IF ( iom_use("sbs") ) THEN
202         DO jj = 1, jpj
203            DO ji = 1, jpi
204               jkbot = mbkt(ji,jj)
205               z2d(ji,jj) = tsn(ji,jj,jkbot,jp_sal)
206            END DO
207         END DO
208         CALL iom_put( "sbs", z2d )                ! bottom salinity
209      ENDIF
210
211      IF ( iom_use("taubot") ) THEN                ! bottom stress
212         z2d(:,:) = 0._wp
213         DO jj = 2, jpjm1
214            DO ji = fs_2, fs_jpim1   ! vector opt.
215               zztmpx = (  bfrua(ji  ,jj) * un(ji  ,jj,mbku(ji  ,jj))  &
216                      &  + bfrua(ji-1,jj) * un(ji-1,jj,mbku(ji-1,jj))  )     
217               zztmpy = (  bfrva(ji,  jj) * vn(ji,jj  ,mbkv(ji,jj  ))  &
218                      &  + bfrva(ji,jj-1) * vn(ji,jj-1,mbkv(ji,jj-1))  ) 
219               z2d(ji,jj) = rau0 * SQRT( zztmpx * zztmpx + zztmpy * zztmpy ) * tmask(ji,jj,1) 
220               !
221            ENDDO
222         ENDDO
223         CALL lbc_lnk( z2d, 'T', 1. )
224         CALL iom_put( "taubot", z2d )           
225      ENDIF
226     
227      CALL iom_put( "uoce", un(:,:,:)         )    ! 3D i-current
228      CALL iom_put(  "ssu", un(:,:,1)         )    ! surface i-current
229      IF ( iom_use("sbu") ) THEN
230         DO jj = 1, jpj
231            DO ji = 1, jpi
232               jkbot = mbku(ji,jj)
233               z2d(ji,jj) = un(ji,jj,jkbot)
234            END DO
235         END DO
236         CALL iom_put( "sbu", z2d )                ! bottom i-current
237      ENDIF
238#if defined key_dynspg_ts
239      CALL iom_put(  "ubar", un_adv(:,:)      )    ! barotropic i-current
240#else
241      CALL iom_put(  "ubar", un_b(:,:)        )    ! barotropic i-current
242#endif
243     
244      CALL iom_put( "voce", vn(:,:,:)         )    ! 3D j-current
245      CALL iom_put(  "ssv", vn(:,:,1)         )    ! surface j-current
246      IF ( iom_use("sbv") ) THEN
247         DO jj = 1, jpj
248            DO ji = 1, jpi
249               jkbot = mbkv(ji,jj)
250               z2d(ji,jj) = vn(ji,jj,jkbot)
251            END DO
252         END DO
253         CALL iom_put( "sbv", z2d )                ! bottom j-current
254      ENDIF
255#if defined key_dynspg_ts
256      CALL iom_put(  "vbar", vn_adv(:,:)      )    ! barotropic j-current
257#else
258      CALL iom_put(  "vbar", vn_b(:,:)        )    ! barotropic j-current
259#endif
260
261      CALL iom_put( "woce", wn )                   ! vertical velocity
262      IF( iom_use('w_masstr') .OR. iom_use('w_masstr2') ) THEN   ! vertical mass transport & its square value
263         ! Caution: in the VVL case, it only correponds to the baroclinic mass transport.
264         z2d(:,:) = rau0 * e12t(:,:)
265         DO jk = 1, jpk
266            z3d(:,:,jk) = wn(:,:,jk) * z2d(:,:)
267         END DO
268         CALL lbc_lnk( z3d(:,:,:), 'W', 1. )
269         CALL iom_put( "w_masstr" , z3d ) 
270         IF( iom_use('w_masstr2') )   CALL iom_put( "w_masstr2", z3d(:,:,:) * z3d(:,:,:) )
271      ENDIF
272
273      CALL iom_put( "avt" , avt                        )    ! T vert. eddy diff. coef.
274      CALL iom_put( "avm" , avmu                       )    ! T vert. eddy visc. coef.
275#if defined key_zdftke
276      IF( lk_zdftke ) THEN   
277         CALL iom_put( "tke"      , en                               )    ! TKE budget: Turbulent Kinetic Energy   
278         CALL iom_put( "tke_niw"  , e_niw                            )    ! TKE budget: Near-inertial waves   
279      ENDIF 
280#endif
281      CALL iom_put( "avs" , fsavs(:,:,:)               )    ! S vert. eddy diff. coef. (useful only with key_zdfddm)
282                                                            ! Log of eddy diff coef
283      IF( iom_use('logavt') )   CALL iom_put( "logavt", LOG( MAX( 1.e-20_wp, avt  (:,:,:) ) ) )
284      IF( iom_use('logavs') )   CALL iom_put( "logavs", LOG( MAX( 1.e-20_wp, fsavs(:,:,:) ) ) )
285
286      IF ( iom_use("sstgrad") .OR. iom_use("sstgrad2") ) THEN
287         DO jj = 2, jpjm1                                    ! sst gradient
288            DO ji = fs_2, fs_jpim1   ! vector opt.
289               zztmp      = tsn(ji,jj,1,jp_tem)
290               zztmpx     = ( tsn(ji+1,jj  ,1,jp_tem) - zztmp ) / e1u(ji,jj) + ( zztmp - tsn(ji-1,jj  ,1,jp_tem) ) / e1u(ji-1,jj  )
291               zztmpy     = ( tsn(ji  ,jj+1,1,jp_tem) - zztmp ) / e2v(ji,jj) + ( zztmp - tsn(ji  ,jj-1,1,jp_tem) ) / e2v(ji  ,jj-1)
292               z2d(ji,jj) = 0.25 * ( zztmpx * zztmpx + zztmpy * zztmpy )   &
293                  &              * umask(ji,jj,1) * umask(ji-1,jj,1) * vmask(ji,jj,1) * umask(ji,jj-1,1)
294            END DO
295         END DO
296         CALL lbc_lnk( z2d, 'T', 1. )
297         CALL iom_put( "sstgrad2",  z2d               )    ! square of module of sst gradient
298         z2d(:,:) = SQRT( z2d(:,:) )
299         CALL iom_put( "sstgrad" ,  z2d               )    ! module of sst gradient
300      ENDIF
301         
302      ! clem: heat and salt content
303      IF( iom_use("heatc") ) THEN
304         z2d(:,:)  = 0._wp 
305         DO jk = 1, jpkm1
306            DO jj = 1, jpj
307               DO ji = 1, jpi
308                  z2d(ji,jj) = z2d(ji,jj) + fse3t(ji,jj,jk) * tsn(ji,jj,jk,jp_tem) * tmask(ji,jj,jk)
309               END DO
310            END DO
311         END DO
312         CALL iom_put( "heatc", (rau0 * rcp) * z2d )    ! vertically integrated heat content (J/m2)
313      ENDIF
314
315      IF( iom_use("saltc") ) THEN
316         z2d(:,:)  = 0._wp 
317         DO jk = 1, jpkm1
318            DO jj = 1, jpj
319               DO ji = 1, jpi
320                  z2d(ji,jj) = z2d(ji,jj) + fse3t(ji,jj,jk) * tsn(ji,jj,jk,jp_sal) * tmask(ji,jj,jk)
321               END DO
322            END DO
323         END DO
324         CALL iom_put( "saltc", rau0 * z2d )   ! vertically integrated salt content (PSU*kg/m2)
325      ENDIF
326      !
327      IF ( iom_use("eken") ) THEN
328         rke(:,:,jk) = 0._wp                               !      kinetic energy
329         DO jk = 1, jpkm1
330            DO jj = 2, jpjm1
331               DO ji = fs_2, fs_jpim1   ! vector opt.
332                  zztmp   = 1._wp / ( e1e2t(ji,jj) * fse3t(ji,jj,jk) )
333                  zztmpx  = 0.5 * (  un(ji-1,jj,jk) * un(ji-1,jj,jk) * e2u(ji-1,jj) * fse3u(ji-1,jj,jk)    &
334                     &             + un(ji  ,jj,jk) * un(ji  ,jj,jk) * e2u(ji  ,jj) * fse3u(ji  ,jj,jk) )  &
335                     &          *  zztmp 
336                  !
337                  zztmpy  = 0.5 * (  vn(ji,jj-1,jk) * vn(ji,jj-1,jk) * e1v(ji,jj-1) * fse3v(ji,jj-1,jk)    &
338                     &             + vn(ji,jj  ,jk) * vn(ji,jj  ,jk) * e1v(ji,jj  ) * fse3v(ji,jj  ,jk) )  &
339                     &          *  zztmp 
340                  !
341                  rke(ji,jj,jk) = 0.5_wp * ( zztmpx + zztmpy )
342                  !
343               ENDDO
344            ENDDO
345         ENDDO
346         CALL lbc_lnk( rke, 'T', 1. )
347         CALL iom_put( "eken", rke )           
348      ENDIF
349      !
350      CALL iom_put( "hdiv", hdivn )                  ! Horizontal divergence
351      !
352      IF( iom_use("u_masstr") .OR. iom_use("u_masstr_vint") .OR. iom_use("u_heattr") .OR. iom_use("u_salttr") ) THEN
353         z3d(:,:,jpk) = 0.e0
354         z2d(:,:) = 0.e0
355         DO jk = 1, jpkm1
356            z3d(:,:,jk) = rau0 * un(:,:,jk) * e2u(:,:) * fse3u(:,:,jk) * umask(:,:,jk)
357            z2d(:,:) = z2d(:,:) + z3d(:,:,jk)
358         END DO
359         CALL lbc_lnk( z3d(:,:,:), 'U', -1. )
360         CALL iom_put( "u_masstr", z3d )                  ! mass transport in i-direction
361         CALL lbc_lnk( z2d(:,:), 'U', -1. )
362         CALL iom_put( "u_masstr_vint", z2d )             ! mass transport in i-direction vertical sum
363      ENDIF
364     
365      IF( iom_use("u_heattr") ) THEN
366         z2d(:,:) = 0.e0 
367         DO jk = 1, jpkm1
368            DO jj = 2, jpjm1
369               DO ji = fs_2, fs_jpim1   ! vector opt.
370                  z2d(ji,jj) = z2d(ji,jj) + z3d(ji,jj,jk) * ( tsn(ji,jj,jk,jp_tem) + tsn(ji+1,jj,jk,jp_tem) )
371               END DO
372            END DO
373         END DO
374         CALL lbc_lnk( z2d, 'U', -1. )
375         CALL iom_put( "u_heattr", (0.5 * rcp) * z2d )    ! heat transport in i-direction
376      ENDIF
377
378      IF( iom_use("u_salttr") ) THEN
379         z2d(:,:) = 0.e0 
380         DO jk = 1, jpkm1
381            DO jj = 2, jpjm1
382               DO ji = fs_2, fs_jpim1   ! vector opt.
383                  z2d(ji,jj) = z2d(ji,jj) + z3d(ji,jj,jk) * ( tsn(ji,jj,jk,jp_sal) + tsn(ji+1,jj,jk,jp_sal) )
384               END DO
385            END DO
386         END DO
387         CALL lbc_lnk( z2d, 'U', -1. )
388         CALL iom_put( "u_salttr", 0.5 * z2d )            ! heat transport in i-direction
389      ENDIF
390
391     
392      IF( iom_use("v_masstr") .OR. iom_use("v_heattr") .OR. iom_use("v_salttr") ) THEN
393         z3d(:,:,jpk) = 0.e0
394         DO jk = 1, jpkm1
395            z3d(:,:,jk) = rau0 * vn(:,:,jk) * e1v(:,:) * fse3v(:,:,jk) * vmask(:,:,jk)
396         END DO
397         CALL lbc_lnk( z3d(:,:,:), 'V', -1. )
398         CALL iom_put( "v_masstr", z3d )                  ! mass transport in j-direction
399      ENDIF
400     
401      IF( iom_use("v_heattr") ) THEN
402         z2d(:,:) = 0.e0 
403         DO jk = 1, jpkm1
404            DO jj = 2, jpjm1
405               DO ji = fs_2, fs_jpim1   ! vector opt.
406                  z2d(ji,jj) = z2d(ji,jj) + z3d(ji,jj,jk) * ( tsn(ji,jj,jk,jp_tem) + tsn(ji,jj+1,jk,jp_tem) )
407               END DO
408            END DO
409         END DO
410         CALL lbc_lnk( z2d, 'V', -1. )
411         CALL iom_put( "v_heattr", (0.5 * rcp) * z2d )    !  heat transport in j-direction
412      ENDIF
413
414      IF( iom_use("v_salttr") ) THEN
415         z2d(:,:) = 0.e0 
416         DO jk = 1, jpkm1
417            DO jj = 2, jpjm1
418               DO ji = fs_2, fs_jpim1   ! vector opt.
419                  z2d(ji,jj) = z2d(ji,jj) + z3d(ji,jj,jk) * ( tsn(ji,jj,jk,jp_sal) + tsn(ji,jj+1,jk,jp_sal) )
420               END DO
421            END DO
422         END DO
423         CALL lbc_lnk( z2d, 'V', -1. )
424         CALL iom_put( "v_salttr", 0.5 * z2d )            !  heat transport in j-direction
425      ENDIF
426
427      ! Vertical integral of temperature
428      IF( iom_use("tosmint") ) THEN
429         z2d(:,:)=0._wp
430         DO jk = 1, jpkm1
431            DO jj = 2, jpjm1
432               DO ji = fs_2, fs_jpim1   ! vector opt.
433                  z2d(ji,jj) = z2d(ji,jj) + rau0 * fse3t(ji,jj,jk) *  tsn(ji,jj,jk,jp_tem)
434               END DO
435            END DO
436         END DO
437         CALL lbc_lnk( z2d, 'T', -1. )
438         CALL iom_put( "tosmint", z2d ) 
439      ENDIF
440
441      ! Vertical integral of salinity
442      IF( iom_use("somint") ) THEN
443         z2d(:,:)=0._wp
444         DO jk = 1, jpkm1
445            DO jj = 2, jpjm1
446               DO ji = fs_2, fs_jpim1   ! vector opt.
447                  z2d(ji,jj) = z2d(ji,jj) + rau0 * fse3t(ji,jj,jk) * tsn(ji,jj,jk,jp_sal)
448               END DO
449            END DO
450         END DO
451         CALL lbc_lnk( z2d, 'T', -1. )
452         CALL iom_put( "somint", z2d ) 
453      ENDIF
454
455      CALL iom_put( "bn2", rn2 )  !Brunt-Vaisala buoyancy frequency (N^2)
456      !
457      CALL wrk_dealloc( jpi , jpj      , z2d )
458      CALL wrk_dealloc( jpi , jpj, jpk , z3d )
459      !
460      IF( nn_timing == 1 )   CALL timing_stop('dia_wri')
461      !
462      IF (lhook) CALL dr_hook(RoutineName,zhook_out,zhook_handle)
463   END SUBROUTINE dia_wri
464
465#else
466   !!----------------------------------------------------------------------
467   !!   Default option                                  use IOIPSL  library
468   !!----------------------------------------------------------------------
469
470   SUBROUTINE dia_wri( kt )
471      !!---------------------------------------------------------------------
472      !!                  ***  ROUTINE dia_wri  ***
473      !!                   
474      !! ** Purpose :   Standard output of opa: dynamics and tracer fields
475      !!      NETCDF format is used by default
476      !!
477      !! ** Method  :   At the beginning of the first time step (nit000),
478      !!      define all the NETCDF files and fields
479      !!      At each time step call histdef to compute the mean if ncessary
480      !!      Each nwrite time step, output the instantaneous or mean fields
481      !!----------------------------------------------------------------------
482      !!
483      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index
484      !!
485      LOGICAL ::   ll_print = .FALSE.                        ! =T print and flush numout
486      CHARACTER (len=40) ::   clhstnam, clop, clmx           ! local names
487      INTEGER  ::   inum = 11                                ! temporary logical unit
488      INTEGER  ::   ji, jj, jk                               ! dummy loop indices
489      INTEGER  ::   ierr                                     ! error code return from allocation
490      INTEGER  ::   iimi, iima, ipk, it, itmod, ijmi, ijma   ! local integers
491      INTEGER  ::   jn, ierror                               ! local integers
492      REAL(wp) ::   zsto, zout, zmax, zjulian, zdt           ! local scalars
493      !!
494      REAL(wp), POINTER, DIMENSION(:,:)   :: zw2d       ! 2D workspace
495      REAL(wp), POINTER, DIMENSION(:,:,:) :: zw3d       ! 3D workspace
496      INTEGER(KIND=jpim), PARAMETER :: zhook_in = 0
497      INTEGER(KIND=jpim), PARAMETER :: zhook_out = 1
498      REAL(KIND=jprb)               :: zhook_handle
499
500      CHARACTER(LEN=*), PARAMETER :: RoutineName='DIA_WRI'
501
502      IF (lhook) CALL dr_hook(RoutineName,zhook_in,zhook_handle)
503
504      !!----------------------------------------------------------------------
505      !
506      IF( nn_timing == 1 )   CALL timing_start('dia_wri')
507      !
508      CALL wrk_alloc( jpi , jpj      , zw2d )
509      IF ( ln_traldf_gdia .OR. lk_vvl )  call wrk_alloc( jpi , jpj , jpk  , zw3d )
510      !
511      ! Output the initial state and forcings
512      IF( ninist == 1 ) THEN                       
513         CALL dia_wri_state( 'output.init', kt )
514         ninist = 0
515      ENDIF
516      !
517      ! 0. Initialisation
518      ! -----------------
519
520      ! local variable for debugging
521      ll_print = .FALSE.
522      ll_print = ll_print .AND. lwp
523
524      ! Define frequency of output and means
525      zdt = rdt
526      IF( nacc == 1 ) zdt = rdtmin
527      clop = "x"         ! no use of the mask value (require less cpu time, and otherwise the model crashes)
528#if defined key_diainstant
529      zsto = nwrite * zdt
530      clop = "inst("//TRIM(clop)//")"
531#else
532      zsto=zdt
533      clop = "ave("//TRIM(clop)//")"
534#endif
535      zout = nwrite * zdt
536      zmax = ( nitend - nit000 + 1 ) * zdt
537
538      ! Define indices of the horizontal output zoom and vertical limit storage
539      iimi = 1      ;      iima = jpi
540      ijmi = 1      ;      ijma = jpj
541      ipk = jpk
542
543      ! define time axis
544      it = kt
545      itmod = kt - nit000 + 1
546
547
548      ! 1. Define NETCDF files and fields at beginning of first time step
549      ! -----------------------------------------------------------------
550
551      IF( kt == nit000 ) THEN
552
553         ! Define the NETCDF files (one per grid)
554
555         ! Compute julian date from starting date of the run
556         CALL ymds2ju( nyear, nmonth, nday, rdt, zjulian )
557         zjulian = zjulian - adatrj   !   set calendar origin to the beginning of the experiment
558         IF(lwp)WRITE(numout,*)
559         IF(lwp)WRITE(numout,*) 'Date 0 used :', nit000, ' YEAR ', nyear,   &
560            &                    ' MONTH ', nmonth, ' DAY ', nday, 'Julian day : ', zjulian
561         IF(lwp)WRITE(numout,*) ' indexes of zoom = ', iimi, iima, ijmi, ijma,   &
562                                 ' limit storage in depth = ', ipk
563
564         ! WRITE root name in date.file for use by postpro
565         IF(lwp) THEN
566            CALL dia_nam( clhstnam, nwrite,' ' )
567            CALL ctl_opn( inum, 'date.file', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, numout, lwp, narea )
568            WRITE(inum,*) clhstnam
569            CLOSE(inum)
570         ENDIF
571
572         ! Define the T grid FILE ( nid_T )
573
574         CALL dia_nam( clhstnam, nwrite, 'grid_T' )
575         IF(lwp) WRITE(numout,*) " Name of NETCDF file ", clhstnam    ! filename
576         CALL histbeg( clhstnam, jpi, glamt, jpj, gphit,           &  ! Horizontal grid: glamt and gphit
577            &          iimi, iima-iimi+1, ijmi, ijma-ijmi+1,       &
578            &          nit000-1, zjulian, zdt, nh_T, nid_T, domain_id=nidom, snc4chunks=snc4set )
579         CALL histvert( nid_T, "deptht", "Vertical T levels",      &  ! Vertical grid: gdept
580            &           "m", ipk, gdept_1d, nz_T, "down" )
581         !                                                            ! Index of ocean points
582         CALL wheneq( jpi*jpj*ipk, tmask, 1, 1., ndex_T , ndim_T  )      ! volume
583         CALL wheneq( jpi*jpj    , tmask, 1, 1., ndex_hT, ndim_hT )      ! surface
584         !
585         IF( ln_icebergs ) THEN
586            !
587            !! allocation cant go in dia_wri_alloc because ln_icebergs is only set after
588            !! that routine is called from nemogcm, so do it here immediately before its needed
589            ALLOCATE( ndex_bT(jpi*jpj*nclasses), STAT=ierror )
590            IF( lk_mpp )   CALL mpp_sum( ierror )
591            IF( ierror /= 0 ) THEN
592               CALL ctl_stop('dia_wri: failed to allocate iceberg diagnostic array')
593      IF (lhook) CALL dr_hook(RoutineName,zhook_out ,zhook_handle)
594               RETURN
595            ENDIF
596            !
597            !! iceberg vertical coordinate is class number
598            CALL histvert( nid_T, "class", "Iceberg class",      &  ! Vertical grid: class
599               &           "number", nclasses, class_num, nb_T )
600            !
601            !! each class just needs the surface index pattern
602            ndim_bT = 3
603            DO jn = 1,nclasses
604               ndex_bT((jn-1)*jpi*jpj+1:jn*jpi*jpj) = ndex_hT(1:jpi*jpj)
605            ENDDO
606            !
607         ENDIF
608
609         ! Define the U grid FILE ( nid_U )
610
611         CALL dia_nam( clhstnam, nwrite, 'grid_U' )
612         IF(lwp) WRITE(numout,*) " Name of NETCDF file ", clhstnam    ! filename
613         CALL histbeg( clhstnam, jpi, glamu, jpj, gphiu,           &  ! Horizontal grid: glamu and gphiu
614            &          iimi, iima-iimi+1, ijmi, ijma-ijmi+1,       &
615            &          nit000-1, zjulian, zdt, nh_U, nid_U, domain_id=nidom, snc4chunks=snc4set )
616         CALL histvert( nid_U, "depthu", "Vertical U levels",      &  ! Vertical grid: gdept
617            &           "m", ipk, gdept_1d, nz_U, "down" )
618         !                                                            ! Index of ocean points
619         CALL wheneq( jpi*jpj*ipk, umask, 1, 1., ndex_U , ndim_U  )      ! volume
620         CALL wheneq( jpi*jpj    , umask, 1, 1., ndex_hU, ndim_hU )      ! surface
621
622         ! Define the V grid FILE ( nid_V )
623
624         CALL dia_nam( clhstnam, nwrite, 'grid_V' )                   ! filename
625         IF(lwp) WRITE(numout,*) " Name of NETCDF file ", clhstnam
626         CALL histbeg( clhstnam, jpi, glamv, jpj, gphiv,           &  ! Horizontal grid: glamv and gphiv
627            &          iimi, iima-iimi+1, ijmi, ijma-ijmi+1,       &
628            &          nit000-1, zjulian, zdt, nh_V, nid_V, domain_id=nidom, snc4chunks=snc4set )
629         CALL histvert( nid_V, "depthv", "Vertical V levels",      &  ! Vertical grid : gdept
630            &          "m", ipk, gdept_1d, nz_V, "down" )
631         !                                                            ! Index of ocean points
632         CALL wheneq( jpi*jpj*ipk, vmask, 1, 1., ndex_V , ndim_V  )      ! volume
633         CALL wheneq( jpi*jpj    , vmask, 1, 1., ndex_hV, ndim_hV )      ! surface
634
635         ! Define the W grid FILE ( nid_W )
636
637         CALL dia_nam( clhstnam, nwrite, 'grid_W' )                   ! filename
638         IF(lwp) WRITE(numout,*) " Name of NETCDF file ", clhstnam
639         CALL histbeg( clhstnam, jpi, glamt, jpj, gphit,           &  ! Horizontal grid: glamt and gphit
640            &          iimi, iima-iimi+1, ijmi, ijma-ijmi+1,       &
641            &          nit000-1, zjulian, zdt, nh_W, nid_W, domain_id=nidom, snc4chunks=snc4set )
642         CALL histvert( nid_W, "depthw", "Vertical W levels",      &  ! Vertical grid: gdepw
643            &          "m", ipk, gdepw_1d, nz_W, "down" )
644
645
646         ! Declare all the output fields as NETCDF variables
647
648         !                                                                                      !!! nid_T : 3D
649         CALL histdef( nid_T, "votemper", "Temperature"                        , "C"      ,   &  ! tn
650            &          jpi, jpj, nh_T, ipk, 1, ipk, nz_T, 32, clop, zsto, zout )
651         CALL histdef( nid_T, "vosaline", "Salinity"                           , "PSU"    ,   &  ! sn
652            &          jpi, jpj, nh_T, ipk, 1, ipk, nz_T, 32, clop, zsto, zout )
653         IF(  lk_vvl  ) THEN
654            CALL histdef( nid_T, "vovvle3t", "Level thickness"                    , "m"      ,&  ! e3t_n
655            &             jpi, jpj, nh_T, ipk, 1, ipk, nz_T, 32, clop, zsto, zout )
656            CALL histdef( nid_T, "vovvldep", "T point depth"                      , "m"      ,&  ! e3t_n
657            &             jpi, jpj, nh_T, ipk, 1, ipk, nz_T, 32, clop, zsto, zout )
658            CALL histdef( nid_T, "vovvldef", "Squared level deformation"          , "%^2"    ,&  ! e3t_n
659            &             jpi, jpj, nh_T, ipk, 1, ipk, nz_T, 32, clop, zsto, zout )
660         ENDIF
661         !                                                                                      !!! nid_T : 2D
662         CALL histdef( nid_T, "sosstsst", "Sea Surface temperature"            , "C"      ,   &  ! sst
663            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
664         CALL histdef( nid_T, "sosaline", "Sea Surface Salinity"               , "PSU"    ,   &  ! sss
665            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
666         CALL histdef( nid_T, "sossheig", "Sea Surface Height"                 , "m"      ,   &  ! ssh
667            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
668         CALL histdef( nid_T, "sowaflup", "Net Upward Water Flux"              , "Kg/m2/s",   &  ! (emp-rnf)
669            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
670         CALL histdef( nid_T, "sorunoff", "River runoffs"                      , "Kg/m2/s",   &  ! runoffs
671            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
672         CALL histdef( nid_T, "sosfldow", "downward salt flux"                 , "PSU/m2/s",  &  ! sfx
673            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
674         IF(  .NOT. lk_vvl  ) THEN
675            CALL histdef( nid_T, "sosst_cd", "Concentration/Dilution term on temperature"     &  ! emp * tsn(:,:,1,jp_tem)
676            &                                                                  , "KgC/m2/s",  &  ! sosst_cd
677            &             jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
678            CALL histdef( nid_T, "sosss_cd", "Concentration/Dilution term on salinity"        &  ! emp * tsn(:,:,1,jp_sal)
679            &                                                                  , "KgPSU/m2/s",&  ! sosss_cd
680            &             jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
681         ENDIF
682         CALL histdef( nid_T, "sohefldo", "Net Downward Heat Flux"             , "W/m2"   ,   &  ! qns + qsr
683            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
684         CALL histdef( nid_T, "soshfldo", "Shortwave Radiation"                , "W/m2"   ,   &  ! qsr
685            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
686         CALL histdef( nid_T, "somixhgt", "Turbocline Depth"                   , "m"      ,   &  ! hmld
687            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
688         CALL histdef( nid_T, "somxl010", "Mixed Layer Depth 0.01"             , "m"      ,   &  ! hmlp
689            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
690         CALL histdef( nid_T, "soicecov", "Ice fraction"                       , "[0,1]"  ,   &  ! fr_i
691            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
692         CALL histdef( nid_T, "sowindsp", "wind speed at 10m"                  , "m/s"    ,   &  ! wndm
693            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
694!
695         IF( ln_icebergs ) THEN
696            CALL histdef( nid_T, "calving"             , "calving mass input"                       , "kg/s"   , &
697               &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
698            CALL histdef( nid_T, "calving_heat"        , "calving heat flux"                        , "XXXX"   , &
699               &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
700            CALL histdef( nid_T, "berg_floating_melt"  , "Melt rate of icebergs + bits"             , "kg/m2/s", &
701               &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
702            CALL histdef( nid_T, "berg_stored_ice"     , "Accumulated ice mass by class"            , "kg"     , &
703               &          jpi, jpj, nh_T, nclasses  , 1, nclasses  , nb_T , 32, clop, zsto, zout )
704            IF( ln_bergdia ) THEN
705               CALL histdef( nid_T, "berg_melt"           , "Melt rate of icebergs"                    , "kg/m2/s", &
706                  &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
707               CALL histdef( nid_T, "berg_buoy_melt"      , "Buoyancy component of iceberg melt rate"  , "kg/m2/s", &
708                  &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
709               CALL histdef( nid_T, "berg_eros_melt"      , "Erosion component of iceberg melt rate"   , "kg/m2/s", &
710                  &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
711               CALL histdef( nid_T, "berg_conv_melt"      , "Convective component of iceberg melt rate", "kg/m2/s", &
712                  &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
713               CALL histdef( nid_T, "berg_virtual_area"   , "Virtual coverage by icebergs"             , "m2"     , &
714                  &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
715               CALL histdef( nid_T, "bits_src"           , "Mass source of bergy bits"                , "kg/m2/s", &
716                  &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
717               CALL histdef( nid_T, "bits_melt"          , "Melt rate of bergy bits"                  , "kg/m2/s", &
718                  &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
719               CALL histdef( nid_T, "bits_mass"          , "Bergy bit density field"                  , "kg/m2"  , &
720                  &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
721               CALL histdef( nid_T, "berg_mass"           , "Iceberg density field"                    , "kg/m2"  , &
722                  &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
723               CALL histdef( nid_T, "berg_real_calving"   , "Calving into iceberg class"               , "kg/s"   , &
724                  &          jpi, jpj, nh_T, nclasses  , 1, nclasses  , nb_T , 32, clop, zsto, zout )
725            ENDIF
726         ENDIF
727
728         IF( .NOT. ln_cpl ) THEN
729            CALL histdef( nid_T, "sohefldp", "Surface Heat Flux: Damping"         , "W/m2"   ,   &  ! qrp
730               &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
731            CALL histdef( nid_T, "sowafldp", "Surface Water Flux: Damping"        , "Kg/m2/s",   &  ! erp
732               &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
733            CALL histdef( nid_T, "sosafldp", "Surface salt flux: damping"         , "Kg/m2/s",   &  ! erp * sn
734               &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
735         ENDIF
736
737         IF( ln_cpl .AND. nn_ice <= 1 ) THEN
738            CALL histdef( nid_T, "sohefldp", "Surface Heat Flux: Damping"         , "W/m2"   ,   &  ! qrp
739               &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
740            CALL histdef( nid_T, "sowafldp", "Surface Water Flux: Damping"        , "Kg/m2/s",   &  ! erp
741               &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
742            CALL histdef( nid_T, "sosafldp", "Surface salt flux: Damping"         , "Kg/m2/s",   &  ! erp * sn
743               &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
744         ENDIF
745         
746         clmx ="l_max(only(x))"    ! max index on a period
747         CALL histdef( nid_T, "sobowlin", "Bowl Index"                         , "W-point",   &  ! bowl INDEX
748            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clmx, zsto, zout )
749#if defined key_diahth
750         CALL histdef( nid_T, "sothedep", "Thermocline Depth"                  , "m"      ,   & ! hth
751            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
752         CALL histdef( nid_T, "so20chgt", "Depth of 20C isotherm"              , "m"      ,   & ! hd20
753            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
754         CALL histdef( nid_T, "so28chgt", "Depth of 28C isotherm"              , "m"      ,   & ! hd28
755            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
756         CALL histdef( nid_T, "sohtc300", "Heat content 300 m"                 , "W"      ,   & ! htc3
757            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
758#endif
759
760         IF( ln_cpl .AND. nn_ice == 2 ) THEN
761            CALL histdef( nid_T,"soicetem" , "Ice Surface Temperature"            , "K"      ,   &  ! tn_ice
762               &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
763            CALL histdef( nid_T,"soicealb" , "Ice Albedo"                         , "[0,1]"  ,   &  ! alb_ice
764               &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
765         ENDIF
766
767         CALL histend( nid_T, snc4chunks=snc4set )
768
769         !                                                                                      !!! nid_U : 3D
770         CALL histdef( nid_U, "vozocrtx", "Zonal Current"                      , "m/s"    ,   &  ! un
771            &          jpi, jpj, nh_U, ipk, 1, ipk, nz_U, 32, clop, zsto, zout )
772         IF( ln_traldf_gdia ) THEN
773            CALL histdef( nid_U, "vozoeivu", "Zonal EIV Current"                  , "m/s"    ,   &  ! u_eiv
774                 &          jpi, jpj, nh_U, ipk, 1, ipk, nz_U, 32, clop, zsto, zout )
775         ELSE
776#if defined key_diaeiv
777            CALL histdef( nid_U, "vozoeivu", "Zonal EIV Current"                  , "m/s"    ,   &  ! u_eiv
778            &          jpi, jpj, nh_U, ipk, 1, ipk, nz_U, 32, clop, zsto, zout )
779#endif
780         END IF
781         !                                                                                      !!! nid_U : 2D
782         CALL histdef( nid_U, "sozotaux", "Wind Stress along i-axis"           , "N/m2"   ,   &  ! utau
783            &          jpi, jpj, nh_U, 1  , 1, 1  , - 99, 32, clop, zsto, zout )
784
785         CALL histend( nid_U, snc4chunks=snc4set )
786
787         !                                                                                      !!! nid_V : 3D
788         CALL histdef( nid_V, "vomecrty", "Meridional Current"                 , "m/s"    ,   &  ! vn
789            &          jpi, jpj, nh_V, ipk, 1, ipk, nz_V, 32, clop, zsto, zout )
790         IF( ln_traldf_gdia ) THEN
791            CALL histdef( nid_V, "vomeeivv", "Meridional EIV Current"             , "m/s"    ,   &  ! v_eiv
792                 &          jpi, jpj, nh_V, ipk, 1, ipk, nz_V, 32, clop, zsto, zout )
793         ELSE 
794#if defined key_diaeiv
795            CALL histdef( nid_V, "vomeeivv", "Meridional EIV Current"             , "m/s"    ,   &  ! v_eiv
796            &          jpi, jpj, nh_V, ipk, 1, ipk, nz_V, 32, clop, zsto, zout )
797#endif
798         END IF
799         !                                                                                      !!! nid_V : 2D
800         CALL histdef( nid_V, "sometauy", "Wind Stress along j-axis"           , "N/m2"   ,   &  ! vtau
801            &          jpi, jpj, nh_V, 1  , 1, 1  , - 99, 32, clop, zsto, zout )
802
803         CALL histend( nid_V, snc4chunks=snc4set )
804
805         !                                                                                      !!! nid_W : 3D
806         CALL histdef( nid_W, "vovecrtz", "Vertical Velocity"                  , "m/s"    ,   &  ! wn
807            &          jpi, jpj, nh_W, ipk, 1, ipk, nz_W, 32, clop, zsto, zout )
808         IF( ln_traldf_gdia ) THEN
809            CALL histdef( nid_W, "voveeivw", "Vertical EIV Velocity"              , "m/s"    ,   &  ! w_eiv
810                 &          jpi, jpj, nh_W, ipk, 1, ipk, nz_W, 32, clop, zsto, zout )
811         ELSE
812#if defined key_diaeiv
813            CALL histdef( nid_W, "voveeivw", "Vertical EIV Velocity"              , "m/s"    ,   &  ! w_eiv
814                 &          jpi, jpj, nh_W, ipk, 1, ipk, nz_W, 32, clop, zsto, zout )
815#endif
816         END IF
817         CALL histdef( nid_W, "votkeavt", "Vertical Eddy Diffusivity"          , "m2/s"   ,   &  ! avt
818            &          jpi, jpj, nh_W, ipk, 1, ipk, nz_W, 32, clop, zsto, zout )
819         CALL histdef( nid_W, "votkeavm", "Vertical Eddy Viscosity"             , "m2/s"  ,   &  ! avmu
820            &          jpi, jpj, nh_W, ipk, 1, ipk, nz_W, 32, clop, zsto, zout )
821
822         IF( lk_zdfddm ) THEN
823            CALL histdef( nid_W,"voddmavs","Salt Vertical Eddy Diffusivity"    , "m2/s"   ,   &  ! avs
824               &          jpi, jpj, nh_W, ipk, 1, ipk, nz_W, 32, clop, zsto, zout )
825         ENDIF
826         !                                                                                      !!! nid_W : 2D
827#if defined key_traldf_c2d
828         CALL histdef( nid_W, "soleahtw", "lateral eddy diffusivity"           , "m2/s"   ,   &  ! ahtw
829            &          jpi, jpj, nh_W, 1  , 1, 1  , - 99, 32, clop, zsto, zout )
830# if defined key_traldf_eiv 
831            CALL histdef( nid_W, "soleaeiw", "eddy induced vel. coeff. at w-point", "m2/s",   &  ! aeiw
832               &       jpi, jpj, nh_W, 1  , 1, 1  , - 99, 32, clop, zsto, zout )
833# endif
834#endif
835
836         CALL histend( nid_W, snc4chunks=snc4set )
837
838         IF(lwp) WRITE(numout,*)
839         IF(lwp) WRITE(numout,*) 'End of NetCDF Initialization'
840         IF(ll_print) CALL FLUSH(numout )
841
842      ENDIF
843
844      ! 2. Start writing data
845      ! ---------------------
846
847      ! ndex(1) est utilise ssi l'avant dernier argument est different de
848      ! la taille du tableau en sortie. Dans ce cas , l'avant dernier argument
849      ! donne le nombre d'elements, et ndex la liste des indices a sortir
850
851      IF( lwp .AND. MOD( itmod, nwrite ) == 0 ) THEN
852         WRITE(numout,*) 'dia_wri : write model outputs in NetCDF files at ', kt, 'time-step'
853         WRITE(numout,*) '~~~~~~ '
854      ENDIF
855
856      IF( lk_vvl ) THEN
857         CALL histwrite( nid_T, "votemper", it, tsn(:,:,:,jp_tem) * fse3t_n(:,:,:) , ndim_T , ndex_T  )   ! heat content
858         CALL histwrite( nid_T, "vosaline", it, tsn(:,:,:,jp_sal) * fse3t_n(:,:,:) , ndim_T , ndex_T  )   ! salt content
859         CALL histwrite( nid_T, "sosstsst", it, tsn(:,:,1,jp_tem) * fse3t_n(:,:,1) , ndim_hT, ndex_hT )   ! sea surface heat content
860         CALL histwrite( nid_T, "sosaline", it, tsn(:,:,1,jp_sal) * fse3t_n(:,:,1) , ndim_hT, ndex_hT )   ! sea surface salinity content
861      ELSE
862         CALL histwrite( nid_T, "votemper", it, tsn(:,:,:,jp_tem) , ndim_T , ndex_T  )   ! temperature
863         CALL histwrite( nid_T, "vosaline", it, tsn(:,:,:,jp_sal) , ndim_T , ndex_T  )   ! salinity
864         CALL histwrite( nid_T, "sosstsst", it, tsn(:,:,1,jp_tem) , ndim_hT, ndex_hT )   ! sea surface temperature
865         CALL histwrite( nid_T, "sosaline", it, tsn(:,:,1,jp_sal) , ndim_hT, ndex_hT )   ! sea surface salinity
866      ENDIF
867      IF( lk_vvl ) THEN
868         zw3d(:,:,:) = ( ( fse3t_n(:,:,:) - e3t_0(:,:,:) ) / e3t_0(:,:,:) * 100 * tmask(:,:,:) ) ** 2
869         CALL histwrite( nid_T, "vovvle3t", it, fse3t_n (:,:,:) , ndim_T , ndex_T  )   ! level thickness
870         CALL histwrite( nid_T, "vovvldep", it, fsdept_n(:,:,:) , ndim_T , ndex_T  )   ! t-point depth
871         CALL histwrite( nid_T, "vovvldef", it, zw3d             , ndim_T , ndex_T  )   ! level thickness deformation
872      ENDIF
873      CALL histwrite( nid_T, "sossheig", it, sshn          , ndim_hT, ndex_hT )   ! sea surface height
874      CALL histwrite( nid_T, "sowaflup", it, ( emp-rnf )   , ndim_hT, ndex_hT )   ! upward water flux
875      CALL histwrite( nid_T, "sorunoff", it, rnf           , ndim_hT, ndex_hT )   ! river runoffs
876      CALL histwrite( nid_T, "sosfldow", it, sfx           , ndim_hT, ndex_hT )   ! downward salt flux
877                                                                                  ! (includes virtual salt flux beneath ice
878                                                                                  ! in linear free surface case)
879      IF( .NOT. lk_vvl ) THEN
880         zw2d(:,:) = emp (:,:) * tsn(:,:,1,jp_tem)
881         CALL histwrite( nid_T, "sosst_cd", it, zw2d, ndim_hT, ndex_hT )          ! c/d term on sst
882         zw2d(:,:) = emp (:,:) * tsn(:,:,1,jp_sal)
883         CALL histwrite( nid_T, "sosss_cd", it, zw2d, ndim_hT, ndex_hT )          ! c/d term on sss
884      ENDIF
885      CALL histwrite( nid_T, "sohefldo", it, qns + qsr     , ndim_hT, ndex_hT )   ! total heat flux
886      CALL histwrite( nid_T, "soshfldo", it, qsr           , ndim_hT, ndex_hT )   ! solar heat flux
887      CALL histwrite( nid_T, "somixhgt", it, hmld          , ndim_hT, ndex_hT )   ! turbocline depth
888      CALL histwrite( nid_T, "somxl010", it, hmlp          , ndim_hT, ndex_hT )   ! mixed layer depth
889      CALL histwrite( nid_T, "soicecov", it, fr_i          , ndim_hT, ndex_hT )   ! ice fraction   
890      CALL histwrite( nid_T, "sowindsp", it, wndm          , ndim_hT, ndex_hT )   ! wind speed   
891!
892      IF( ln_icebergs ) THEN
893         !
894         CALL histwrite( nid_T, "calving"             , it, berg_grid%calving      , ndim_hT, ndex_hT ) 
895         CALL histwrite( nid_T, "calving_heat"        , it, berg_grid%calving_hflx , ndim_hT, ndex_hT )         
896         CALL histwrite( nid_T, "berg_floating_melt"  , it, berg_grid%floating_melt, ndim_hT, ndex_hT ) 
897         !
898         CALL histwrite( nid_T, "berg_stored_ice"     , it, berg_grid%stored_ice   , ndim_bT, ndex_bT )
899         !
900         IF( ln_bergdia ) THEN
901            CALL histwrite( nid_T, "berg_melt"           , it, berg_melt        , ndim_hT, ndex_hT   ) 
902            CALL histwrite( nid_T, "berg_buoy_melt"      , it, buoy_melt        , ndim_hT, ndex_hT   ) 
903            CALL histwrite( nid_T, "berg_eros_melt"      , it, eros_melt        , ndim_hT, ndex_hT   ) 
904            CALL histwrite( nid_T, "berg_conv_melt"      , it, conv_melt        , ndim_hT, ndex_hT   ) 
905            CALL histwrite( nid_T, "berg_virtual_area"   , it, virtual_area     , ndim_hT, ndex_hT   ) 
906            CALL histwrite( nid_T, "bits_src"            , it, bits_src         , ndim_hT, ndex_hT   ) 
907            CALL histwrite( nid_T, "bits_melt"           , it, bits_melt        , ndim_hT, ndex_hT   ) 
908            CALL histwrite( nid_T, "bits_mass"           , it, bits_mass        , ndim_hT, ndex_hT   ) 
909            CALL histwrite( nid_T, "berg_mass"           , it, berg_mass        , ndim_hT, ndex_hT   ) 
910            !
911            CALL histwrite( nid_T, "berg_real_calving"   , it, real_calving     , ndim_bT, ndex_bT   )
912         ENDIF
913      ENDIF
914
915      IF( .NOT. ln_cpl ) THEN
916         CALL histwrite( nid_T, "sohefldp", it, qrp           , ndim_hT, ndex_hT )   ! heat flux damping
917         CALL histwrite( nid_T, "sowafldp", it, erp           , ndim_hT, ndex_hT )   ! freshwater flux damping
918         IF( ln_ssr ) zw2d(:,:) = erp(:,:) * tsn(:,:,1,jp_sal) * tmask(:,:,1)
919         CALL histwrite( nid_T, "sosafldp", it, zw2d          , ndim_hT, ndex_hT )   ! salt flux damping
920      ENDIF
921      IF( ln_cpl .AND. nn_ice <= 1 ) THEN
922         CALL histwrite( nid_T, "sohefldp", it, qrp           , ndim_hT, ndex_hT )   ! heat flux damping
923         CALL histwrite( nid_T, "sowafldp", it, erp           , ndim_hT, ndex_hT )   ! freshwater flux damping
924         IF( ln_ssr ) zw2d(:,:) = erp(:,:) * tsn(:,:,1,jp_sal) * tmask(:,:,1)
925         CALL histwrite( nid_T, "sosafldp", it, zw2d          , ndim_hT, ndex_hT )   ! salt flux damping
926      ENDIF
927!      zw2d(:,:) = FLOAT( nmln(:,:) ) * tmask(:,:,1)
928!      CALL histwrite( nid_T, "sobowlin", it, zw2d          , ndim_hT, ndex_hT )   ! ???
929
930#if defined key_diahth
931      CALL histwrite( nid_T, "sothedep", it, hth           , ndim_hT, ndex_hT )   ! depth of the thermocline
932      CALL histwrite( nid_T, "so20chgt", it, hd20          , ndim_hT, ndex_hT )   ! depth of the 20 isotherm
933      CALL histwrite( nid_T, "so28chgt", it, hd28          , ndim_hT, ndex_hT )   ! depth of the 28 isotherm
934      CALL histwrite( nid_T, "sohtc300", it, htc3          , ndim_hT, ndex_hT )   ! first 300m heaat content
935#endif
936
937      IF( ln_cpl .AND. nn_ice == 2 ) THEN
938         CALL histwrite( nid_T, "soicetem", it, tn_ice(:,:,1) , ndim_hT, ndex_hT )   ! surf. ice temperature
939         CALL histwrite( nid_T, "soicealb", it, alb_ice(:,:,1), ndim_hT, ndex_hT )   ! ice albedo
940      ENDIF
941
942      CALL histwrite( nid_U, "vozocrtx", it, un            , ndim_U , ndex_U )    ! i-current
943      IF( ln_traldf_gdia ) THEN
944         IF (.not. ALLOCATED(psix_eiv))THEN
945            ALLOCATE( psix_eiv(jpi,jpj,jpk) , psiy_eiv(jpi,jpj,jpk) , STAT=ierr )
946            IF( lk_mpp   )   CALL mpp_sum ( ierr )
947            IF( ierr > 0 )   CALL ctl_stop('STOP', 'diawri: unable to allocate psi{x,y}_eiv')
948            psix_eiv(:,:,:) = 0.0_wp
949            psiy_eiv(:,:,:) = 0.0_wp
950         ENDIF
951         DO jk=1,jpkm1
952            zw3d(:,:,jk) = (psix_eiv(:,:,jk+1) - psix_eiv(:,:,jk))/fse3u(:,:,jk)  ! u_eiv = -dpsix/dz
953         END DO
954         zw3d(:,:,jpk) = 0._wp
955         CALL histwrite( nid_U, "vozoeivu", it, zw3d, ndim_U , ndex_U )           ! i-eiv current
956      ELSE
957#if defined key_diaeiv
958         CALL histwrite( nid_U, "vozoeivu", it, u_eiv, ndim_U , ndex_U )          ! i-eiv current
959#endif
960      ENDIF
961      CALL histwrite( nid_U, "sozotaux", it, utau          , ndim_hU, ndex_hU )   ! i-wind stress
962
963      CALL histwrite( nid_V, "vomecrty", it, vn            , ndim_V , ndex_V  )   ! j-current
964      IF( ln_traldf_gdia ) THEN
965         DO jk=1,jpk-1
966            zw3d(:,:,jk) = (psiy_eiv(:,:,jk+1) - psiy_eiv(:,:,jk))/fse3v(:,:,jk)  ! v_eiv = -dpsiy/dz
967         END DO
968         zw3d(:,:,jpk) = 0._wp
969         CALL histwrite( nid_V, "vomeeivv", it, zw3d, ndim_V , ndex_V )           ! j-eiv current
970      ELSE
971#if defined key_diaeiv
972         CALL histwrite( nid_V, "vomeeivv", it, v_eiv, ndim_V , ndex_V )          ! j-eiv current
973#endif
974      ENDIF
975      CALL histwrite( nid_V, "sometauy", it, vtau          , ndim_hV, ndex_hV )   ! j-wind stress
976
977      CALL histwrite( nid_W, "vovecrtz", it, wn             , ndim_T, ndex_T )    ! vert. current
978      IF( ln_traldf_gdia ) THEN
979         DO jk=1,jpk-1
980            DO jj = 2, jpjm1
981               DO ji = fs_2, fs_jpim1  ! vector opt.
982                  zw3d(ji,jj,jk) = (psiy_eiv(ji,jj,jk) - psiy_eiv(ji,jj-1,jk))/e2v(ji,jj) + &
983                       &    (psix_eiv(ji,jj,jk) - psix_eiv(ji-1,jj,jk))/e1u(ji,jj) ! w_eiv = dpsiy/dy + dpsiy/dx
984               END DO
985            END DO
986         END DO
987         zw3d(:,:,jpk) = 0._wp
988         CALL histwrite( nid_W, "voveeivw", it, zw3d          , ndim_T, ndex_T )    ! vert. eiv current
989      ELSE
990#   if defined key_diaeiv
991         CALL histwrite( nid_W, "voveeivw", it, w_eiv          , ndim_T, ndex_T )    ! vert. eiv current
992#   endif
993      ENDIF
994      CALL histwrite( nid_W, "votkeavt", it, avt            , ndim_T, ndex_T )    ! T vert. eddy diff. coef.
995      CALL histwrite( nid_W, "votkeavm", it, avmu           , ndim_T, ndex_T )    ! T vert. eddy visc. coef.
996      IF( lk_zdfddm ) THEN
997         CALL histwrite( nid_W, "voddmavs", it, fsavs(:,:,:), ndim_T, ndex_T )    ! S vert. eddy diff. coef.
998      ENDIF
999#if defined key_traldf_c2d
1000      CALL histwrite( nid_W, "soleahtw", it, ahtw          , ndim_hT, ndex_hT )   ! lateral eddy diff. coef.
1001# if defined key_traldf_eiv
1002         CALL histwrite( nid_W, "soleaeiw", it, aeiw       , ndim_hT, ndex_hT )   ! EIV coefficient at w-point
1003# endif
1004#endif
1005
1006      ! 3. Close all files
1007      ! ---------------------------------------
1008      IF( kt == nitend ) THEN
1009         CALL histclo( nid_T )
1010         CALL histclo( nid_U )
1011         CALL histclo( nid_V )
1012         CALL histclo( nid_W )
1013      ENDIF
1014      !
1015      CALL wrk_dealloc( jpi , jpj      , zw2d )
1016      IF ( ln_traldf_gdia .OR. lk_vvl )  call wrk_dealloc( jpi , jpj , jpk  , zw3d )
1017      !
1018      IF( nn_timing == 1 )   CALL timing_stop('dia_wri')
1019      !
1020      IF (lhook) CALL dr_hook(RoutineName,zhook_out,zhook_handle)
1021   END SUBROUTINE dia_wri
1022# endif
1023
1024#endif
1025
1026   SUBROUTINE dia_wri_state( cdfile_name, kt )
1027      !!---------------------------------------------------------------------
1028      !!                 ***  ROUTINE dia_wri_state  ***
1029      !!       
1030      !! ** Purpose :   create a NetCDF file named cdfile_name which contains
1031      !!      the instantaneous ocean state and forcing fields.
1032      !!        Used to find errors in the initial state or save the last
1033      !!      ocean state in case of abnormal end of a simulation
1034      !!
1035      !! ** Method  :   NetCDF files using ioipsl
1036      !!      File 'output.init.nc'  is created if ninist = 1 (namelist)
1037      !!      File 'output.abort.nc' is created in case of abnormal job end
1038      !!----------------------------------------------------------------------
1039      CHARACTER (len=* ), INTENT( in ) ::   cdfile_name      ! name of the file created
1040      INTEGER           , INTENT( in ) ::   kt               ! ocean time-step index
1041      !!
1042      CHARACTER (len=32) :: clname
1043      CHARACTER (len=40) :: clop
1044      INTEGER  ::   id_i , nz_i, nh_i       
1045      INTEGER, DIMENSION(1) ::   idex             ! local workspace
1046      REAL(wp) ::   zsto, zout, zmax, zjulian, zdt
1047      INTEGER(KIND=jpim), PARAMETER :: zhook_in = 0
1048      INTEGER(KIND=jpim), PARAMETER :: zhook_out = 1
1049      REAL(KIND=jprb)               :: zhook_handle
1050
1051      CHARACTER(LEN=*), PARAMETER :: RoutineName='DIA_WRI_STATE'
1052
1053      IF (lhook) CALL dr_hook(RoutineName,zhook_in,zhook_handle)
1054
1055      !!----------------------------------------------------------------------
1056      !
1057!     IF( nn_timing == 1 )   CALL timing_start('dia_wri_state') ! not sure this works for routines not called in first timestep
1058
1059      ! 0. Initialisation
1060      ! -----------------
1061
1062      ! Define name, frequency of output and means
1063      clname = cdfile_name
1064      IF( .NOT. Agrif_Root() ) clname = TRIM(Agrif_CFixed())//'_'//TRIM(clname)
1065      zdt  = rdt
1066      zsto = rdt
1067      clop = "inst(x)"           ! no use of the mask value (require less cpu time)
1068      zout = rdt
1069      zmax = ( nitend - nit000 + 1 ) * zdt
1070
1071      IF(lwp) WRITE(numout,*)
1072      IF(lwp) WRITE(numout,*) 'dia_wri_state : single instantaneous ocean state'
1073      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~   and forcing fields file created '
1074      IF(lwp) WRITE(numout,*) '                and named :', clname, '.nc'
1075
1076
1077      ! 1. Define NETCDF files and fields at beginning of first time step
1078      ! -----------------------------------------------------------------
1079
1080      ! Compute julian date from starting date of the run
1081      CALL ymds2ju( nyear, nmonth, nday, rdt, zjulian )         ! time axis
1082      zjulian = zjulian - adatrj   !   set calendar origin to the beginning of the experiment
1083      CALL histbeg( clname, jpi, glamt, jpj, gphit,   &
1084          1, jpi, 1, jpj, nit000-1, zjulian, zdt, nh_i, id_i, domain_id=nidom, snc4chunks=snc4set ) ! Horizontal grid : glamt and gphit
1085      CALL histvert( id_i, "deptht", "Vertical T levels",   &    ! Vertical grid : gdept
1086          "m", jpk, gdept_1d, nz_i, "down")
1087
1088      ! Declare all the output fields as NetCDF variables
1089
1090      CALL histdef( id_i, "vosaline", "Salinity"              , "PSU"    ,   &   ! salinity
1091         &          jpi, jpj, nh_i, jpk, 1, jpk, nz_i, 32, clop, zsto, zout )
1092      CALL histdef( id_i, "votemper", "Temperature"           , "C"      ,   &   ! temperature
1093         &          jpi, jpj, nh_i, jpk, 1, jpk, nz_i, 32, clop, zsto, zout )
1094      CALL histdef( id_i, "sossheig", "Sea Surface Height"    , "m"      ,   &  ! ssh
1095         &          jpi, jpj, nh_i, 1  , 1, 1  , nz_i, 32, clop, zsto, zout )
1096      CALL histdef( id_i, "vozocrtx", "Zonal Current"         , "m/s"    ,   &   ! zonal current
1097         &          jpi, jpj, nh_i, jpk, 1, jpk, nz_i, 32, clop, zsto, zout )
1098      CALL histdef( id_i, "vomecrty", "Meridional Current"    , "m/s"    ,   &   ! meridonal current
1099         &          jpi, jpj, nh_i, jpk, 1, jpk, nz_i, 32, clop, zsto, zout ) 
1100      CALL histdef( id_i, "vovecrtz", "Vertical Velocity"     , "m/s"    ,   &   ! vertical current
1101         &          jpi, jpj, nh_i, jpk, 1, jpk, nz_i, 32, clop, zsto, zout ) 
1102      CALL histdef( id_i, "sowaflup", "Net Upward Water Flux" , "Kg/m2/S",   &   ! net freshwater
1103         &          jpi, jpj, nh_i, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
1104      CALL histdef( id_i, "sohefldo", "Net Downward Heat Flux", "W/m2"   ,   &   ! net heat flux
1105         &          jpi, jpj, nh_i, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
1106      CALL histdef( id_i, "soshfldo", "Shortwave Radiation"   , "W/m2"   ,   &   ! solar flux
1107         &          jpi, jpj, nh_i, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
1108      CALL histdef( id_i, "soicecov", "Ice fraction"          , "[0,1]"  ,   &   ! fr_i
1109         &          jpi, jpj, nh_i, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
1110      CALL histdef( id_i, "sozotaux", "Zonal Wind Stress"     , "N/m2"   ,   &   ! i-wind stress
1111         &          jpi, jpj, nh_i, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
1112      CALL histdef( id_i, "sometauy", "Meridional Wind Stress", "N/m2"   ,   &   ! j-wind stress
1113         &          jpi, jpj, nh_i, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
1114      IF( lk_vvl ) THEN
1115         CALL histdef( id_i, "vovvldep", "T point depth"         , "m"      ,   &   ! t-point depth
1116            &          jpi, jpj, nh_i, jpk, 1, jpk, nz_i, 32, clop, zsto, zout )
1117         CALL histdef( id_i, "vovvle3t", "T point thickness"         , "m"      ,   &   ! t-point depth
1118            &          jpi, jpj, nh_i, jpk, 1, jpk, nz_i, 32, clop, zsto, zout )
1119      END IF
1120
1121#if defined key_lim2
1122      CALL lim_wri_state_2( kt, id_i, nh_i )
1123#elif defined key_lim3
1124      CALL lim_wri_state( kt, id_i, nh_i )
1125#else
1126      CALL histend( id_i, snc4chunks=snc4set )
1127#endif
1128
1129      ! 2. Start writing data
1130      ! ---------------------
1131      ! idex(1) est utilise ssi l'avant dernier argument est diffferent de
1132      ! la taille du tableau en sortie. Dans ce cas , l'avant dernier argument
1133      ! donne le nombre d'elements, et idex la liste des indices a sortir
1134      idex(1) = 1   ! init to avoid compil warning
1135
1136      ! Write all fields on T grid
1137      CALL histwrite( id_i, "votemper", kt, tsn(:,:,:,jp_tem), jpi*jpj*jpk, idex )    ! now temperature
1138      CALL histwrite( id_i, "vosaline", kt, tsn(:,:,:,jp_sal), jpi*jpj*jpk, idex )    ! now salinity
1139      CALL histwrite( id_i, "sossheig", kt, sshn             , jpi*jpj    , idex )    ! sea surface height
1140      CALL histwrite( id_i, "vozocrtx", kt, un               , jpi*jpj*jpk, idex )    ! now i-velocity
1141      CALL histwrite( id_i, "vomecrty", kt, vn               , jpi*jpj*jpk, idex )    ! now j-velocity
1142      CALL histwrite( id_i, "vovecrtz", kt, wn               , jpi*jpj*jpk, idex )    ! now k-velocity
1143      CALL histwrite( id_i, "sowaflup", kt, (emp-rnf )       , jpi*jpj    , idex )    ! freshwater budget
1144      CALL histwrite( id_i, "sohefldo", kt, qsr + qns        , jpi*jpj    , idex )    ! total heat flux
1145      CALL histwrite( id_i, "soshfldo", kt, qsr              , jpi*jpj    , idex )    ! solar heat flux
1146      CALL histwrite( id_i, "soicecov", kt, fr_i             , jpi*jpj    , idex )    ! ice fraction
1147      CALL histwrite( id_i, "sozotaux", kt, utau             , jpi*jpj    , idex )    ! i-wind stress
1148      CALL histwrite( id_i, "sometauy", kt, vtau             , jpi*jpj    , idex )    ! j-wind stress
1149      IF( lk_vvl ) THEN
1150         CALL histwrite( id_i, "vovvldep", kt, fsdept_n(:,:,:), jpi*jpj*jpk, idex )!  T-cell depth       
1151         CALL histwrite( id_i, "vovvle3t", kt, fse3t_n (:,:,:), jpi*jpj*jpk, idex )!  T-cell thickness 
1152      END IF
1153
1154      ! 3. Close the file
1155      ! -----------------
1156      CALL histclo( id_i )
1157#if ! defined key_iomput && ! defined key_dimgout
1158      IF( ninist /= 1  ) THEN
1159         CALL histclo( nid_T )
1160         CALL histclo( nid_U )
1161         CALL histclo( nid_V )
1162         CALL histclo( nid_W )
1163      ENDIF
1164#endif
1165
1166      IF (cdfile_name == "output.abort") THEN
1167         CALL ctl_stop('MPPSTOP', 'NEMO abort from dia_wri_state')
1168      END IF
1169       
1170!     IF( nn_timing == 1 )   CALL timing_stop('dia_wri_state') ! not sure this works for routines not called in first timestep
1171      !
1172
1173      IF (lhook) CALL dr_hook(RoutineName,zhook_out,zhook_handle)
1174   END SUBROUTINE dia_wri_state
1175   !!======================================================================
1176END MODULE diawri
Note: See TracBrowser for help on using the repository browser.