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.
icewri.F90 in NEMO/branches/UKMO/NEMO_4.0.1_meltpond_improvements/src/ICE – NEMO

source: NEMO/branches/UKMO/NEMO_4.0.1_meltpond_improvements/src/ICE/icewri.F90 @ 12636

Last change on this file since 12636 was 12636, checked in by dancopsey, 4 years ago

Add:

  • Melt pond lids
  • Melt pond maximum area and thickness
  • Melt pond vertical flushing
  • Area contributing to melt ponds depends on total ice fraction
File size: 18.8 KB
RevLine 
[8586]1MODULE icewri
2   !!======================================================================
3   !!                     ***  MODULE  icewri  ***
4   !!   sea-ice : output ice variables
5   !!======================================================================
[9604]6   !! History :  4.0  !  2018     (many people)      SI3 [aka Sea Ice cube]
7   !!----------------------------------------------------------------------
[9570]8#if defined key_si3
[8586]9   !!----------------------------------------------------------------------
[9570]10   !!   'key_si3'                                       SI3 sea-ice model
[8586]11   !!----------------------------------------------------------------------
12   !!   ice_wri       : write of the diagnostics variables in ouput file
13   !!   ice_wri_state : write for initial state or/and abandon
14   !!----------------------------------------------------------------------
15   USE dianam         ! build name of file (routine)
16   USE phycst         ! physical constant
17   USE dom_oce        ! domain: ocean
18   USE sbc_oce        ! surf. boundary cond.: ocean
19   USE sbc_ice        ! Surface boundary condition: ice fields
20   USE ice            ! sea-ice: variables
21   USE icevar         ! sea-ice: operations
22   !
23   USE ioipsl         !
24   USE in_out_manager ! I/O manager
25   USE iom            ! I/O manager library
26   USE lib_mpp        ! MPP library
27   USE lib_fortran    ! fortran utilities (glob_sum + no signed zero)
28   USE lbclnk         ! lateral boundary conditions (or mpp links)
29   USE timing         ! Timing
30
31   IMPLICIT NONE
32   PRIVATE
33
34   PUBLIC ice_wri        ! called by ice_stp
35   PUBLIC ice_wri_state  ! called by dia_wri_state
36
37   !!----------------------------------------------------------------------
[9598]38   !! NEMO/ICE 4.0 , NEMO Consortium (2018)
[10069]39   !! $Id$
[10413]40   !! Software governed by the CeCILL licence     (./LICENSE)
[8586]41   !!----------------------------------------------------------------------
42CONTAINS
43
44   SUBROUTINE ice_wri( kt )
45      !!-------------------------------------------------------------------
[9604]46      !!  This routine ouputs some (most?) of the sea ice fields
[8586]47      !!-------------------------------------------------------------------
48      INTEGER, INTENT(in) ::   kt   ! time-step
49      !
[8884]50      INTEGER  ::   ji, jj, jk, jl  ! dummy loop indices
51      REAL(wp) ::   z2da, z2db, zrho1, zrho2
[11536]52      REAL(wp) ::   zmiss_val       ! missing value retrieved from xios
53      REAL(wp), DIMENSION(jpi,jpj)     ::   z2d, zfast                     ! 2D workspace
[9433]54      REAL(wp), DIMENSION(jpi,jpj)     ::   zmsk00, zmsk05, zmsk15, zmsksn ! O%, 5% and 15% concentration mask and snow mask
55      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   zmsk00l, zmsksnl               ! cat masks
[8586]56      !
57      ! Global ice diagnostics (SIMIP)
[8884]58      REAL(wp) ::   zdiag_area_nh, zdiag_extt_nh, zdiag_volu_nh   ! area, extent, volume
59      REAL(wp) ::   zdiag_area_sh, zdiag_extt_sh, zdiag_volu_sh 
[8586]60      !!-------------------------------------------------------------------
[11536]61      !
[9124]62      IF( ln_timing )   CALL timing_start('icewri')
[8586]63
[11536]64      ! get missing value from xml
65      CALL iom_miss_val( 'icetemp', zmiss_val )
66
[9604]67      ! brine volume
68      CALL ice_var_bv
[8586]69
70      ! tresholds for outputs
71      DO jj = 1, jpj
72         DO ji = 1, jpi
[8884]73            zmsk00(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi06  ) ) ! 1 if ice    , 0 if no ice
74            zmsk05(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - 0.05_wp ) ) ! 1 if 5% ice , 0 if less
75            zmsk15(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - 0.15_wp ) ) ! 1 if 15% ice, 0 if less
[9433]76            zmsksn(ji,jj) = MAX( 0._wp , SIGN( 1._wp , vt_s(ji,jj) - epsi06  ) ) ! 1 if snow   , 0 if no snow
[8586]77         END DO
78      END DO
79      DO jl = 1, jpl
80         DO jj = 1, jpj
81            DO ji = 1, jpi
[8884]82               zmsk00l(ji,jj,jl)  = MAX( 0._wp , SIGN( 1._wp , a_i(ji,jj,jl) - epsi06 ) )
[9433]83               zmsksnl(ji,jj,jl)  = MAX( 0._wp , SIGN( 1._wp , v_s(ji,jj,jl) - epsi06 ) )
[8586]84            END DO
85         END DO
86      END DO
87
[8884]88      !-----------------
[8586]89      ! Standard outputs
[8884]90      !-----------------
[11536]91      zrho1 = ( rau0 - rhoi ) * r1_rau0 ; zrho2 = rhos * r1_rau0
[8884]92      ! masks
[11536]93      CALL iom_put( 'icemask'  , zmsk00 )   ! ice mask 0%
94      CALL iom_put( 'icemask05', zmsk05 )   ! ice mask 5%
95      CALL iom_put( 'icemask15', zmsk15 )   ! ice mask 15%
96      CALL iom_put( 'icepres'  , zmsk00 )   ! Ice presence (1 or 0)
[8884]97      !
98      ! general fields
[11536]99      IF( iom_use('icemass' ) )   CALL iom_put( 'icemass', vt_i * rhoi * zmsk00 )                                           ! Ice mass per cell area
100      IF( iom_use('snwmass' ) )   CALL iom_put( 'snwmass', vt_s * rhos * zmsksn )                                           ! Snow mass per cell area
101      IF( iom_use('iceconc' ) )   CALL iom_put( 'iceconc', at_i        * zmsk00 )                                           ! ice concentration
102      IF( iom_use('icevolu' ) )   CALL iom_put( 'icevolu', vt_i        * zmsk00 )                                           ! ice volume = mean ice thickness over the cell
103      IF( iom_use('icethic' ) )   CALL iom_put( 'icethic', hm_i        * zmsk00 )                                           ! ice thickness
104      IF( iom_use('snwthic' ) )   CALL iom_put( 'snwthic', hm_s        * zmsk00 )                                           ! snw thickness
105      IF( iom_use('icebrv'  ) )   CALL iom_put( 'icebrv' , bvm_i* 100. * zmsk00 )                                           ! brine volume
106      IF( iom_use('iceage'  ) )   CALL iom_put( 'iceage' , om_i / rday * zmsk15 + zmiss_val * ( 1._wp - zmsk15 ) )          ! ice age
107      IF( iom_use('icehnew' ) )   CALL iom_put( 'icehnew', ht_i_new             )                                           ! new ice thickness formed in the leads
108      IF( iom_use('snwvolu' ) )   CALL iom_put( 'snwvolu', vt_s        * zmsksn )                                           ! snow volume
109      IF( iom_use('icefrb'  ) ) THEN                                                                                        ! Ice freeboard
[8884]110         z2d(:,:) = ( zrho1 * hm_i(:,:) - zrho2 * hm_s(:,:) )                                         
111         WHERE( z2d < 0._wp )   z2d = 0._wp
[11536]112                                  CALL iom_put( 'icefrb' , z2d * zmsk00         )
[8884]113      ENDIF
114      ! melt ponds
[11536]115      IF( iom_use('iceapnd' ) )   CALL iom_put( 'iceapnd', at_ip  * zmsk00      )                                           ! melt pond total fraction
116      IF( iom_use('icehpnd' ) )   CALL iom_put( 'icehpnd', hm_ip  * zmsk00      )                                           ! melt pond depth
117      IF( iom_use('icevpnd' ) )   CALL iom_put( 'icevpnd', vt_ip  * zmsk00      )                                           ! melt pond total volume per unit area
[8884]118      ! salt
[11536]119      IF( iom_use('icesalt' ) )   CALL iom_put( 'icesalt', sm_i                 * zmsk00 + zmiss_val * ( 1._wp - zmsk00 ) ) ! mean ice salinity
120      IF( iom_use('icesalm' ) )   CALL iom_put( 'icesalm', st_i * rhoi * 1.0e-3 * zmsk00 )                                  ! Mass of salt in sea ice per cell area
[8884]121      ! heat
[11536]122      IF( iom_use('icetemp' ) )   CALL iom_put( 'icetemp', ( tm_i  - rt0 ) * zmsk00 + zmiss_val * ( 1._wp - zmsk00 ) )      ! ice mean temperature
123      IF( iom_use('snwtemp' ) )   CALL iom_put( 'snwtemp', ( tm_s  - rt0 ) * zmsksn + zmiss_val * ( 1._wp - zmsksn ) )      ! snw mean temperature
124      IF( iom_use('icettop' ) )   CALL iom_put( 'icettop', ( tm_su - rt0 ) * zmsk00 + zmiss_val * ( 1._wp - zmsk00 ) )      ! temperature at the ice surface
125      IF( iom_use('icetbot' ) )   CALL iom_put( 'icetbot', ( t_bo  - rt0 ) * zmsk00 + zmiss_val * ( 1._wp - zmsk00 ) )      ! temperature at the ice bottom
126      IF( iom_use('icetsni' ) )   CALL iom_put( 'icetsni', ( tm_si - rt0 ) * zmsk00 + zmiss_val * ( 1._wp - zmsk00 ) )      ! temperature at the snow-ice interface
127      IF( iom_use('icehc'   ) )   CALL iom_put( 'icehc'  ,  -et_i          * zmsk00 )                                       ! ice heat content
128      IF( iom_use('snwhc'   ) )   CALL iom_put( 'snwhc'  ,  -et_s          * zmsksn )                                       ! snow heat content
[8884]129      ! momentum
[11536]130      IF( iom_use('uice'    ) )   CALL iom_put( 'uice'   , u_ice    )                                                       ! ice velocity u
131      IF( iom_use('vice'    ) )   CALL iom_put( 'vice'   , v_ice    )                                                       ! ice velocity v
132      !
133      IF( iom_use('icevel') .OR. iom_use('fasticepres') ) THEN                                                              ! module of ice velocity
[8586]134         DO jj = 2 , jpjm1
135            DO ji = 2 , jpim1
[11536]136               z2da  = u_ice(ji,jj) + u_ice(ji-1,jj)
137               z2db  = v_ice(ji,jj) + v_ice(ji,jj-1)
[8586]138               z2d(ji,jj) = 0.5_wp * SQRT( z2da * z2da + z2db * z2db )
139           END DO
140         END DO
[10425]141         CALL lbc_lnk( 'icewri', z2d, 'T', 1. )
[11536]142         CALL iom_put( 'icevel', z2d )
[10413]143
[11536]144         WHERE( z2d(:,:) < 5.e-04_wp .AND. zmsk15(:,:) == 1._wp ) ; zfast(:,:) = 1._wp                                      ! record presence of fast ice
[10413]145         ELSEWHERE                                                ; zfast(:,:) = 0._wp
146         END WHERE
[11536]147         CALL iom_put( 'fasticepres', zfast )
[8586]148      ENDIF
149
[8884]150      ! --- category-dependent fields --- !
[12636]151      IF( iom_use('icelhpnd_cat') )   CALL iom_put( 'icelhpnd_cat', lh_ip          * zmsk00l                                   ) ! melt pond lid thickness for categories
[11536]152      IF( iom_use('icemask_cat' ) )   CALL iom_put( 'icemask_cat' ,                  zmsk00l                                   ) ! ice mask 0%
153      IF( iom_use('iceconc_cat' ) )   CALL iom_put( 'iceconc_cat' , a_i            * zmsk00l                                   ) ! area for categories
154      IF( iom_use('icethic_cat' ) )   CALL iom_put( 'icethic_cat' , h_i            * zmsk00l + zmiss_val * ( 1._wp - zmsk00l ) ) ! thickness for categories
155      IF( iom_use('snwthic_cat' ) )   CALL iom_put( 'snwthic_cat' , h_s            * zmsksnl + zmiss_val * ( 1._wp - zmsksnl ) ) ! snow depth for categories
156      IF( iom_use('icesalt_cat' ) )   CALL iom_put( 'icesalt_cat' , s_i            * zmsk00l + zmiss_val * ( 1._wp - zmsk00l ) ) ! salinity for categories
157      IF( iom_use('iceage_cat'  ) )   CALL iom_put( 'iceage_cat'  , o_i / rday     * zmsk00l + zmiss_val * ( 1._wp - zmsk00l ) ) ! ice age
158      IF( iom_use('icetemp_cat' ) )   CALL iom_put( 'icetemp_cat' , ( SUM( t_i, dim=3 ) * r1_nlay_i - rt0 ) &
159         &                                                                         * zmsk00l + zmiss_val * ( 1._wp - zmsk00l ) ) ! ice temperature
160      IF( iom_use('snwtemp_cat' ) )   CALL iom_put( 'snwtemp_cat' , ( SUM( t_s, dim=3 ) * r1_nlay_s - rt0 ) &
161         &                                                                         * zmsksnl + zmiss_val * ( 1._wp - zmsksnl ) ) ! snow temperature
162      IF( iom_use('icettop_cat' ) )   CALL iom_put( 'icettop_cat' , ( t_su - rt0 ) * zmsk00l + zmiss_val * ( 1._wp - zmsk00l ) ) ! surface temperature
163      IF( iom_use('icebrv_cat'  ) )   CALL iom_put( 'icebrv_cat'  ,   bv_i * 100.  * zmsk00l + zmiss_val * ( 1._wp - zmsk00l ) ) ! brine volume
164      IF( iom_use('iceapnd_cat' ) )   CALL iom_put( 'iceapnd_cat' ,   a_ip         * zmsk00l                                   ) ! melt pond frac for categories
165      IF( iom_use('icehpnd_cat' ) )   CALL iom_put( 'icehpnd_cat' ,   h_ip         * zmsk00l + zmiss_val * ( 1._wp - zmsk00l ) ) ! melt pond frac for categories
166      IF( iom_use('iceafpnd_cat') )   CALL iom_put( 'iceafpnd_cat',   a_ip_frac    * zmsk00l                                   ) ! melt pond frac for categories
[11575]167      IF( iom_use('icealb_cat'  ) )   CALL iom_put( 'icealb_cat'  ,   alb_ice      * zmsk00l + zmiss_val * ( 1._wp - zmsk00l ) ) ! ice albedo for categories
[8586]168
[12636]169      IF( iom_use('icevol_cat'  ) )   CALL iom_put( "icevol_cat"  , v_i            * zmsk00l                                   ) ! volume for categories
170      IF( iom_use('iceaepnd_cat') )   CALL iom_put( 'iceaepnd_cat',   a_ip_eff     * zmsk00l                                   ) ! melt pond effective frac for categories
171
[8884]172      !------------------
[8586]173      ! Add-ons for SIMIP
[8884]174      !------------------
175      ! trends
[11536]176      IF( iom_use('dmithd') )   CALL iom_put( 'dmithd', - wfx_bog - wfx_bom - wfx_sum - wfx_sni - wfx_opw - wfx_lam - wfx_res ) ! Sea-ice mass change from thermodynamics
177      IF( iom_use('dmidyn') )   CALL iom_put( 'dmidyn', - wfx_dyn + rhoi * diag_trp_vi                                        ) ! Sea-ice mass change from dynamics(kg/m2/s)
178      IF( iom_use('dmiopw') )   CALL iom_put( 'dmiopw', - wfx_opw                                                             ) ! Sea-ice mass change through growth in open water
179      IF( iom_use('dmibog') )   CALL iom_put( 'dmibog', - wfx_bog                                                             ) ! Sea-ice mass change through basal growth
180      IF( iom_use('dmisni') )   CALL iom_put( 'dmisni', - wfx_sni                                                             ) ! Sea-ice mass change through snow-to-ice conversion
181      IF( iom_use('dmisum') )   CALL iom_put( 'dmisum', - wfx_sum                                                             ) ! Sea-ice mass change through surface melting
182      IF( iom_use('dmibom') )   CALL iom_put( 'dmibom', - wfx_bom                                                             ) ! Sea-ice mass change through bottom melting
183      IF( iom_use('dmtsub') )   CALL iom_put( 'dmtsub', - wfx_sub                                                             ) ! Sea-ice mass change through evaporation and sublimation
184      IF( iom_use('dmssub') )   CALL iom_put( 'dmssub', - wfx_snw_sub                                                         ) ! Snow mass change through sublimation
185      IF( iom_use('dmisub') )   CALL iom_put( 'dmisub', - wfx_ice_sub                                                         ) ! Sea-ice mass change through sublimation
186      IF( iom_use('dmsspr') )   CALL iom_put( 'dmsspr', - wfx_spr                                                             ) ! Snow mass change through snow fall
187      IF( iom_use('dmsssi') )   CALL iom_put( 'dmsssi',   wfx_sni*rhos*r1_rhoi                                                ) ! Snow mass change through snow-to-ice conversion
188      IF( iom_use('dmsmel') )   CALL iom_put( 'dmsmel', - wfx_snw_sum                                                         ) ! Snow mass change through melt
189      IF( iom_use('dmsdyn') )   CALL iom_put( 'dmsdyn', - wfx_snw_dyn + rhos * diag_trp_vs                                    ) ! Snow mass change through dynamics(kg/m2/s)
190     
[8884]191      ! Global ice diagnostics
[11536]192      IF(  iom_use('NH_icearea') .OR. iom_use('NH_icevolu') .OR. iom_use('NH_iceextt') .OR. &
193         & iom_use('SH_icearea') .OR. iom_use('SH_icevolu') .OR. iom_use('SH_iceextt') ) THEN
[8586]194         !
[11536]195         WHERE( ff_t(:,:) > 0._wp )   ;   z2d(:,:) = 1._wp
196         ELSEWHERE                    ;   z2d(:,:) = 0.
197         END WHERE
[8586]198         !
[11536]199         IF( iom_use('NH_icearea') )   zdiag_area_nh = glob_sum( 'icewri', at_i *           z2d   * e1e2t * 1.e-12 )
200         IF( iom_use('NH_icevolu') )   zdiag_volu_nh = glob_sum( 'icewri', vt_i *           z2d   * e1e2t * 1.e-12 )
201         IF( iom_use('NH_iceextt') )   zdiag_extt_nh = glob_sum( 'icewri',                  z2d   * e1e2t * 1.e-12 * zmsk15 )
[8586]202         !
[11536]203         IF( iom_use('SH_icearea') )   zdiag_area_sh = glob_sum( 'icewri', at_i * ( 1._wp - z2d ) * e1e2t * 1.e-12 )
204         IF( iom_use('SH_icevolu') )   zdiag_volu_sh = glob_sum( 'icewri', vt_i * ( 1._wp - z2d ) * e1e2t * 1.e-12 )
205         IF( iom_use('SH_iceextt') )   zdiag_extt_sh = glob_sum( 'icewri',        ( 1._wp - z2d ) * e1e2t * 1.e-12 * zmsk15 )
[8586]206         !
[11536]207         CALL iom_put( 'NH_icearea' , zdiag_area_nh )
208         CALL iom_put( 'NH_icevolu' , zdiag_volu_nh )
209         CALL iom_put( 'NH_iceextt' , zdiag_extt_nh )
210         CALL iom_put( 'SH_icearea' , zdiag_area_sh )
211         CALL iom_put( 'SH_icevolu' , zdiag_volu_sh )
212         CALL iom_put( 'SH_iceextt' , zdiag_extt_sh )
213         !
[8586]214      ENDIF
215      !
216!!CR      !     !  Create an output files (output.lim.abort.nc) if S < 0 or u > 20 m/s
217!!CR      !     IF( kindic < 0 )   CALL ice_wri_state( 'output.abort' )
218!!CR      !     not yet implemented
[11536]219!!gm  idem for the ocean...  Ask Seb how to get rid of ioipsl....
[8586]220      !
[9124]221      IF( ln_timing )  CALL timing_stop('icewri')
[8586]222      !
223   END SUBROUTINE ice_wri
224
225 
[10425]226   SUBROUTINE ice_wri_state( kid )
[8586]227      !!---------------------------------------------------------------------
228      !!                 ***  ROUTINE ice_wri_state  ***
229      !!       
230      !! ** Purpose :   create a NetCDF file named cdfile_name which contains
231      !!      the instantaneous ice state and forcing fields for ice model
232      !!        Used to find errors in the initial state or save the last
233      !!      ocean state in case of abnormal end of a simulation
234      !!
235      !! History :   4.0  !  2013-06  (C. Rousset)
236      !!----------------------------------------------------------------------
[10425]237      INTEGER, INTENT( in ) ::   kid 
[8586]238      !!----------------------------------------------------------------------
239      !
[10425]240      !! The file is open in dia_wri_state (ocean routine)
[8586]241
[10425]242      CALL iom_rstput( 0, 0, kid, 'sithic', hm_i         )   ! Ice thickness
243      CALL iom_rstput( 0, 0, kid, 'siconc', at_i         )   ! Ice concentration
244      CALL iom_rstput( 0, 0, kid, 'sitemp', tm_i - rt0   )   ! Ice temperature
245      CALL iom_rstput( 0, 0, kid, 'sivelu', u_ice        )   ! i-Ice speed
246      CALL iom_rstput( 0, 0, kid, 'sivelv', v_ice        )   ! j-Ice speed
247      CALL iom_rstput( 0, 0, kid, 'sistru', utau_ice     )   ! i-Wind stress over ice
248      CALL iom_rstput( 0, 0, kid, 'sistrv', vtau_ice     )   ! i-Wind stress over ice
249      CALL iom_rstput( 0, 0, kid, 'sisflx', qsr          )   ! Solar flx over ocean
250      CALL iom_rstput( 0, 0, kid, 'sinflx', qns          )   ! NonSolar flx over ocean
251      CALL iom_rstput( 0, 0, kid, 'snwpre', sprecip      )   ! Snow precipitation
252      CALL iom_rstput( 0, 0, kid, 'sisali', sm_i         )   ! Ice salinity
253      CALL iom_rstput( 0, 0, kid, 'sivolu', vt_i         )   ! Ice volume
254      CALL iom_rstput( 0, 0, kid, 'sidive', divu_i*1.0e8 )   ! Ice divergence
255      CALL iom_rstput( 0, 0, kid, 'si_amp', at_ip        )   ! Melt pond fraction
256      CALL iom_rstput( 0, 0, kid, 'si_vmp', vt_ip        )   ! Melt pond volume
257      CALL iom_rstput( 0, 0, kid, 'sithicat', h_i        )   ! Ice thickness
258      CALL iom_rstput( 0, 0, kid, 'siconcat', a_i        )   ! Ice concentration
259      CALL iom_rstput( 0, 0, kid, 'sisalcat', s_i        )   ! Ice salinity
260      CALL iom_rstput( 0, 0, kid, 'snthicat', h_s        )   ! Snw thickness
[8586]261
262    END SUBROUTINE ice_wri_state
263
264#else
265   !!----------------------------------------------------------------------
[9570]266   !!   Default option :         Empty module         NO SI3 sea-ice model
[8586]267   !!----------------------------------------------------------------------
268#endif
269
270   !!======================================================================
271END MODULE icewri
Note: See TracBrowser for help on using the repository browser.