limwri.F90 32 KB

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