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.
limwri.F90 in branches/2016/v3_6_CMIP6_ice_diagnostics/NEMOGCM/NEMO/LIM_SRC_3 – NEMO

source: branches/2016/v3_6_CMIP6_ice_diagnostics/NEMOGCM/NEMO/LIM_SRC_3/limwri.F90 @ 8175

Last change on this file since 8175 was 8175, checked in by vancop, 7 years ago

Final commit SIMIP outputs, phase 2

  • Property svn:keywords set to Id
File size: 29.8 KB
Line 
1MODULE limwri
2   !!======================================================================
3   !!                     ***  MODULE  limwri  ***
4   !!         Ice diagnostics :  write ice output files
5   !!======================================================================
6#if defined key_lim3
7   !!----------------------------------------------------------------------
8   !!   'key_lim3'                                      LIM3 sea-ice model
9   !!----------------------------------------------------------------------
10   !!   lim_wri      : write of the diagnostics variables in ouput file
11   !!   lim_wri_state : write for initial state or/and abandon
12   !!----------------------------------------------------------------------
13   USE ioipsl
14   USE dianam          ! build name of file (routine)
15   USE phycst
16   USE dom_oce
17   USE sbc_oce         ! Surface boundary condition: ocean fields
18   USE sbc_ice         ! Surface boundary condition: ice fields
19   USE ice
20   USE dom_ice
21   USE limvar
22   USE in_out_manager
23   USE lbclnk
24   USE lib_mpp         ! MPP library
25   USE wrk_nemo        ! work arrays
26   USE iom
27   USE timing          ! Timing
28   USE lib_fortran     ! Fortran utilities
29
30   IMPLICIT NONE
31   PRIVATE
32
33   PUBLIC lim_wri        ! routine called by lim_step.F90
34   PUBLIC lim_wri_state  ! called by dia_wri_state
35
36   !!----------------------------------------------------------------------
37   !! NEMO/LIM3 4.0 , UCL - NEMO Consortium (2011)
38   !! $Id$
39   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
40   !!----------------------------------------------------------------------
41CONTAINS
42
43   SUBROUTINE lim_wri( kindic )
44      !!-------------------------------------------------------------------
45      !!  This routine computes the average of some variables and write it
46      !!  on the ouput files.
47      !!  ATTENTION cette routine n'est valable que si le pas de temps est
48      !!  egale a une fraction entiere de 1 jours.
49      !!  Diff 1-D 3-D : suppress common also included in etat
50      !!                 suppress cmoymo 11-18
51      !!  modif : 03/06/98
52      !!-------------------------------------------------------------------
53      INTEGER, INTENT(in) ::   kindic   ! if kindic < 0 there has been an error somewhere
54      !
55      INTEGER  ::  ii, ji, jj, jk, jl  ! dummy loop indices
56      REAL(wp) ::  z2da, z2db, ztmp, zrho1, zrho2
57      REAL(wp), POINTER, DIMENSION(:,:,:) ::  zswi2
58      REAL(wp), POINTER, DIMENSION(:,:)   ::  z2d, zswi    ! 2D workspace
59      REAL(wp), POINTER, DIMENSION(:,:)   ::  zfb          ! ice freeboard
60      REAL(wp), POINTER, DIMENSION(:,:)   ::  zamask, zamask15 ! 15% concentration mask
61
62      ! Global ice diagnostics (SIMIP)
63      REAL(wp) ::  zdiag_area_nh, &   ! area, extent, volume
64         &         zdiag_extt_nh, &
65         &         zdiag_area_sh, & 
66         &         zdiag_extt_sh, & 
67         &         zdiag_volu_nh, & 
68         &         zdiag_volu_sh 
69
70      !!-------------------------------------------------------------------
71
72      IF( nn_timing == 1 )  CALL timing_start('limwri')
73
74      CALL wrk_alloc( jpi, jpj, jpl, zswi2 )
75      CALL wrk_alloc( jpi, jpj     , z2d, zswi )
76      CALL wrk_alloc( jpi, jpj     , zfb, zamask, zamask15 )
77
78      !-----------------------------
79      ! Mean category values
80      !-----------------------------
81
82      ! brine volume
83      CALL lim_var_bv 
84
85      ! tresholds for outputs
86      DO jj = 1, jpj
87         DO ji = 1, jpi
88            zswi(ji,jj)  = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi06 ) ) ! 1 if ice, 0 if no ice
89         END DO
90      END DO
91      DO jj = 1, jpj
92         DO ji = 1, jpi
93            zamask(ji,jj)  = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - 0.05 ) )   ! 1 if 5% ice, 0 if less - required to mask thickness and snow depth
94            zamask15(ji,jj)  = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - 0.15 ) ) ! 1 if 15% ice, 0 if less
95         END DO
96      END DO
97      DO jl = 1, jpl
98         DO jj = 1, jpj
99            DO ji = 1, jpi
100               zswi2(ji,jj,jl)  = MAX( 0._wp , SIGN( 1._wp , a_i(ji,jj,jl) - epsi06 ) )
101            END DO
102         END DO
103      END DO
104      !
105      ! fluxes
106      ! pfrld is the lead fraction at the previous time step (actually between TRP and THD)
107      IF( iom_use('qsr_oce') )   CALL iom_put( "qsr_oce" , qsr_oce(:,:) * pfrld(:,:) )                                   !     solar flux at ocean surface
108      IF( iom_use('qns_oce') )   CALL iom_put( "qns_oce" , qns_oce(:,:) * pfrld(:,:) + qemp_oce(:,:) )                   ! non-solar flux at ocean surface
109      IF( iom_use('qsr_ice') )   CALL iom_put( "qsr_ice" , SUM( qsr_ice(:,:,:) * a_i_b(:,:,:), dim=3 ) )                 !     solar flux at ice surface
110      IF( iom_use('qns_ice') )   CALL iom_put( "qns_ice" , SUM( qns_ice(:,:,:) * a_i_b(:,:,:), dim=3 ) + qemp_ice(:,:) ) ! non-solar flux at ice surface
111      IF( iom_use('qtr_ice') )   CALL iom_put( "qtr_ice" , SUM( ftr_ice(:,:,:) * a_i_b(:,:,:), dim=3 ) )                 !     solar flux transmitted thru ice
112      IF( iom_use('qt_oce' ) )   CALL iom_put( "qt_oce"  , ( qsr_oce(:,:) + qns_oce(:,:) ) * pfrld(:,:) + qemp_oce(:,:) ) 
113      IF( iom_use('qt_ice' ) )   CALL iom_put( "qt_ice"  , SUM( ( qns_ice(:,:,:) + qsr_ice(:,:,:) )   &
114         &                                                      * a_i_b(:,:,:),dim=3 ) + qemp_ice(:,:) )
115      IF( iom_use('qemp_oce') )  CALL iom_put( "qemp_oce" , qemp_oce(:,:) ) 
116      IF( iom_use('qemp_ice') )  CALL iom_put( "qemp_ice" , qemp_ice(:,:) ) 
117      IF( iom_use('emp_oce' ) )  CALL iom_put( "emp_oce"  , emp_oce(:,:) )   !emp over ocean (taking into account the snow blown away from the ice)
118      IF( iom_use('emp_ice' ) )  CALL iom_put( "emp_ice"  , emp_ice(:,:) )   !emp over ice   (taking into account the snow blown away from the ice)
119
120      ! velocity
121      IF ( iom_use( "uice_ipa" ) .OR. iom_use( "vice_ipa" ) .OR. iom_use( "icevel" ) ) THEN
122         DO jj = 2 , jpjm1
123            DO ji = 2 , jpim1
124               z2da  = ( u_ice(ji,jj) * umask(ji,jj,1) + u_ice(ji-1,jj) * umask(ji-1,jj,1) ) * 0.5_wp
125               z2db  = ( v_ice(ji,jj) * vmask(ji,jj,1) + v_ice(ji,jj-1) * vmask(ji,jj-1,1) ) * 0.5_wp
126               z2d(ji,jj) = SQRT( z2da * z2da + z2db * z2db )
127           END DO
128         END DO
129         CALL lbc_lnk( z2d, 'T', 1. )
130         CALL iom_put( "uice_ipa"     , u_ice      )       ! ice velocity u component
131         CALL iom_put( "vice_ipa"     , v_ice      )       ! ice velocity v component
132         CALL iom_put( "icevel"       , z2d        )       ! ice velocity module
133      ENDIF
134      !
135      IF ( iom_use( "miceage" ) )       CALL iom_put( "miceage"     , om_i * zswi * zamask15 )  ! mean ice age
136      IF ( iom_use( "micet" ) )         CALL iom_put( "micet"       , ( tm_i  - rt0 ) * zswi )  ! ice mean    temperature
137      IF ( iom_use( "icest" ) )         CALL iom_put( "icest"       , ( tm_su - rt0 ) * zswi )  ! ice surface temperature
138      IF ( iom_use( "icecolf" ) )       CALL iom_put( "icecolf"     , hicol                  )  ! frazil ice collection thickness
139      !
140      CALL iom_put( "isst"        , sst_m               )        ! sea surface temperature
141      CALL iom_put( "isss"        , sss_m               )        ! sea surface salinity
142      CALL iom_put( "iceconc"     , at_i  * zswi        )        ! ice concentration
143      CALL iom_put( "icevolu"     , vt_i  * zswi        )        ! ice volume = mean ice thickness over the cell
144      CALL iom_put( "icehc"       , et_i  * zswi        )        ! ice total heat content
145      CALL iom_put( "isnowhc"     , et_s  * zswi        )        ! snow total heat content
146      CALL iom_put( "ibrinv"      , bvm_i * zswi * 100. )        ! brine volume
147      CALL iom_put( "utau_ice"    , utau_ice*zswi       )        ! wind stress over ice along i-axis at I-point
148      CALL iom_put( "vtau_ice"    , vtau_ice*zswi       )        ! wind stress over ice along j-axis at I-point
149      CALL iom_put( "snowpre"     , sprecip * 86400.    )        ! snow precipitation
150      CALL iom_put( "micesalt"    , smt_i   * zswi      )        ! mean ice salinity
151
152      CALL iom_put( "icestr"      , strength * zswi )            ! ice strength
153      CALL iom_put( "idive"       , divu_i              )        ! divergence
154      CALL iom_put( "ishear"      , shear_i             )        ! shear
155      CALL iom_put( "snowvol"     , vt_s   * zswi       )        ! snow volume
156     
157      CALL iom_put( "icetrp"      , diag_trp_vi * rday  )        ! ice volume transport
158      CALL iom_put( "snwtrp"      , diag_trp_vs * rday  )        ! snw volume transport
159      CALL iom_put( "saltrp"      , diag_trp_smv * rday * rhoic ) ! salt content transport
160      CALL iom_put( "deitrp"      , diag_trp_ei         )        ! advected ice enthalpy (W/m2)
161      CALL iom_put( "destrp"      , diag_trp_es         )        ! advected snw enthalpy (W/m2)
162
163      CALL iom_put( "sfxbog"      , sfx_bog * rday      )        ! salt flux from bottom growth
164      CALL iom_put( "sfxbom"      , sfx_bom * rday      )        ! salt flux from bottom melting
165      CALL iom_put( "sfxsum"      , sfx_sum * rday      )        ! salt flux from surface melting
166      CALL iom_put( "sfxsni"      , sfx_sni * rday      )        ! salt flux from snow ice formation
167      CALL iom_put( "sfxopw"      , sfx_opw * rday      )        ! salt flux from open water formation
168      CALL iom_put( "sfxdyn"      , sfx_dyn * rday      )        ! salt flux from ridging rafting
169      CALL iom_put( "sfxres"      , sfx_res * rday      )        ! salt flux from limupdate (resultant)
170      CALL iom_put( "sfxbri"      , sfx_bri * rday      )        ! salt flux from brines
171      CALL iom_put( "sfxsub"      , sfx_sub * rday      )        ! salt flux from sublimation
172      CALL iom_put( "sfx"         , sfx     * rday      )        ! total salt flux
173
174      ztmp = rday / rhoic
175      CALL iom_put( "vfxres"     , wfx_res * ztmp       )        ! daily prod./melting due to limupdate
176      CALL iom_put( "vfxopw"     , wfx_opw * ztmp       )        ! daily lateral thermodynamic ice production
177      CALL iom_put( "vfxsni"     , wfx_sni * ztmp       )        ! daily snowice ice production
178      CALL iom_put( "vfxbog"     , wfx_bog * ztmp       )        ! daily bottom thermodynamic ice production
179      CALL iom_put( "vfxdyn"     , wfx_dyn * ztmp       )        ! daily dynamic ice production (rid/raft)
180      CALL iom_put( "vfxsum"     , wfx_sum * ztmp       )        ! surface melt
181      CALL iom_put( "vfxbom"     , wfx_bom * ztmp       )        ! bottom melt
182      CALL iom_put( "vfxice"     , wfx_ice * ztmp       )        ! total ice growth/melt
183
184      IF ( iom_use( "vfxthin" ) ) THEN   ! ice production for open water + thin ice (<20cm) => comparable to observations 
185         WHERE( htm_i(:,:) < 0.2 .AND. htm_i(:,:) > 0. ) ; z2d = wfx_bog
186         ELSEWHERE                                       ; z2d = 0._wp
187         END WHERE
188         CALL iom_put( "vfxthin", ( wfx_opw + z2d ) * ztmp )
189      ENDIF
190
191      ztmp = rday / rhosn
192      CALL iom_put( "vfxspr"     , wfx_spr * ztmp       )        ! precip (snow)
193      CALL iom_put( "vfxsnw"     , wfx_snw * ztmp       )        ! total snw growth/melt
194      CALL iom_put( "vfxsub"     , wfx_sub * ztmp       )        ! sublimation (snow/ice)
195      CALL iom_put( "vfxsub_err" , wfx_err_sub * ztmp   )        ! "excess" of sublimation sent to ocean     
196 
197      CALL iom_put( "afxtot"     , afx_tot              )        ! concentration tendency (total)
198      CALL iom_put( "afxdyn"     , afx_dyn              )        ! concentration tendency (dynamics)
199      CALL iom_put( "afxthd"     , afx_thd              )        ! concentration tendency (thermo)
200
201      CALL iom_put ('hfxthd'     , hfx_thd(:,:)         )   
202      CALL iom_put ('hfxdyn'     , hfx_dyn(:,:)         )   
203      CALL iom_put ('hfxres'     , hfx_res(:,:)         )   
204      CALL iom_put ('hfxout'     , hfx_out(:,:)         )   
205      CALL iom_put ('hfxin'      , hfx_in(:,:)          )   
206      CALL iom_put ('hfxsnw'     , hfx_snw(:,:)         )   
207      CALL iom_put ('hfxsub'     , hfx_sub(:,:)         )   
208      CALL iom_put ('hfxerr'     , hfx_err(:,:)         )   
209      CALL iom_put ('hfxerr_rem' , hfx_err_rem(:,:)     )   
210     
211      CALL iom_put ('hfxsum'     , hfx_sum(:,:)         )   
212      CALL iom_put ('hfxbom'     , hfx_bom(:,:)         )   
213      CALL iom_put ('hfxbog'     , hfx_bog(:,:)         )   
214      CALL iom_put ('hfxdif'     , hfx_dif(:,:)         )   
215      CALL iom_put ('hfxopw'     , hfx_opw(:,:)         )   
216      CALL iom_put ('hfxtur'     , fhtur(:,:) * SUM( a_i_b(:,:,:), dim=3 ) ) ! turbulent heat flux at ice base
217      CALL iom_put ('hfxdhc'     , diag_heat(:,:)       )   ! Heat content variation in snow and ice
218      CALL iom_put ('hfxspr'     , hfx_spr(:,:)         )   ! Heat content of snow precip
219
220      !----------------------------------
221      ! Output category-dependent fields
222      !----------------------------------
223      IF ( iom_use( "iceconc_cat"  ) )  CALL iom_put( "iceconc_cat"      , a_i   * zswi2   )        ! area for categories
224      IF ( iom_use( "icethic_cat"  ) )  CALL iom_put( "icethic_cat"      , ht_i  * zswi2   )        ! thickness for categories
225      IF ( iom_use( "snowthic_cat" ) )  CALL iom_put( "snowthic_cat"     , ht_s  * zswi2   )        ! snow depth for categories
226      IF ( iom_use( "salinity_cat" ) )  CALL iom_put( "salinity_cat"     , sm_i  * zswi2   )        ! salinity for categories
227      ! ice temperature
228      IF ( iom_use( "icetemp_cat"  ) )  CALL iom_put( "icetemp_cat", ( SUM( t_i(:,:,:,:), dim=3 ) * r1_nlay_i - rt0 ) * zswi2 )
229      ! snow temperature
230      IF ( iom_use( "snwtemp_cat"  ) )  CALL iom_put( "snwtemp_cat", ( SUM( t_s(:,:,:,:), dim=3 ) * r1_nlay_s - rt0 ) * zswi2 )
231      ! ice age
232      IF ( iom_use( "iceage_cat"   ) )  CALL iom_put( "iceage_cat" , o_i * zswi2 ) 
233      ! brine volume
234      IF ( iom_use( "brinevol_cat" ) )  CALL iom_put( "brinevol_cat", bv_i * 100. * zswi2 )
235
236      !--------------------------------
237      ! Add-ons for SIMIP
238      !--------------------------------
239      zrho1 = ( rau0 - rhoic ) / rau0; zrho2 = rhosn / rau0
240
241      IF  ( iom_use( "icethic"  ) ) CALL iom_put( "icethic"     , htm_i * zamask             )          ! Ice thickness
242      IF  ( iom_use( "icepres"  ) ) CALL iom_put( "icepres"     , zswi                       )          ! Ice presence (1 or 0)
243      IF  ( iom_use( "snowthic" ) ) CALL iom_put( "snowthic"    , htm_s * zamask             )          ! Snow thickness       
244      IF  ( iom_use( "icemass"  ) ) CALL iom_put( "icemass"     , rhoic * vt_i(:,:) * zswi   )          ! Ice mass per cell area
245      IF  ( iom_use( "snomass"  ) ) CALL iom_put( "snomass"     , rhosn * vt_s(:,:) * zswi   )          ! Snow mass per cell area
246      IF  ( iom_use( "icesnt"   ) ) CALL iom_put( "icesnt"      , ( tm_si - rt0 ) * zswi     )          ! Snow-ice interface temperature
247      IF  ( iom_use( "icebot"   ) ) CALL iom_put( "icebot"      , ( t_bo  - rt0 ) * zswi     )          ! Ice bottom temperature
248      IF  ( iom_use( "icesmass" ) ) CALL iom_put( "icesmass"    , SUM( smv_i, DIM = 3 ) * rhoic * 1.0e-3 * zswi )   ! Mass of salt in sea ice per cell area
249      IF  ( iom_use( "icefb"    ) ) THEN
250         zfb(:,:) = ( zrho1 * htm_i(:,:) - zrho2 * htm_s(:,:) ) * zswi(:,:)                             
251         WHERE( zfb < 0._wp ) ;   zfb = 0._wp ;   END WHERE
252                                    CALL iom_put( "icefb"       , zfb                        )          ! Ice freeboard
253      ENDIF
254      IF  ( iom_use( "dmithd"   ) ) CALL iom_put( "dmithd"      , - wfx_bog - wfx_bom - wfx_sum   &     ! Sea-ice mass change from thermodynamics
255              &                     - wfx_sni - wfx_opw - wfx_res )
256      IF  ( iom_use( "dmidyn"   ) ) CALL iom_put( "dmidyn"      ,   diag_dmi_dyn             )          ! Sea-ice mass change from dynamics
257      IF  ( iom_use( "dmiopw"   ) ) CALL iom_put( "dmiopw"      , - wfx_opw                  )          ! Sea-ice mass change through growth in open water
258      IF  ( iom_use( "dmibog"   ) ) CALL iom_put( "dmibog"      , - wfx_bog                  )          ! Sea-ice mass change through basal growth
259      IF  ( iom_use( "dmisni"   ) ) CALL iom_put( "dmisni"      , - wfx_sni                  )          ! Sea-ice mass change through snow-to-ice conversion
260      IF  ( iom_use( "dmisum"   ) ) CALL iom_put( "dmisum"      , - wfx_sum                  )          ! Sea-ice mass change through surface melting
261      IF  ( iom_use( "dmibom"   ) ) CALL iom_put( "dmibom"      , - wfx_bom                  )          ! Sea-ice mass change through bottom melting
262
263      IF  ( iom_use( "dmtsub"   ) ) CALL iom_put( "dmtsub"      , - wfx_sub                  )          ! Sea-ice mass change through evaporation and sublimation
264      IF  ( iom_use( "dmssub"   ) ) CALL iom_put( "dmssub"      , - wfx_snw_sub              )          ! Snow mass change through sublimation
265      IF  ( iom_use( "dmisub"   ) ) CALL iom_put( "dmisub"      , - wfx_ice_sub              )          ! Sea-ice mass change through sublimation
266
267      IF  ( iom_use( "dmsspr"   ) ) CALL iom_put( "dmsspr"      , - wfx_spr                  )          ! Snow mass change through snow fall
268      IF  ( iom_use( "dmsssi"   ) ) CALL iom_put( "dmsssi"      ,   wfx_sni*rhosn/rhoic      )          ! Snow mass change through snow-to-ice conversion
269
270      IF  ( iom_use( "dmsmel"   ) ) CALL iom_put( "dmsmel"      , - wfx_snw_sum              )          ! Snow mass change through melt
271      IF  ( iom_use( "dmsdyn"   ) ) CALL iom_put( "dmsdyn"      ,   diag_dms_dyn             )          ! Snow mass change through dynamics
272
273      IF  ( iom_use( "hfxconbo" ) ) CALL iom_put( "hfxconbo"    ,   diag_fc_bo               )          ! Bottom conduction flux
274      IF  ( iom_use( "hfxconsu" ) ) CALL iom_put( "hfxconsu"    ,   diag_fc_su               )          ! Surface conduction flux
275
276      IF  ( iom_use( "wfxtot"   ) ) CALL iom_put( "wfxtot"      ,   wfx_ice                  )          ! Total freshwater flux from sea ice
277      IF  ( iom_use( "wfxsum"   ) ) CALL iom_put( "wfxsum"      ,   wfx_sum                  )          ! Freshwater flux from sea-ice surface
278
279      IF  ( iom_use( "utau_oi"  ) ) CALL iom_put( "utau_oi"     ,   diag_utau_oi*zswi        )          ! X-component of ocean stress on sea ice
280      IF  ( iom_use( "vtau_oi"  ) ) CALL iom_put( "vtau_oi"     ,   diag_vtau_oi*zswi        )          ! Y-component of ocean stress on sea ice
281
282      IF  ( iom_use( "dssh_dx"  ) ) CALL iom_put( "dssh_dx"     ,   diag_dssh_dx*zswi        )          ! Sea-surface tilt term in force balance (x-component)
283      IF  ( iom_use( "dssh_dy"  ) ) CALL iom_put( "dssh_dy"     ,   diag_dssh_dy*zswi        )          ! Sea-surface tilt term in force balance (y-component)
284
285      IF  ( iom_use( "corstrx"  ) ) CALL iom_put( "corstrx"     ,   diag_corstrx*zswi        )          ! Coriolis force term in force balance (x-component)
286      IF  ( iom_use( "corstry"  ) ) CALL iom_put( "corstry"     ,   diag_corstry*zswi        )          ! Coriolis force term in force balance (y-component)
287
288      IF  ( iom_use( "intstrx"  ) ) CALL iom_put( "intstrx"     ,   diag_intstrx*zswi        )          ! Internal force term in force balance (x-component)
289      IF  ( iom_use( "intstry"  ) ) CALL iom_put( "intstry"     ,   diag_intstry*zswi        )          ! Internal force term in force balance (y-component)
290
291      IF  ( iom_use( "normstr"  ) ) CALL iom_put( "normstr"     ,   diag_sig1   *zswi        )          ! Normal stress
292      IF  ( iom_use( "sheastr"  ) ) CALL iom_put( "sheastr"     ,   diag_sig2   *zswi        )          ! Shear stress
293
294      IF  ( iom_use( "xmtrpice" ) ) CALL iom_put( "xmtrpice"     ,  diag_xmtrp_ice           )          ! X-component of sea-ice mass transport
295      IF  ( iom_use( "ymtrpice" ) ) CALL iom_put( "ymtrpice"     ,  diag_ymtrp_ice           )          ! Y-component of sea-ice mass transport
296
297      IF  ( iom_use( "xmtrpsnw" ) ) CALL iom_put( "xmtrpsnw"     ,  diag_xmtrp_snw           )          ! X-component of snow mass transport
298      IF  ( iom_use( "ymtrpsnw" ) ) CALL iom_put( "ymtrpsnw"     ,  diag_ymtrp_snw           )          ! Y-component of snow mass transport
299
300      IF  ( iom_use( "xatrp"    ) ) CALL iom_put( "xatrp"        ,  diag_xatrp               )          ! X-component of ice area transport
301      IF  ( iom_use( "yatrp"    ) ) CALL iom_put( "yatrp"        ,  diag_yatrp               )          ! Y-component of ice area transport
302
303      !--------------------------------
304      ! Global ice diagnostics (SIMIP)
305      !--------------------------------
306
307      IF ( iom_use( "NH_icearea" ) .OR. iom_use( "NH_icevolu" ) .OR. iom_use( "NH_iceextt" ) )   THEN   ! NH integrated diagnostics
308 
309         WHERE( fcor > 0._wp ); zswi(:,:) = 1.0e-12
310         ELSEWHERE            ; zswi(:,:) = 0.
311         END WHERE
312
313         zdiag_area_nh = glob_sum( at_i(:,:) * zswi(:,:) * e12t(:,:) )
314         zdiag_volu_nh = glob_sum( vt_i(:,:) * zswi(:,:) * e12t(:,:) )
315
316         WHERE( fcor > 0._wp .AND. at_i > 0.15 ); zswi(:,:) = 1.0e-12
317         ELSEWHERE                              ; zswi(:,:) = 0.
318         END WHERE
319
320         zdiag_extt_nh = glob_sum( zswi(:,:) * e12t(:,:) )
321
322         IF ( iom_use( "NH_icearea" ) ) CALL iom_put( "NH_icearea" ,  zdiag_area_nh  )
323         IF ( iom_use( "NH_icevolu" ) ) CALL iom_put( "NH_icevolu" ,  zdiag_volu_nh  )
324         IF ( iom_use( "NH_iceextt" ) ) CALL iom_put( "NH_iceextt" ,  zdiag_extt_nh  )
325
326      ENDIF
327
328      IF ( iom_use( "SH_icearea" ) .OR. iom_use( "SH_icevolu" ) .OR. iom_use( "SH_iceextt" ) )   THEN   ! SH integrated diagnostics
329
330         WHERE( fcor < 0._wp ); zswi(:,:) = 1.0e-12; 
331         ELSEWHERE            ; zswi(:,:) = 0.
332         END WHERE
333
334         zdiag_area_sh = glob_sum( at_i(:,:) * zswi(:,:) * e12t(:,:) ) 
335         zdiag_volu_sh = glob_sum( vt_i(:,:) * zswi(:,:) * e12t(:,:) )
336
337         WHERE( fcor < 0._wp .AND. at_i > 0.15 ); zswi(:,:) = 1.0e-12
338         ELSEWHERE                              ; zswi(:,:) = 0.
339         END WHERE
340
341         zdiag_extt_sh = glob_sum( zswi(:,:) * e12t(:,:) )
342
343         IF ( iom_use( "SH_icearea" ) ) CALL iom_put( "SH_icearea", zdiag_area_sh )
344         IF ( iom_use( "SH_icevolu" ) ) CALL iom_put( "SH_icevolu", zdiag_volu_sh )
345         IF ( iom_use( "SH_iceextt" ) ) CALL iom_put( "SH_iceextt", zdiag_extt_sh )
346
347      ENDIF 
348
349      !     !  Create an output files (output.lim.abort.nc) if S < 0 or u > 20 m/s
350      !     IF( kindic < 0 )   CALL lim_wri_state( 'output.abort' )
351      !     not yet implemented
352     
353      CALL wrk_dealloc( jpi, jpj, jpl, zswi2 )
354      CALL wrk_dealloc( jpi, jpj     , z2d, zswi )
355      CALL wrk_dealloc( jpi, jpj     , zfb, zamask, zamask15 )
356
357      IF( nn_timing == 1 )  CALL timing_stop('limwri')
358     
359   END SUBROUTINE lim_wri
360
361 
362   SUBROUTINE lim_wri_state( kt, kid, kh_i )
363      !!---------------------------------------------------------------------
364      !!                 ***  ROUTINE lim_wri_state  ***
365      !!       
366      !! ** Purpose :   create a NetCDF file named cdfile_name which contains
367      !!      the instantaneous ice state and forcing fields for ice model
368      !!        Used to find errors in the initial state or save the last
369      !!      ocean state in case of abnormal end of a simulation
370      !!
371      !! History :
372      !!   4.0  !  2013-06  (C. Rousset)
373      !!----------------------------------------------------------------------
374      INTEGER, INTENT( in )   ::   kt               ! ocean time-step index)
375      INTEGER, INTENT( in )   ::   kid , kh_i
376      INTEGER                 ::   nz_i, jl
377      REAL(wp), DIMENSION(jpl) :: jcat
378      !!----------------------------------------------------------------------
379      DO jl = 1, jpl
380         jcat(jl) = REAL(jl)
381      ENDDO
382     
383      CALL histvert( kid, "ncatice", "Ice Categories","", jpl, jcat, nz_i, "up")
384
385      CALL histdef( kid, "sithic", "Ice thickness"           , "m"      ,   &
386      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )
387      CALL histdef( kid, "siconc", "Ice concentration"       , "%"      ,   &
388      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )
389      CALL histdef( kid, "sitemp", "Ice temperature"         , "C"      ,   &
390      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )
391      CALL histdef( kid, "sivelu", "i-Ice speed "            , "m/s"    ,   &
392      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )
393      CALL histdef( kid, "sivelv", "j-Ice speed "            , "m/s"    ,   &
394      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
395      CALL histdef( kid, "sistru", "i-Wind stress over ice " , "Pa"     ,   &
396      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )
397      CALL histdef( kid, "sistrv", "j-Wind stress over ice " , "Pa"     ,   &
398      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
399      CALL histdef( kid, "sisflx", "Solar flux over ocean"     , "w/m2" ,   &
400      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
401      CALL histdef( kid, "sinflx", "Non-solar flux over ocean" , "w/m2" ,   &
402      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )
403      CALL histdef( kid, "isnowpre", "Snow precipitation"      , "kg/m2/s",   &
404      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
405      CALL histdef( kid, "sisali", "Ice salinity"            , "PSU"    ,   &
406      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
407      CALL histdef( kid, "sivolu", "Ice volume"              , "m"      ,   &
408      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
409      CALL histdef( kid, "sidive", "Ice divergence"          , "10-8s-1",   &
410      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
411
412      CALL histdef( kid, "vfxbog", "Ice bottom production"   , "m/s"    ,   &
413      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )
414      CALL histdef( kid, "vfxdyn", "Ice dynamic production"  , "m/s"    ,   &
415      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )
416      CALL histdef( kid, "vfxopw", "Ice open water prod"     , "m/s"    ,   &
417      &       jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )
418      CALL histdef( kid, "vfxsni", "Snow ice production "    , "m/s"    ,   &
419      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )
420      CALL histdef( kid, "vfxres", "Ice prod from limupdate" , "m/s"    ,   &
421      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )
422      CALL histdef( kid, "vfxbom", "Ice bottom melt"         , "m/s"    ,   &
423      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )
424      CALL histdef( kid, "vfxsum", "Ice surface melt"        , "m/s"    ,   &
425      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )
426
427      CALL histdef( kid, "sithicat", "Ice thickness"         , "m"      ,   &
428      &      jpi, jpj, kh_i, jpl, 1, jpl, nz_i, 32, "inst(x)", rdt, rdt )
429      CALL histdef( kid, "siconcat", "Ice concentration"     , "%"      ,   &
430      &      jpi, jpj, kh_i, jpl, 1, jpl, nz_i, 32, "inst(x)", rdt, rdt )
431      CALL histdef( kid, "sisalcat", "Ice salinity"           , ""      ,   &
432      &      jpi, jpj, kh_i, jpl, 1, jpl, nz_i, 32, "inst(x)", rdt, rdt )
433      CALL histdef( kid, "sitemcat", "Ice temperature"       , "C"      ,   &
434      &      jpi, jpj, kh_i, jpl, 1, jpl, nz_i, 32, "inst(x)", rdt, rdt )
435      CALL histdef( kid, "snthicat", "Snw thickness"         , "m"      ,   &
436      &      jpi, jpj, kh_i, jpl, 1, jpl, nz_i, 32, "inst(x)", rdt, rdt )
437      CALL histdef( kid, "sntemcat", "Snw temperature"       , "C"      ,   &
438      &      jpi, jpj, kh_i, jpl, 1, jpl, nz_i, 32, "inst(x)", rdt, rdt )
439
440      CALL histend( kid, snc4set )   ! end of the file definition
441
442      CALL histwrite( kid, "sithic", kt, htm_i         , jpi*jpj, (/1/) )   
443      CALL histwrite( kid, "siconc", kt, at_i          , jpi*jpj, (/1/) )
444      CALL histwrite( kid, "sitemp", kt, tm_i - rt0    , jpi*jpj, (/1/) )
445      CALL histwrite( kid, "sivelu", kt, u_ice          , jpi*jpj, (/1/) )
446      CALL histwrite( kid, "sivelv", kt, v_ice          , jpi*jpj, (/1/) )
447      CALL histwrite( kid, "sistru", kt, utau_ice       , jpi*jpj, (/1/) )
448      CALL histwrite( kid, "sistrv", kt, vtau_ice       , jpi*jpj, (/1/) )
449      CALL histwrite( kid, "sisflx", kt, qsr , jpi*jpj, (/1/) )
450      CALL histwrite( kid, "sinflx", kt, qns , jpi*jpj, (/1/) )
451      CALL histwrite( kid, "isnowpre", kt, sprecip        , jpi*jpj, (/1/) )
452      CALL histwrite( kid, "sisali", kt, smt_i          , jpi*jpj, (/1/) )
453      CALL histwrite( kid, "sivolu", kt, vt_i           , jpi*jpj, (/1/) )
454      CALL histwrite( kid, "sidive", kt, divu_i*1.0e8   , jpi*jpj, (/1/) )
455
456      CALL histwrite( kid, "vfxbog", kt, wfx_bog        , jpi*jpj, (/1/) )
457      CALL histwrite( kid, "vfxdyn", kt, wfx_dyn        , jpi*jpj, (/1/) )
458      CALL histwrite( kid, "vfxopw", kt, wfx_opw        , jpi*jpj, (/1/) )
459      CALL histwrite( kid, "vfxsni", kt, wfx_sni        , jpi*jpj, (/1/) )
460      CALL histwrite( kid, "vfxres", kt, wfx_res        , jpi*jpj, (/1/) )
461      CALL histwrite( kid, "vfxbom", kt, wfx_bom        , jpi*jpj, (/1/) )
462      CALL histwrite( kid, "vfxsum", kt, wfx_sum        , jpi*jpj, (/1/) )
463
464      CALL histwrite( kid, "sithicat", kt, ht_i        , jpi*jpj*jpl, (/1/) )   
465      CALL histwrite( kid, "siconcat", kt, a_i         , jpi*jpj*jpl, (/1/) )   
466      CALL histwrite( kid, "sisalcat", kt, sm_i        , jpi*jpj*jpl, (/1/) )   
467      CALL histwrite( kid, "sitemcat", kt, tm_i - rt0  , jpi*jpj*jpl, (/1/) )   
468      CALL histwrite( kid, "snthicat", kt, ht_s        , jpi*jpj*jpl, (/1/) )   
469      CALL histwrite( kid, "sntemcat", kt, tm_su - rt0 , jpi*jpj*jpl, (/1/) )   
470
471      ! Close the file
472      ! -----------------
473      !CALL histclo( kid )
474
475    END SUBROUTINE lim_wri_state
476
477#else
478   !!----------------------------------------------------------------------
479   !!   Default option :         Empty module          NO LIM sea-ice model
480   !!----------------------------------------------------------------------
481CONTAINS
482   SUBROUTINE lim_wri          ! Empty routine
483   END SUBROUTINE lim_wri
484#endif
485
486   !!======================================================================
487END MODULE limwri
Note: See TracBrowser for help on using the repository browser.