New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
diawri.F90 in branches/UKMO/dev_r5518_GO6_package_XIOS_read/NEMOGCM/NEMO/OPA_SRC/DIA – NEMO

source: branches/UKMO/dev_r5518_GO6_package_XIOS_read/NEMOGCM/NEMO/OPA_SRC/DIA/diawri.F90 @ 8243

Last change on this file since 8243 was 8161, checked in by andmirek, 7 years ago

few small bug fixes and support for Agrif restart read

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