limwri.F90 30 KB

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