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.
icedia.F90 in branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3 – NEMO

source: branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3/icedia.F90 @ 8426

Last change on this file since 8426 was 8426, checked in by clem, 7 years ago

last routine names to be changed

File size: 14.5 KB
RevLine 
[8426]1MODULE icedia
2   !!======================================================================
3   !!                       ***  MODULE limdia_hsb   ***
4   !!  LIM-3 sea ice model :   diagnostics of ice model
5   !!======================================================================
6   !! History :  3.4  ! 2012-10  (C. Rousset)  original code
7   !!----------------------------------------------------------------------
8#if defined key_lim3
9   !!----------------------------------------------------------------------
10   !!   'key_lim3'                                       LIM3 sea-ice model
11   !!----------------------------------------------------------------------
12   !!   lim_dia_hsb        : computation and output of the time evolution of keys variables
13   !!   lim_dia_hsb_init   : initialization and namelist read
14   !!----------------------------------------------------------------------
15   USE ice             ! LIM-3: sea-ice variable
16   USE dom_oce         ! ocean domain
17   USE sbc_oce, ONLY: sfx         ! surface boundary condition: ocean fields
18   USE daymod          ! model calendar
19   USE phycst          ! physical constant
20   USE in_out_manager  ! I/O manager
21   USE lib_mpp         ! MPP library
22   USE timing          ! preformance summary
23   USE iom             ! I/O manager
24   USE lib_fortran     ! glob_sum
25   USE icerst          ! ice restart
26
27   IMPLICIT NONE
28   PRIVATE
29
30   PUBLIC   ice_dia        ! routine called by icestp.F90
31   PUBLIC   ice_dia_init   ! routine called in icestp.F90
32
33   REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   vol_loc_ini, sal_loc_ini, tem_loc_ini ! initial volume, salt and heat contents
34   REAL(wp)                              ::   frc_sal, frc_voltop, frc_volbot, frc_temtop, frc_tembot  ! global forcing trends
35   
36   !! * Substitutions
37#  include "vectopt_loop_substitute.h90"
38
39   !!----------------------------------------------------------------------
40   !! NEMO/OPA 3.4 , NEMO Consortium (2012)
41   !! $Id: icedia.F90 8413 2017-08-07 17:05:39Z clem $
42   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
43   !!----------------------------------------------------------------------
44
45CONTAINS
46
47   SUBROUTINE ice_dia( kt )
48      !!---------------------------------------------------------------------------
49      !!                  ***  ROUTINE ice_dia  ***
50      !!     
51      !! ** Purpose: Compute the ice global heat content, salt content and volume conservation
52      !!
53      !!---------------------------------------------------------------------------
54      INTEGER, INTENT(in) :: kt    ! number of iteration
55      !!
56      real(wp)   ::   zbg_ivol, zbg_svol, zbg_area, zbg_isal, zbg_item ,zbg_stem
57      REAL(wp)   ::   z_frc_voltop, z_frc_volbot, z_frc_sal, z_frc_temtop, z_frc_tembot 
58      REAL(wp)   ::   zdiff_vol, zdiff_sal, zdiff_tem 
59      !!---------------------------------------------------------------------------
60      IF( nn_timing == 1 )   CALL timing_start('ice_dia')
61
62      IF( kt == nit000 .AND. lwp ) THEN
63         WRITE(numout,*)
64         WRITE(numout,*)'icedia'
65         WRITE(numout,*)'~~~~~~'
66      ENDIF
67
68      ! ----------------------- !
69      ! 1 -  Contents !
70      ! ----------------------- !
71      zbg_ivol = glob_sum( vt_i(:,:) * e1e2t(:,:) * tmask(:,:,1) * 1.e-9 )                  ! ice volume (km3)
72      zbg_svol = glob_sum( vt_s(:,:) * e1e2t(:,:) * tmask(:,:,1) * 1.e-9 )                  ! snow volume (km3)
73      zbg_area = glob_sum( at_i(:,:) * e1e2t(:,:) * tmask(:,:,1) * 1.e-6 )                  ! area (km2)
74      zbg_isal = glob_sum( SUM( smv_i(:,:,:), dim=3 ) * e1e2t(:,:) * tmask(:,:,1) * 1.e-9 ) ! salt content (pss*km3)
75      zbg_item = glob_sum( et_i * e1e2t(:,:) * tmask(:,:,1) * 1.e-20 )                      ! heat content (1.e20 J)
76      zbg_stem = glob_sum( et_s * e1e2t(:,:) * tmask(:,:,1) * 1.e-20 )                      ! heat content (1.e20 J)
77     
78      ! ---------------------------!
79      ! 2 - Trends due to forcing  !
80      ! ---------------------------!
81      z_frc_volbot = r1_rau0 * glob_sum( - ( wfx_ice(:,:) + wfx_snw(:,:) + wfx_err_sub(:,:) ) * e1e2t(:,:) * tmask(:,:,1) * 1.e-9 )  ! freshwater flux ice/snow-ocean
82      z_frc_voltop = r1_rau0 * glob_sum( - ( wfx_sub(:,:) + wfx_spr(:,:) ) * e1e2t(:,:) * tmask(:,:,1) * 1.e-9 )                     ! freshwater flux ice/snow-atm
83      z_frc_sal    = r1_rau0 * glob_sum( - sfx(:,:) * e1e2t(:,:) * tmask(:,:,1) * 1.e-9 )                                            ! salt fluxes ice/snow-ocean
84      z_frc_tembot =           glob_sum( hfx_out(:,:) * e1e2t(:,:) * tmask(:,:,1) * 1.e-20 )                                         ! heat on top of ocean (and below ice)
85      z_frc_temtop =           glob_sum( hfx_in (:,:) * e1e2t(:,:) * tmask(:,:,1) * 1.e-20 )                                         ! heat on top of ice-coean
86      !
87      frc_voltop  = frc_voltop  + z_frc_voltop  * rdt_ice ! km3
88      frc_volbot  = frc_volbot  + z_frc_volbot  * rdt_ice ! km3
89      frc_sal     = frc_sal     + z_frc_sal     * rdt_ice ! km3*pss
90      frc_temtop  = frc_temtop  + z_frc_temtop  * rdt_ice ! 1.e20 J
91      frc_tembot  = frc_tembot  + z_frc_tembot  * rdt_ice ! 1.e20 J
92           
93      ! ----------------------- !
94      ! 3 -  Content variations !
95      ! ----------------------- !
96      zdiff_vol = r1_rau0 * glob_sum( ( rhoic * vt_i(:,:) + rhosn * vt_s(:,:) - vol_loc_ini(:,:)  &  ! freshwater trend (km3)
97         &                            ) * e1e2t(:,:) * tmask(:,:,1) * 1.e-9 ) 
98      zdiff_sal = r1_rau0 * glob_sum( ( rhoic * SUM( smv_i(:,:,:), dim=3 ) - sal_loc_ini(:,:)     &  ! salt content trend (km3*pss)
99         &                            ) * e1e2t(:,:) * tmask(:,:,1) * 1.e-9 )
100      zdiff_tem =           glob_sum( ( et_i(:,:) + et_s(:,:) - tem_loc_ini(:,:)                  &  ! heat content trend (1.e20 J)
101      !  &                            + SUM( qevap_ice * a_i_b, dim=3 ) &     !! clem: I think this line should be commented (but needs a check)
102         &                            ) * e1e2t(:,:) * tmask(:,:,1) * 1.e-20 )
103
104      ! ----------------------- !
105      ! 4 -  Drifts             !
106      ! ----------------------- !
107      zdiff_vol = zdiff_vol - ( frc_voltop + frc_volbot )
108      zdiff_sal = zdiff_sal - frc_sal
109      zdiff_tem = zdiff_tem - ( frc_tembot - frc_temtop )
110
111      ! ----------------------- !
112      ! 5 - Diagnostics writing !
113      ! ----------------------- !
114      !
115      IF( iom_use('ibgvolume') )  CALL iom_put( 'ibgvolume' , zdiff_vol        )   ! ice/snow volume  drift            (km3 equivalent ocean water)         
116      IF( iom_use('ibgsaltco') )  CALL iom_put( 'ibgsaltco' , zdiff_sal        )   ! ice salt content drift            (psu*km3 equivalent ocean water)
117      IF( iom_use('ibgheatco') )  CALL iom_put( 'ibgheatco' , zdiff_tem        )   ! ice/snow heat content drift       (1.e20 J)
118      IF( iom_use('ibgheatfx') )  CALL iom_put( 'ibgheatfx' , zdiff_tem /      &   ! ice/snow heat flux drift          (W/m2)
119         &                                                    glob_sum( e1e2t(:,:) * tmask(:,:,1) * 1.e-20 * kt*rdt ) )
120
121      IF( iom_use('ibgfrcvoltop') )  CALL iom_put( 'ibgfrcvoltop' , frc_voltop )   ! vol  forcing ice/snw-atm          (km3 equivalent ocean water)
122      IF( iom_use('ibgfrcvolbot') )  CALL iom_put( 'ibgfrcvolbot' , frc_volbot )   ! vol  forcing ice/snw-ocean        (km3 equivalent ocean water)
123      IF( iom_use('ibgfrcsal') )     CALL iom_put( 'ibgfrcsal'    , frc_sal    )   ! sal - forcing                     (psu*km3 equivalent ocean water)   
124      IF( iom_use('ibgfrctemtop') )  CALL iom_put( 'ibgfrctemtop' , frc_temtop )   ! heat on top of ice/snw/ocean      (1.e20 J)   
125      IF( iom_use('ibgfrctembot') )  CALL iom_put( 'ibgfrctembot' , frc_tembot )   ! heat on top of ocean(below ice)   (1.e20 J)   
126      IF( iom_use('ibgfrchfxtop') )  CALL iom_put( 'ibgfrchfxtop' , frc_temtop / & ! heat on top of ice/snw/ocean      (W/m2)
127         &                                                    glob_sum( e1e2t(:,:) * tmask(:,:,1) * 1.e-20 * kt*rdt ) )
128      IF( iom_use('ibgfrchfxbot') )  CALL iom_put( 'ibgfrchfxbot' , frc_tembot / & ! heat on top of ocean(below ice)   (W/m2)
129         &                                                    glob_sum( e1e2t(:,:) * tmask(:,:,1) * 1.e-20 * kt*rdt ) )
130
131      IF( iom_use('ibgvol_tot' ) )  CALL iom_put( 'ibgvol_tot'  , zbg_ivol     )   ! ice volume                        (km3)
132      IF( iom_use('sbgvol_tot' ) )  CALL iom_put( 'sbgvol_tot'  , zbg_svol     )   ! snow volume                       (km3)
133      IF( iom_use('ibgarea_tot') )  CALL iom_put( 'ibgarea_tot' , zbg_area     )   ! ice area                          (km2)
134      IF( iom_use('ibgsalt_tot') )  CALL iom_put( 'ibgsalt_tot' , zbg_isal     )   ! ice salinity content              (pss*km3)
135      IF( iom_use('ibgheat_tot') )  CALL iom_put( 'ibgheat_tot' , zbg_item     )   ! ice heat content                  (1.e20 J)
136      IF( iom_use('sbgheat_tot') )  CALL iom_put( 'sbgheat_tot' , zbg_stem     )   ! snow heat content                 (1.e20 J)
137      !
138      IF( lrst_ice )   CALL ice_dia_rst( 'WRITE', kt_ice )
139      !
140      IF( nn_timing == 1 )   CALL timing_stop('ice_dia')
141      !
142   END SUBROUTINE ice_dia
143
144
145   SUBROUTINE ice_dia_init
146      !!---------------------------------------------------------------------------
147      !!                  ***  ROUTINE ice_dia_init  ***
148      !!     
149      !! ** Purpose: Initialization for the heat salt volume budgets
150      !!
151      !! ** Method : Compute initial heat content, salt content and volume
152      !!
153      !! ** Action : - Compute initial heat content, salt content and volume
154      !!             - Initialize forcing trends
155      !!             - Compute coefficients for conversion
156      !!---------------------------------------------------------------------------
157      INTEGER            ::   ierror   ! local integer
158      !!
159      !!NAMELIST/namicehsb/ blabla
160      !!----------------------------------------------------------------------
161      !
162      !!REWIND ( numnam_ice )              ! Read Namelist namicehsb
163      !!READ   ( numnam_ice, namicehsb )
164      !
165      IF(lwp) THEN                   ! Control print
166         WRITE(numout,*)
167         WRITE(numout,*) 'ice_dia_init : check the heat and salt budgets'
168         WRITE(numout,*) '~~~~~~~~~~~~'
169      ENDIF
170      !     
171      ALLOCATE( vol_loc_ini(jpi,jpj), sal_loc_ini(jpi,jpj), tem_loc_ini(jpi,jpj), STAT=ierror )
172      IF( ierror > 0 )  THEN
173         CALL ctl_stop( 'ice_dia: unable to allocate vol_loc_ini' )
174         RETURN
175      ENDIF
176
177      CALL ice_dia_rst( 'READ' )  !* read or initialize all required files
178      !
179   END SUBROUTINE ice_dia_init
180
181   SUBROUTINE ice_dia_rst( cdrw, kt )
182     !!---------------------------------------------------------------------
183     !!                   ***  ROUTINE limdia_rst  ***
184     !!                     
185     !! ** Purpose :   Read or write DIA file in restart file
186     !!
187     !! ** Method  :   use of IOM library
188     !!----------------------------------------------------------------------
189     CHARACTER(len=*), INTENT(in) ::   cdrw   ! "READ"/"WRITE" flag
190     INTEGER         , INTENT(in), OPTIONAL ::   kt     ! ice time-step
191     REAL(wp)                     ::   ziter
192     INTEGER                      ::   iter
193     !
194     !!----------------------------------------------------------------------
195     !
196     IF( TRIM(cdrw) == 'READ' ) THEN        ! Read/initialise
197        IF( ln_rstart ) THEN                   !* Read the restart file
198           !
199           CALL iom_get( numrir, 'kt_ice' , ziter )
200           IF(lwp) WRITE(numout,*)
201           IF(lwp) WRITE(numout,*) ' ice_dia_rst read at time step = ', ziter
202           IF(lwp) WRITE(numout,*) '~~~~~~~'
203           CALL iom_get( numrir, 'frc_voltop' , frc_voltop  )
204           CALL iom_get( numrir, 'frc_volbot' , frc_volbot  )
205           CALL iom_get( numrir, 'frc_temtop' , frc_temtop  )
206           CALL iom_get( numrir, 'frc_tembot' , frc_tembot  )
207           CALL iom_get( numrir, 'frc_sal'    , frc_sal     )
208           CALL iom_get( numrir, jpdom_autoglo, 'vol_loc_ini', vol_loc_ini )
209           CALL iom_get( numrir, jpdom_autoglo, 'tem_loc_ini', tem_loc_ini )
210           CALL iom_get( numrir, jpdom_autoglo, 'sal_loc_ini', sal_loc_ini )
211        ELSE
212           IF(lwp) WRITE(numout,*)
213           IF(lwp) WRITE(numout,*) ' ice_dia at initial state '
214           IF(lwp) WRITE(numout,*) '~~~~~~~'
215           ! set trends to 0
216           frc_voltop  = 0._wp                                         
217           frc_volbot  = 0._wp                                         
218           frc_temtop  = 0._wp                                                 
219           frc_tembot  = 0._wp                                                 
220           frc_sal     = 0._wp                                                 
221           ! record initial ice volume, salt and temp
222           vol_loc_ini(:,:) = rhoic * vt_i(:,:) + rhosn * vt_s(:,:)  ! ice/snow volume (kg/m2)
223           tem_loc_ini(:,:) = et_i(:,:) + et_s(:,:)                  ! ice/snow heat content (J)
224           sal_loc_ini(:,:) = rhoic * SUM( smv_i(:,:,:), dim=3 )     ! ice salt content (pss*kg/m2)
225           
226       ENDIF
227
228     ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN   ! Create restart file
229        !                                   ! -------------------
230        iter = kt + nn_fsbc - 1   ! ice restarts are written at kt == nitrst - nn_fsbc + 1
231
232        IF( iter == nitrst ) THEN
233           IF(lwp) WRITE(numout,*)
234           IF(lwp) WRITE(numout,*) ' ice_dia_rst write at time step = ', kt
235           IF(lwp) WRITE(numout,*) '~~~~~~~'
236        ENDIF
237
238        ! Write in numriw (if iter == nitrst)
239        ! ------------------
240        CALL iom_rstput( iter, nitrst, numriw, 'frc_voltop' , frc_voltop  )
241        CALL iom_rstput( iter, nitrst, numriw, 'frc_volbot' , frc_volbot  )
242        CALL iom_rstput( iter, nitrst, numriw, 'frc_temtop' , frc_temtop  )
243        CALL iom_rstput( iter, nitrst, numriw, 'frc_tembot' , frc_tembot  )
244        CALL iom_rstput( iter, nitrst, numriw, 'frc_sal'    , frc_sal     )
245        CALL iom_rstput( iter, nitrst, numriw, 'vol_loc_ini', vol_loc_ini )
246        CALL iom_rstput( iter, nitrst, numriw, 'tem_loc_ini', tem_loc_ini )
247        CALL iom_rstput( iter, nitrst, numriw, 'sal_loc_ini', sal_loc_ini )
248        !
249     ENDIF
250     !
251   END SUBROUTINE ice_dia_rst
252 
253#else
254   !!----------------------------------------------------------------------
255   !!   Default option :         Empty module          NO LIM sea-ice model
256   !!----------------------------------------------------------------------
257CONTAINS
258   SUBROUTINE ice_dia          ! Empty routine
259   END SUBROUTINE ice_dia
260#endif
261   !!======================================================================
262END MODULE icedia
Note: See TracBrowser for help on using the repository browser.