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/2020/dev_r13383_HPC-02_Daley_Tiling/src/ICE – NEMO

source: NEMO/branches/2020/dev_r13383_HPC-02_Daley_Tiling/src/ICE/icewri.F90 @ 13553

Last change on this file since 13553 was 13553, checked in by hadcv, 4 years ago

Merge in trunk up to [13550]

  • Property svn:keywords set to Id
File size: 19.0 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
[12377]37   !! * Substitutions
38#  include "do_loop_substitute.h90"
[8586]39   !!----------------------------------------------------------------------
[9598]40   !! NEMO/ICE 4.0 , NEMO Consortium (2018)
[10069]41   !! $Id$
[10413]42   !! Software governed by the CeCILL licence     (./LICENSE)
[8586]43   !!----------------------------------------------------------------------
44CONTAINS
45
46   SUBROUTINE ice_wri( kt )
47      !!-------------------------------------------------------------------
[9604]48      !!  This routine ouputs some (most?) of the sea ice fields
[8586]49      !!-------------------------------------------------------------------
50      INTEGER, INTENT(in) ::   kt   ! time-step
51      !
[8884]52      INTEGER  ::   ji, jj, jk, jl  ! dummy loop indices
53      REAL(wp) ::   z2da, z2db, zrho1, zrho2
[11536]54      REAL(wp) ::   zmiss_val       ! missing value retrieved from xios
55      REAL(wp), DIMENSION(jpi,jpj)     ::   z2d, zfast                     ! 2D workspace
[9433]56      REAL(wp), DIMENSION(jpi,jpj)     ::   zmsk00, zmsk05, zmsk15, zmsksn ! O%, 5% and 15% concentration mask and snow mask
57      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   zmsk00l, zmsksnl               ! cat masks
[8586]58      !
59      ! Global ice diagnostics (SIMIP)
[8884]60      REAL(wp) ::   zdiag_area_nh, zdiag_extt_nh, zdiag_volu_nh   ! area, extent, volume
61      REAL(wp) ::   zdiag_area_sh, zdiag_extt_sh, zdiag_volu_sh 
[8586]62      !!-------------------------------------------------------------------
[11536]63      !
[9124]64      IF( ln_timing )   CALL timing_start('icewri')
[8586]65
[11536]66      ! get missing value from xml
67      CALL iom_miss_val( 'icetemp', zmiss_val )
68
[9604]69      ! brine volume
70      CALL ice_var_bv
[8586]71
72      ! tresholds for outputs
[13295]73      DO_2D( 1, 1, 1, 1 )
[12377]74         zmsk00(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi06  ) ) ! 1 if ice    , 0 if no ice
75         zmsk05(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - 0.05_wp ) ) ! 1 if 5% ice , 0 if less
76         zmsk15(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - 0.15_wp ) ) ! 1 if 15% ice, 0 if less
77         zmsksn(ji,jj) = MAX( 0._wp , SIGN( 1._wp , vt_s(ji,jj) - epsi06  ) ) ! 1 if snow   , 0 if no snow
78      END_2D
[8586]79      DO jl = 1, jpl
[13295]80         DO_2D( 1, 1, 1, 1 )
[12377]81            zmsk00l(ji,jj,jl)  = MAX( 0._wp , SIGN( 1._wp , a_i(ji,jj,jl) - epsi06 ) )
82            zmsksnl(ji,jj,jl)  = MAX( 0._wp , SIGN( 1._wp , v_s(ji,jj,jl) - epsi06 ) )
83         END_2D
[8586]84      END DO
85
[8884]86      !-----------------
[8586]87      ! Standard outputs
[8884]88      !-----------------
[12489]89      zrho1 = ( rho0 - rhoi ) * r1_rho0 ; zrho2 = rhos * r1_rho0
[8884]90      ! masks
[11536]91      CALL iom_put( 'icemask'  , zmsk00 )   ! ice mask 0%
92      CALL iom_put( 'icemask05', zmsk05 )   ! ice mask 5%
93      CALL iom_put( 'icemask15', zmsk15 )   ! ice mask 15%
94      CALL iom_put( 'icepres'  , zmsk00 )   ! Ice presence (1 or 0)
[8884]95      !
96      ! general fields
[11536]97      IF( iom_use('icemass' ) )   CALL iom_put( 'icemass', vt_i * rhoi * zmsk00 )                                           ! Ice mass per cell area
98      IF( iom_use('snwmass' ) )   CALL iom_put( 'snwmass', vt_s * rhos * zmsksn )                                           ! Snow mass per cell area
99      IF( iom_use('iceconc' ) )   CALL iom_put( 'iceconc', at_i        * zmsk00 )                                           ! ice concentration
100      IF( iom_use('icevolu' ) )   CALL iom_put( 'icevolu', vt_i        * zmsk00 )                                           ! ice volume = mean ice thickness over the cell
101      IF( iom_use('icethic' ) )   CALL iom_put( 'icethic', hm_i        * zmsk00 )                                           ! ice thickness
102      IF( iom_use('snwthic' ) )   CALL iom_put( 'snwthic', hm_s        * zmsk00 )                                           ! snw thickness
103      IF( iom_use('icebrv'  ) )   CALL iom_put( 'icebrv' , bvm_i* 100. * zmsk00 )                                           ! brine volume
104      IF( iom_use('iceage'  ) )   CALL iom_put( 'iceage' , om_i / rday * zmsk15 + zmiss_val * ( 1._wp - zmsk15 ) )          ! ice age
105      IF( iom_use('icehnew' ) )   CALL iom_put( 'icehnew', ht_i_new             )                                           ! new ice thickness formed in the leads
106      IF( iom_use('snwvolu' ) )   CALL iom_put( 'snwvolu', vt_s        * zmsksn )                                           ! snow volume
107      IF( iom_use('icefrb'  ) ) THEN                                                                                        ! Ice freeboard
[8884]108         z2d(:,:) = ( zrho1 * hm_i(:,:) - zrho2 * hm_s(:,:) )                                         
109         WHERE( z2d < 0._wp )   z2d = 0._wp
[11536]110                                  CALL iom_put( 'icefrb' , z2d * zmsk00         )
[8884]111      ENDIF
112      ! melt ponds
[11536]113      IF( iom_use('iceapnd' ) )   CALL iom_put( 'iceapnd', at_ip  * zmsk00      )                                           ! melt pond total fraction
114      IF( iom_use('icehpnd' ) )   CALL iom_put( 'icehpnd', hm_ip  * zmsk00      )                                           ! melt pond depth
115      IF( iom_use('icevpnd' ) )   CALL iom_put( 'icevpnd', vt_ip  * zmsk00      )                                           ! melt pond total volume per unit area
[13553]116      IF( iom_use('icehlid' ) )   CALL iom_put( 'icehlid', hm_il  * zmsk00      )                                           ! melt pond lid depth
117      IF( iom_use('icevlid' ) )   CALL iom_put( 'icevlid', vt_il  * zmsk00      )                                           ! melt pond lid 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
[13295]134         DO_2D( 0, 0, 0, 0 )
[12377]135            z2da  = u_ice(ji,jj) + u_ice(ji-1,jj)
136            z2db  = v_ice(ji,jj) + v_ice(ji,jj-1)
137            z2d(ji,jj) = 0.5_wp * SQRT( z2da * z2da + z2db * z2db )
138         END_2D
[13226]139         CALL lbc_lnk( 'icewri', z2d, 'T', 1.0_wp )
[11536]140         CALL iom_put( 'icevel', z2d )
[10413]141
[11536]142         WHERE( z2d(:,:) < 5.e-04_wp .AND. zmsk15(:,:) == 1._wp ) ; zfast(:,:) = 1._wp                                      ! record presence of fast ice
[10413]143         ELSEWHERE                                                ; zfast(:,:) = 0._wp
144         END WHERE
[11536]145         CALL iom_put( 'fasticepres', zfast )
[8586]146      ENDIF
147
[8884]148      ! --- category-dependent fields --- !
[11536]149      IF( iom_use('icemask_cat' ) )   CALL iom_put( 'icemask_cat' ,                  zmsk00l                                   ) ! ice mask 0%
150      IF( iom_use('iceconc_cat' ) )   CALL iom_put( 'iceconc_cat' , a_i            * zmsk00l                                   ) ! area for categories
151      IF( iom_use('icethic_cat' ) )   CALL iom_put( 'icethic_cat' , h_i            * zmsk00l + zmiss_val * ( 1._wp - zmsk00l ) ) ! thickness for categories
152      IF( iom_use('snwthic_cat' ) )   CALL iom_put( 'snwthic_cat' , h_s            * zmsksnl + zmiss_val * ( 1._wp - zmsksnl ) ) ! snow depth for categories
153      IF( iom_use('icesalt_cat' ) )   CALL iom_put( 'icesalt_cat' , s_i            * zmsk00l + zmiss_val * ( 1._wp - zmsk00l ) ) ! salinity for categories
154      IF( iom_use('iceage_cat'  ) )   CALL iom_put( 'iceage_cat'  , o_i / rday     * zmsk00l + zmiss_val * ( 1._wp - zmsk00l ) ) ! ice age
155      IF( iom_use('icetemp_cat' ) )   CALL iom_put( 'icetemp_cat' , ( SUM( t_i, dim=3 ) * r1_nlay_i - rt0 ) &
156         &                                                                         * zmsk00l + zmiss_val * ( 1._wp - zmsk00l ) ) ! ice temperature
157      IF( iom_use('snwtemp_cat' ) )   CALL iom_put( 'snwtemp_cat' , ( SUM( t_s, dim=3 ) * r1_nlay_s - rt0 ) &
158         &                                                                         * zmsksnl + zmiss_val * ( 1._wp - zmsksnl ) ) ! snow temperature
159      IF( iom_use('icettop_cat' ) )   CALL iom_put( 'icettop_cat' , ( t_su - rt0 ) * zmsk00l + zmiss_val * ( 1._wp - zmsk00l ) ) ! surface temperature
160      IF( iom_use('icebrv_cat'  ) )   CALL iom_put( 'icebrv_cat'  ,   bv_i * 100.  * zmsk00l + zmiss_val * ( 1._wp - zmsk00l ) ) ! brine volume
161      IF( iom_use('iceapnd_cat' ) )   CALL iom_put( 'iceapnd_cat' ,   a_ip         * zmsk00l                                   ) ! melt pond frac for categories
[13553]162      IF( iom_use('icehpnd_cat' ) )   CALL iom_put( 'icehpnd_cat' ,   h_ip         * zmsk00l + zmiss_val * ( 1._wp - zmsk00l ) ) ! melt pond thickness for categories
163      IF( iom_use('icehlid_cat' ) )   CALL iom_put( 'icehlid_cat' ,   h_il         * zmsk00l + zmiss_val * ( 1._wp - zmsk00l ) ) ! melt pond lid thickness for categories
[11536]164      IF( iom_use('iceafpnd_cat') )   CALL iom_put( 'iceafpnd_cat',   a_ip_frac    * zmsk00l                                   ) ! melt pond frac for categories
[13553]165      IF( iom_use('iceaepnd_cat') )   CALL iom_put( 'iceaepnd_cat',   a_ip_eff     * zmsk00l                                   ) ! melt pond effective frac for categories
[11575]166      IF( iom_use('icealb_cat'  ) )   CALL iom_put( 'icealb_cat'  ,   alb_ice      * zmsk00l + zmiss_val * ( 1._wp - zmsk00l ) ) ! ice albedo for categories
[8586]167
[8884]168      !------------------
[8586]169      ! Add-ons for SIMIP
[8884]170      !------------------
171      ! trends
[11536]172      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
173      IF( iom_use('dmidyn') )   CALL iom_put( 'dmidyn', - wfx_dyn + rhoi * diag_trp_vi                                        ) ! Sea-ice mass change from dynamics(kg/m2/s)
174      IF( iom_use('dmiopw') )   CALL iom_put( 'dmiopw', - wfx_opw                                                             ) ! Sea-ice mass change through growth in open water
175      IF( iom_use('dmibog') )   CALL iom_put( 'dmibog', - wfx_bog                                                             ) ! Sea-ice mass change through basal growth
176      IF( iom_use('dmisni') )   CALL iom_put( 'dmisni', - wfx_sni                                                             ) ! Sea-ice mass change through snow-to-ice conversion
177      IF( iom_use('dmisum') )   CALL iom_put( 'dmisum', - wfx_sum                                                             ) ! Sea-ice mass change through surface melting
178      IF( iom_use('dmibom') )   CALL iom_put( 'dmibom', - wfx_bom                                                             ) ! Sea-ice mass change through bottom melting
[13553]179      IF( iom_use('dmilam') )   CALL iom_put( 'dmilam', - wfx_lam                                                             ) ! Sea-ice mass change through lateral melting
[11536]180      IF( iom_use('dmtsub') )   CALL iom_put( 'dmtsub', - wfx_sub                                                             ) ! Sea-ice mass change through evaporation and sublimation
181      IF( iom_use('dmssub') )   CALL iom_put( 'dmssub', - wfx_snw_sub                                                         ) ! Snow mass change through sublimation
182      IF( iom_use('dmisub') )   CALL iom_put( 'dmisub', - wfx_ice_sub                                                         ) ! Sea-ice mass change through sublimation
183      IF( iom_use('dmsspr') )   CALL iom_put( 'dmsspr', - wfx_spr                                                             ) ! Snow mass change through snow fall
184      IF( iom_use('dmsssi') )   CALL iom_put( 'dmsssi',   wfx_sni*rhos*r1_rhoi                                                ) ! Snow mass change through snow-to-ice conversion
185      IF( iom_use('dmsmel') )   CALL iom_put( 'dmsmel', - wfx_snw_sum                                                         ) ! Snow mass change through melt
186      IF( iom_use('dmsdyn') )   CALL iom_put( 'dmsdyn', - wfx_snw_dyn + rhos * diag_trp_vs                                    ) ! Snow mass change through dynamics(kg/m2/s)
187     
[8884]188      ! Global ice diagnostics
[11536]189      IF(  iom_use('NH_icearea') .OR. iom_use('NH_icevolu') .OR. iom_use('NH_iceextt') .OR. &
190         & iom_use('SH_icearea') .OR. iom_use('SH_icevolu') .OR. iom_use('SH_iceextt') ) THEN
[8586]191         !
[11536]192         WHERE( ff_t(:,:) > 0._wp )   ;   z2d(:,:) = 1._wp
193         ELSEWHERE                    ;   z2d(:,:) = 0.
194         END WHERE
[8586]195         !
[11536]196         IF( iom_use('NH_icearea') )   zdiag_area_nh = glob_sum( 'icewri', at_i *           z2d   * e1e2t * 1.e-12 )
197         IF( iom_use('NH_icevolu') )   zdiag_volu_nh = glob_sum( 'icewri', vt_i *           z2d   * e1e2t * 1.e-12 )
198         IF( iom_use('NH_iceextt') )   zdiag_extt_nh = glob_sum( 'icewri',                  z2d   * e1e2t * 1.e-12 * zmsk15 )
[8586]199         !
[11536]200         IF( iom_use('SH_icearea') )   zdiag_area_sh = glob_sum( 'icewri', at_i * ( 1._wp - z2d ) * e1e2t * 1.e-12 )
201         IF( iom_use('SH_icevolu') )   zdiag_volu_sh = glob_sum( 'icewri', vt_i * ( 1._wp - z2d ) * e1e2t * 1.e-12 )
202         IF( iom_use('SH_iceextt') )   zdiag_extt_sh = glob_sum( 'icewri',        ( 1._wp - z2d ) * e1e2t * 1.e-12 * zmsk15 )
[8586]203         !
[11536]204         CALL iom_put( 'NH_icearea' , zdiag_area_nh )
205         CALL iom_put( 'NH_icevolu' , zdiag_volu_nh )
206         CALL iom_put( 'NH_iceextt' , zdiag_extt_nh )
207         CALL iom_put( 'SH_icearea' , zdiag_area_sh )
208         CALL iom_put( 'SH_icevolu' , zdiag_volu_sh )
209         CALL iom_put( 'SH_iceextt' , zdiag_extt_sh )
210         !
[8586]211      ENDIF
212      !
213!!CR      !     !  Create an output files (output.lim.abort.nc) if S < 0 or u > 20 m/s
214!!CR      !     IF( kindic < 0 )   CALL ice_wri_state( 'output.abort' )
215!!CR      !     not yet implemented
[11536]216!!gm  idem for the ocean...  Ask Seb how to get rid of ioipsl....
[8586]217      !
[9124]218      IF( ln_timing )  CALL timing_stop('icewri')
[8586]219      !
220   END SUBROUTINE ice_wri
221
222 
[10425]223   SUBROUTINE ice_wri_state( kid )
[8586]224      !!---------------------------------------------------------------------
225      !!                 ***  ROUTINE ice_wri_state  ***
226      !!       
227      !! ** Purpose :   create a NetCDF file named cdfile_name which contains
228      !!      the instantaneous ice state and forcing fields for ice model
229      !!        Used to find errors in the initial state or save the last
230      !!      ocean state in case of abnormal end of a simulation
231      !!
232      !! History :   4.0  !  2013-06  (C. Rousset)
233      !!----------------------------------------------------------------------
[10425]234      INTEGER, INTENT( in ) ::   kid 
[8586]235      !!----------------------------------------------------------------------
236      !
[10425]237      !! The file is open in dia_wri_state (ocean routine)
[8586]238
[10425]239      CALL iom_rstput( 0, 0, kid, 'sithic', hm_i         )   ! Ice thickness
240      CALL iom_rstput( 0, 0, kid, 'siconc', at_i         )   ! Ice concentration
241      CALL iom_rstput( 0, 0, kid, 'sitemp', tm_i - rt0   )   ! Ice temperature
242      CALL iom_rstput( 0, 0, kid, 'sivelu', u_ice        )   ! i-Ice speed
243      CALL iom_rstput( 0, 0, kid, 'sivelv', v_ice        )   ! j-Ice speed
244      CALL iom_rstput( 0, 0, kid, 'sistru', utau_ice     )   ! i-Wind stress over ice
245      CALL iom_rstput( 0, 0, kid, 'sistrv', vtau_ice     )   ! i-Wind stress over ice
246      CALL iom_rstput( 0, 0, kid, 'sisflx', qsr          )   ! Solar flx over ocean
247      CALL iom_rstput( 0, 0, kid, 'sinflx', qns          )   ! NonSolar flx over ocean
248      CALL iom_rstput( 0, 0, kid, 'snwpre', sprecip      )   ! Snow precipitation
249      CALL iom_rstput( 0, 0, kid, 'sisali', sm_i         )   ! Ice salinity
250      CALL iom_rstput( 0, 0, kid, 'sivolu', vt_i         )   ! Ice volume
251      CALL iom_rstput( 0, 0, kid, 'sidive', divu_i*1.0e8 )   ! Ice divergence
252      CALL iom_rstput( 0, 0, kid, 'si_amp', at_ip        )   ! Melt pond fraction
253      CALL iom_rstput( 0, 0, kid, 'si_vmp', vt_ip        )   ! Melt pond volume
254      CALL iom_rstput( 0, 0, kid, 'sithicat', h_i        )   ! Ice thickness
255      CALL iom_rstput( 0, 0, kid, 'siconcat', a_i        )   ! Ice concentration
256      CALL iom_rstput( 0, 0, kid, 'sisalcat', s_i        )   ! Ice salinity
257      CALL iom_rstput( 0, 0, kid, 'snthicat', h_s        )   ! Snw thickness
[8586]258
259    END SUBROUTINE ice_wri_state
260
261#else
262   !!----------------------------------------------------------------------
[9570]263   !!   Default option :         Empty module         NO SI3 sea-ice model
[8586]264   !!----------------------------------------------------------------------
265#endif
266
267   !!======================================================================
268END MODULE icewri
Note: See TracBrowser for help on using the repository browser.