source: NEMO/trunk/src/ICE/icectl.F90 @ 11612

Last change on this file since 11612 was 11612, checked in by clem, 12 months ago

make Prather the default advection scheme for ice simulations and drastically reduce the number of communications in Prather routine (by a factor of 10)

  • Property svn:keywords set to Id
File size: 39.9 KB
Line 
1MODULE icectl
2   !!======================================================================
3   !!                     ***  MODULE  icectl  ***
4   !!   sea-ice : controls and prints
5   !!======================================================================
6   !! History :  3.5  !  2015-01  (M. Vancoppenolle) Original code
7   !!            3.7  !  2016-10  (C. Rousset)       Add routine ice_prt3D
8   !!            4.0  !  2018     (many people)      SI3 [aka Sea Ice cube]
9   !!----------------------------------------------------------------------
10#if defined key_si3
11   !!----------------------------------------------------------------------
12   !!   'key_si3'                                       SI3 sea-ice model
13   !!----------------------------------------------------------------------
14   !!    ice_cons_hsm     : conservation tests on heat, salt and mass during a  time step (global)
15   !!    ice_cons_final   : conservation tests on heat, salt and mass at end of time step (global)
16   !!    ice_cons2D       : conservation tests on heat, salt and mass at each gridcell
17   !!    ice_ctl          : control prints in case of crash
18   !!    ice_prt          : control prints at a given grid point
19   !!    ice_prt3D        : control prints of ice arrays
20   !!----------------------------------------------------------------------
21   USE phycst         ! physical constants
22   USE oce            ! ocean dynamics and tracers
23   USE dom_oce        ! ocean space and time domain
24   USE ice            ! sea-ice: variables
25   USE ice1D          ! sea-ice: thermodynamics variables
26   USE sbc_oce        ! Surface boundary condition: ocean fields
27   USE sbc_ice        ! Surface boundary condition: ice   fields
28   !
29   USE in_out_manager ! I/O manager
30   USE iom            ! I/O manager library
31   USE lib_mpp        ! MPP library
32   USE lib_fortran    ! fortran utilities (glob_sum + no signed zero)
33   USE timing         ! Timing
34   USE prtctl         ! Print control
35
36   IMPLICIT NONE
37   PRIVATE
38
39   PUBLIC   ice_cons_hsm
40   PUBLIC   ice_cons_final
41   PUBLIC   ice_cons2D
42   PUBLIC   ice_ctl
43   PUBLIC   ice_prt
44   PUBLIC   ice_prt3D
45
46   ! thresold rates for conservation
47   !    these values are changed by the namelist parameter rn_icechk, so that threshold = zchk * rn_icechk
48   REAL(wp), PARAMETER ::   zchk_m   = 2.5e-7   ! kg/m2/s <=> 1e-6 m of ice per hour spuriously gained/lost
49   REAL(wp), PARAMETER ::   zchk_s   = 2.5e-6   ! g/m2/s  <=> 1e-6 m of ice per hour spuriously gained/lost (considering s=10g/kg)
50   REAL(wp), PARAMETER ::   zchk_t   = 7.5e-2   ! W/m2    <=> 1e-6 m of ice per hour spuriously gained/lost (considering Lf=3e5J/kg)
51   
52   !! * Substitutions
53#  include "vectopt_loop_substitute.h90"
54   !!----------------------------------------------------------------------
55   !! NEMO/ICE 4.0 , NEMO Consortium (2018)
56   !! $Id$
57   !! Software governed by the CeCILL license (see ./LICENSE)
58   !!----------------------------------------------------------------------
59CONTAINS
60
61   SUBROUTINE ice_cons_hsm( icount, cd_routine, pdiag_v, pdiag_s, pdiag_t, pdiag_fv, pdiag_fs, pdiag_ft )
62      !!-------------------------------------------------------------------
63      !!                       ***  ROUTINE ice_cons_hsm ***
64      !!
65      !! ** Purpose : Test the conservation of heat, salt and mass for each ice routine
66      !!                     + test if ice concentration and volume are > 0
67      !!
68      !! ** Method  : This is an online diagnostics which can be activated with ln_icediachk=true
69      !!              It prints in ocean.output if there is a violation of conservation at each time-step
70      !!              The thresholds (zchk_m, zchk_s, zchk_t) determine violations
71      !!              For salt and heat thresholds, ice is considered to have a salinity of 10
72      !!              and a heat content of 3e5 J/kg (=latent heat of fusion)
73      !!-------------------------------------------------------------------
74      INTEGER         , INTENT(in)    ::   icount        ! called at: =0 the begining of the routine, =1  the end
75      CHARACTER(len=*), INTENT(in)    ::   cd_routine    ! name of the routine
76      REAL(wp)        , INTENT(inout) ::   pdiag_v, pdiag_s, pdiag_t, pdiag_fv, pdiag_fs, pdiag_ft
77      !!
78      REAL(wp) ::   zdiag_mass, zdiag_salt, zdiag_heat, &
79         &          zdiag_vmin, zdiag_amin, zdiag_amax, zdiag_eimin, zdiag_esmin, zdiag_smin
80      REAL(wp) ::   zvtrp, zetrp
81      REAL(wp) ::   zarea
82      !!-------------------------------------------------------------------
83      !
84      IF( icount == 0 ) THEN
85
86         pdiag_v = glob_sum( 'icectl',   SUM( v_i * rhoi + v_s * rhos, dim=3 ) * e1e2t )
87         pdiag_s = glob_sum( 'icectl',   SUM( sv_i * rhoi            , dim=3 ) * e1e2t )
88         pdiag_t = glob_sum( 'icectl', ( SUM( SUM( e_i, dim=4 ), dim=3 ) + SUM( SUM( e_s, dim=4 ), dim=3 ) ) * e1e2t )
89
90         ! mass flux
91         pdiag_fv = glob_sum( 'icectl',  &
92            &                         ( wfx_bog + wfx_bom + wfx_sum + wfx_sni + wfx_opw + wfx_res + wfx_dyn + wfx_lam + wfx_pnd + &
93            &                           wfx_snw_sni + wfx_snw_sum + wfx_snw_dyn + wfx_snw_sub + wfx_ice_sub + wfx_spr ) * e1e2t )
94         ! salt flux
95         pdiag_fs = glob_sum( 'icectl',  &
96            &                         ( sfx_bri + sfx_bog + sfx_bom + sfx_sum + sfx_sni + &
97            &                           sfx_opw + sfx_res + sfx_dyn + sfx_sub + sfx_lam ) * e1e2t )
98         ! heat flux
99         pdiag_ft = glob_sum( 'icectl',  &
100            &                         (   hfx_sum + hfx_bom + hfx_bog + hfx_dif + hfx_opw + hfx_snw  &
101            &                           - hfx_thd - hfx_dyn - hfx_res - hfx_sub - hfx_spr ) * e1e2t )
102
103      ELSEIF( icount == 1 ) THEN
104
105         ! -- mass diag -- !
106         zdiag_mass = ( glob_sum( 'icectl', SUM( v_i * rhoi + v_s * rhos, dim=3 ) * e1e2t ) - pdiag_v ) * r1_rdtice       &
107            &         + glob_sum( 'icectl', ( wfx_bog + wfx_bom + wfx_sum + wfx_sni + wfx_opw + wfx_res + wfx_dyn +       &
108            &                                 wfx_lam + wfx_pnd + wfx_snw_sni + wfx_snw_sum + wfx_snw_dyn + wfx_snw_sub + &
109            &                                 wfx_ice_sub + wfx_spr ) * e1e2t )                                           &
110            &         - pdiag_fv
111         !
112         ! -- salt diag -- !
113         zdiag_salt = ( glob_sum( 'icectl', SUM( sv_i * rhoi , dim=3 ) * e1e2t ) - pdiag_s ) * r1_rdtice  &
114            &         + glob_sum( 'icectl', ( sfx_bri + sfx_bog + sfx_bom + sfx_sum + sfx_sni +           &
115            &                                 sfx_opw + sfx_res + sfx_dyn + sfx_sub + sfx_lam ) * e1e2t ) &
116            &         - pdiag_fs
117         !
118         ! -- heat diag -- !
119         zdiag_heat = ( glob_sum( 'icectl', ( SUM(SUM(e_i, dim=4), dim=3) + SUM(SUM(e_s, dim=4), dim=3) ) * e1e2t ) - pdiag_t &
120            &         ) * r1_rdtice                                                                                           &
121            &         + glob_sum( 'icectl', (  hfx_sum + hfx_bom + hfx_bog + hfx_dif + hfx_opw + hfx_snw                      &
122            &                                - hfx_thd - hfx_dyn - hfx_res - hfx_sub - hfx_spr ) * e1e2t )                    &
123            &         - pdiag_ft
124
125         ! -- min/max diag -- !
126         zdiag_amax  = glob_max( 'icectl', SUM( a_i, dim=3 ) )
127         zdiag_vmin  = glob_min( 'icectl', v_i )
128         zdiag_amin  = glob_min( 'icectl', a_i )
129         zdiag_smin  = glob_min( 'icectl', sv_i )
130         zdiag_eimin = glob_min( 'icectl', SUM( e_i, dim=3 ) )
131         zdiag_esmin = glob_min( 'icectl', SUM( e_s, dim=3 ) )
132
133         ! -- advection scheme is conservative? -- !
134         zvtrp = glob_sum( 'icectl', ( diag_trp_vi * rhoi + diag_trp_vs * rhos ) * e1e2t ) ! must be close to 0 (only for Prather)
135         zetrp = glob_sum( 'icectl', ( diag_trp_ei        + diag_trp_es        ) * e1e2t ) ! must be close to 0 (only for Prather)
136
137         ! ice area (+epsi10 to set a threshold > 0 when there is no ice)
138         zarea = glob_sum( 'icectl', SUM( a_i + epsi10, dim=3 ) * e1e2t )
139
140         IF( lwp ) THEN
141            ! check conservation issues
142            IF( ABS(zdiag_mass) > zchk_m * rn_icechk_glo * zarea ) &
143               &                   WRITE(numout,*)   cd_routine,' : violation mass cons. [kg] = ',zdiag_mass * rdt_ice
144            IF( ABS(zdiag_salt) > zchk_s * rn_icechk_glo * zarea ) &
145               &                   WRITE(numout,*)   cd_routine,' : violation salt cons. [g]  = ',zdiag_salt * rdt_ice
146            IF( ABS(zdiag_heat) > zchk_t * rn_icechk_glo * zarea ) &
147               &                   WRITE(numout,*)   cd_routine,' : violation heat cons. [J]  = ',zdiag_heat * rdt_ice
148            ! check negative values
149            IF( zdiag_vmin  < 0. ) WRITE(numout,*)   cd_routine,' : violation v_i < 0         = ',zdiag_vmin
150            IF( zdiag_amin  < 0. ) WRITE(numout,*)   cd_routine,' : violation a_i < 0         = ',zdiag_amin
151            IF( zdiag_smin  < 0. ) WRITE(numout,*)   cd_routine,' : violation s_i < 0         = ',zdiag_smin
152            IF( zdiag_eimin < 0. ) WRITE(numout,*)   cd_routine,' : violation e_i < 0         = ',zdiag_eimin
153            IF( zdiag_esmin < 0. ) WRITE(numout,*)   cd_routine,' : violation e_s < 0         = ',zdiag_esmin
154            ! check maximum ice concentration
155            IF( zdiag_amax > MAX(rn_amax_n,rn_amax_s)+epsi10 .AND. cd_routine /= 'icedyn_adv' .AND. cd_routine /= 'icedyn_rdgrft' ) &
156               &                   WRITE(numout,*)   cd_routine,' : violation a_i > amax      = ',zdiag_amax
157            ! check if advection scheme is conservative
158            !    only check for Prather because Ultimate-Macho uses corrective fluxes (wfx etc)
159            !    so the formulation for conservation is different (and not coded)
160            !    it does not mean UM is not conservative (it is checked with above prints) => update (09/2019): same for Prather now
161            !IF( ln_adv_Pra .AND. ABS(zvtrp) > zchk_m * rn_icechk_glo * zarea .AND. cd_routine == 'icedyn_adv' ) &
162            !   &                   WRITE(numout,*)   cd_routine,' : violation adv scheme [kg] = ',zvtrp * rdt_ice
163         ENDIF
164         !
165      ENDIF
166
167   END SUBROUTINE ice_cons_hsm
168
169   SUBROUTINE ice_cons_final( cd_routine )
170      !!-------------------------------------------------------------------
171      !!                     ***  ROUTINE ice_cons_final ***
172      !!
173      !! ** Purpose : Test the conservation of heat, salt and mass at the end of each ice time-step
174      !!
175      !! ** Method  : This is an online diagnostics which can be activated with ln_icediachk=true
176      !!              It prints in ocean.output if there is a violation of conservation at each time-step
177      !!              The thresholds (zchk_m, zchk_s, zchk_t) determine the violations
178      !!              For salt and heat thresholds, ice is considered to have a salinity of 10
179      !!              and a heat content of 3e5 J/kg (=latent heat of fusion)
180      !!-------------------------------------------------------------------
181      CHARACTER(len=*), INTENT(in) ::   cd_routine    ! name of the routine
182      REAL(wp) ::   zdiag_mass, zdiag_salt, zdiag_heat
183      REAL(wp) ::   zarea
184      !!-------------------------------------------------------------------
185
186      ! water flux
187      ! -- mass diag -- !
188      zdiag_mass = glob_sum( 'icectl', ( wfx_ice + wfx_snw + wfx_spr + wfx_sub + diag_vice + diag_vsnw ) * e1e2t )
189
190      ! -- salt diag -- !
191      zdiag_salt = glob_sum( 'icectl', ( sfx + diag_sice ) * e1e2t )
192
193      ! -- heat diag -- !
194      ! clem: not the good formulation
195      !!zdiag_heat  = glob_sum( 'icectl', ( qt_oce_ai - qt_atm_oi + diag_heat + hfx_thd + hfx_dyn + hfx_res + hfx_sub + hfx_spr  &
196      !!   &                              ) * e1e2t )
197
198      ! ice area (+epsi10 to set a threshold > 0 when there is no ice)
199      zarea = glob_sum( 'icectl', SUM( a_i + epsi10, dim=3 ) * e1e2t )
200
201      IF( lwp ) THEN
202         IF( ABS(zdiag_mass) > zchk_m * rn_icechk_glo * zarea ) &
203            &                   WRITE(numout,*) cd_routine,' : violation mass cons. [kg] = ',zdiag_mass * rdt_ice
204         IF( ABS(zdiag_salt) > zchk_s * rn_icechk_glo * zarea ) &
205            &                   WRITE(numout,*) cd_routine,' : violation salt cons. [g]  = ',zdiag_salt * rdt_ice
206         !!IF( ABS(zdiag_heat) > zchk_t * rn_icechk_glo * zarea ) WRITE(numout,*) cd_routine,' : violation heat cons. [J]  = ',zdiag_heat * rdt_ice
207      ENDIF
208      !
209   END SUBROUTINE ice_cons_final
210
211   SUBROUTINE ice_cons2D( icount, cd_routine, pdiag_v, pdiag_s, pdiag_t, pdiag_fv, pdiag_fs, pdiag_ft )
212      !!-------------------------------------------------------------------
213      !!                       ***  ROUTINE ice_cons2D ***
214      !!
215      !! ** Purpose : Test the conservation of heat, salt and mass for each ice routine
216      !!                     + test if ice concentration and volume are > 0
217      !!
218      !! ** Method  : This is an online diagnostics which can be activated with ln_icediachk=true
219      !!              It stops the code if there is a violation of conservation at any gridcell
220      !!-------------------------------------------------------------------
221      INTEGER         , INTENT(in) ::   icount        ! called at: =0 the begining of the routine, =1  the end
222      CHARACTER(len=*), INTENT(in) ::   cd_routine    ! name of the routine
223      REAL(wp)        , DIMENSION(jpi,jpj), INTENT(inout) ::   pdiag_v, pdiag_s, pdiag_t, pdiag_fv, pdiag_fs, pdiag_ft
224      !!
225      REAL(wp), DIMENSION(jpi,jpj) ::   zdiag_mass, zdiag_salt, zdiag_heat, &
226         &                              zdiag_amin, zdiag_vmin, zdiag_smin, zdiag_emin !!, zdiag_amax 
227      INTEGER ::   jl, jk
228      LOGICAL ::   ll_stop_m = .FALSE.
229      LOGICAL ::   ll_stop_s = .FALSE.
230      LOGICAL ::   ll_stop_t = .FALSE.
231      CHARACTER(len=120) ::   clnam   ! filename for the output
232      !!-------------------------------------------------------------------
233      !
234      IF( icount == 0 ) THEN
235
236         pdiag_v = SUM( v_i  * rhoi + v_s * rhos, dim=3 )
237         pdiag_s = SUM( sv_i * rhoi             , dim=3 )
238         pdiag_t = SUM( SUM( e_i, dim=4 ), dim=3 ) + SUM( SUM( e_s, dim=4 ), dim=3 )
239
240         ! mass flux
241         pdiag_fv = wfx_bog + wfx_bom + wfx_sum + wfx_sni + wfx_opw + wfx_res + wfx_dyn + wfx_lam + wfx_pnd  +  &
242            &       wfx_snw_sni + wfx_snw_sum + wfx_snw_dyn + wfx_snw_sub + wfx_ice_sub + wfx_spr
243         ! salt flux
244         pdiag_fs = sfx_bri + sfx_bog + sfx_bom + sfx_sum + sfx_sni + sfx_opw + sfx_res + sfx_dyn + sfx_sub + sfx_lam 
245         ! heat flux
246         pdiag_ft =   hfx_sum + hfx_bom + hfx_bog + hfx_dif + hfx_opw + hfx_snw  & 
247            &       - hfx_thd - hfx_dyn - hfx_res - hfx_sub - hfx_spr
248
249      ELSEIF( icount == 1 ) THEN
250
251         ! -- mass diag -- !
252         zdiag_mass =   ( SUM( v_i * rhoi + v_s * rhos, dim=3 ) - pdiag_v ) * r1_rdtice                             &
253            &         + ( wfx_bog + wfx_bom + wfx_sum + wfx_sni + wfx_opw + wfx_res + wfx_dyn + wfx_lam + wfx_pnd + &
254            &             wfx_snw_sni + wfx_snw_sum + wfx_snw_dyn + wfx_snw_sub + wfx_ice_sub + wfx_spr )           &
255            &         - pdiag_fv
256         IF( MAXVAL( ABS(zdiag_mass) ) > zchk_m * rn_icechk_cel )   ll_stop_m = .TRUE.
257         !
258         ! -- salt diag -- !
259         zdiag_salt =   ( SUM( sv_i * rhoi , dim=3 ) - pdiag_s ) * r1_rdtice                                                  &
260            &         + ( sfx_bri + sfx_bog + sfx_bom + sfx_sum + sfx_sni + sfx_opw + sfx_res + sfx_dyn + sfx_sub + sfx_lam ) &
261            &         - pdiag_fs
262         IF( MAXVAL( ABS(zdiag_salt) ) > zchk_s * rn_icechk_cel )   ll_stop_s = .TRUE.
263         !
264         ! -- heat diag -- !
265         zdiag_heat =   ( SUM( SUM( e_i, dim=4 ), dim=3 ) + SUM( SUM( e_s, dim=4 ), dim=3 ) - pdiag_t ) * r1_rdtice &
266            &         + (  hfx_sum + hfx_bom + hfx_bog + hfx_dif + hfx_opw + hfx_snw                                & 
267            &            - hfx_thd - hfx_dyn - hfx_res - hfx_sub - hfx_spr )                                        &
268            &         - pdiag_ft
269         IF( MAXVAL( ABS(zdiag_heat) ) > zchk_t * rn_icechk_cel )   ll_stop_t = .TRUE.
270         !
271         ! -- other diags -- !
272         ! a_i < 0
273         zdiag_amin(:,:) = 0._wp
274         DO jl = 1, jpl
275            WHERE( a_i(:,:,jl) < 0._wp )   zdiag_amin(:,:) = 1._wp
276         ENDDO
277         ! v_i < 0
278         zdiag_vmin(:,:) = 0._wp
279         DO jl = 1, jpl
280            WHERE( v_i(:,:,jl) < 0._wp )   zdiag_vmin(:,:) = 1._wp
281         ENDDO
282         ! s_i < 0
283         zdiag_smin(:,:) = 0._wp
284         DO jl = 1, jpl
285            WHERE( s_i(:,:,jl) < 0._wp )   zdiag_smin(:,:) = 1._wp
286         ENDDO
287         ! e_i < 0
288         zdiag_emin(:,:) = 0._wp
289         DO jl = 1, jpl
290            DO jk = 1, nlay_i
291               WHERE( e_i(:,:,jk,jl) < 0._wp )   zdiag_emin(:,:) = 1._wp
292            ENDDO
293         ENDDO
294         ! a_i > amax
295         !WHERE( SUM( a_i, dim=3 ) > ( MAX( rn_amax_n, rn_amax_s ) + epsi10 )   ;   zdiag_amax(:,:) = 1._wp
296         !ELSEWHERE                                                             ;   zdiag_amax(:,:) = 0._wp
297         !END WHERE
298
299         IF( ll_stop_m .OR. ll_stop_s .OR. ll_stop_t ) THEN
300            clnam = 'diag_ice_conservation_'//cd_routine
301            CALL ice_cons_wri( clnam, zdiag_mass, zdiag_salt, zdiag_heat, zdiag_amin, zdiag_vmin, zdiag_smin, zdiag_emin )
302         ENDIF
303
304         IF( ll_stop_m )   CALL ctl_stop( 'STOP', cd_routine//': ice mass conservation issue' )
305         IF( ll_stop_s )   CALL ctl_stop( 'STOP', cd_routine//': ice salt conservation issue' )
306         IF( ll_stop_t )   CALL ctl_stop( 'STOP', cd_routine//': ice heat conservation issue' )
307         
308      ENDIF
309
310   END SUBROUTINE ice_cons2D
311
312   SUBROUTINE ice_cons_wri( cdfile_name, pdiag_mass, pdiag_salt, pdiag_heat, pdiag_amin, pdiag_vmin, pdiag_smin, pdiag_emin )
313      !!---------------------------------------------------------------------
314      !!                 ***  ROUTINE ice_cons_wri  ***
315      !!       
316      !! ** Purpose :   create a NetCDF file named cdfile_name which contains
317      !!                the instantaneous fields when conservation issue occurs
318      !!
319      !! ** Method  :   NetCDF files using ioipsl
320      !!----------------------------------------------------------------------
321      CHARACTER(len=*), INTENT( in ) ::   cdfile_name      ! name of the file created
322      REAL(wp), DIMENSION(:,:), INTENT( in ) ::   pdiag_mass, pdiag_salt, pdiag_heat, &
323         &                                        pdiag_amin, pdiag_vmin, pdiag_smin, pdiag_emin !!, pdiag_amax 
324      !!
325      INTEGER ::   inum
326      !!----------------------------------------------------------------------
327      !
328      IF(lwp) WRITE(numout,*)
329      IF(lwp) WRITE(numout,*) 'ice_cons_wri : single instantaneous ice state'
330      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~  named :', cdfile_name, '...nc'
331      IF(lwp) WRITE(numout,*)               
332
333      CALL iom_open( TRIM(cdfile_name), inum, ldwrt = .TRUE., kdlev = jpl )
334     
335      CALL iom_rstput( 0, 0, inum, 'cons_mass', pdiag_mass(:,:) , ktype = jp_r8 )    ! ice mass spurious lost/gain
336      CALL iom_rstput( 0, 0, inum, 'cons_salt', pdiag_salt(:,:) , ktype = jp_r8 )    ! ice salt spurious lost/gain
337      CALL iom_rstput( 0, 0, inum, 'cons_heat', pdiag_heat(:,:) , ktype = jp_r8 )    ! ice heat spurious lost/gain
338      ! other diags
339      CALL iom_rstput( 0, 0, inum, 'aneg_count', pdiag_amin(:,:) , ktype = jp_r8 )    !
340      CALL iom_rstput( 0, 0, inum, 'vneg_count', pdiag_vmin(:,:) , ktype = jp_r8 )    !
341      CALL iom_rstput( 0, 0, inum, 'sneg_count', pdiag_smin(:,:) , ktype = jp_r8 )    !
342      CALL iom_rstput( 0, 0, inum, 'eneg_count', pdiag_emin(:,:) , ktype = jp_r8 )    !
343     
344      CALL iom_close( inum )
345
346   END SUBROUTINE ice_cons_wri
347   
348   SUBROUTINE ice_ctl( kt )
349      !!-------------------------------------------------------------------
350      !!                   ***  ROUTINE ice_ctl ***
351      !!                 
352      !! ** Purpose :   Alerts in case of model crash
353      !!-------------------------------------------------------------------
354      INTEGER, INTENT(in) ::   kt      ! ocean time step
355      INTEGER  ::   ji, jj, jk,  jl   ! dummy loop indices
356      INTEGER  ::   inb_altests       ! number of alert tests (max 20)
357      INTEGER  ::   ialert_id         ! number of the current alert
358      REAL(wp) ::   ztmelts           ! ice layer melting point
359      CHARACTER (len=30), DIMENSION(20) ::   cl_alname   ! name of alert
360      INTEGER           , DIMENSION(20) ::   inb_alp     ! number of alerts positive
361      !!-------------------------------------------------------------------
362
363      inb_altests = 10
364      inb_alp(:)  =  0
365
366      ! Alert if incompatible volume and concentration
367      ialert_id = 2 ! reference number of this alert
368      cl_alname(ialert_id) = ' Incompat vol and con         '    ! name of the alert
369      DO jl = 1, jpl
370         DO jj = 1, jpj
371            DO ji = 1, jpi
372               IF(  v_i(ji,jj,jl) /= 0._wp   .AND.   a_i(ji,jj,jl) == 0._wp   ) THEN
373                  WRITE(numout,*) ' ALERTE 2 :   Incompatible volume and concentration '
374                  inb_alp(ialert_id) = inb_alp(ialert_id) + 1
375               ENDIF
376            END DO
377         END DO
378      END DO
379
380      ! Alerte if very thick ice
381      ialert_id = 3 ! reference number of this alert
382      cl_alname(ialert_id) = ' Very thick ice               ' ! name of the alert
383      jl = jpl 
384      DO jj = 1, jpj
385         DO ji = 1, jpi
386            IF(   h_i(ji,jj,jl)  >  50._wp   ) THEN
387               WRITE(numout,*) ' ALERTE 3 :   Very thick ice'
388               !CALL ice_prt( kt, ji, jj, 2, ' ALERTE 3 :   Very thick ice ' )
389               inb_alp(ialert_id) = inb_alp(ialert_id) + 1
390            ENDIF
391         END DO
392      END DO
393
394      ! Alert if very fast ice
395      ialert_id = 4 ! reference number of this alert
396      cl_alname(ialert_id) = ' Very fast ice               ' ! name of the alert
397      DO jj = 1, jpj
398         DO ji = 1, jpi
399            IF(   MAX( ABS( u_ice(ji,jj) ), ABS( v_ice(ji,jj) ) ) > 2.  .AND.  &
400               &  at_i(ji,jj) > 0._wp   ) THEN
401               WRITE(numout,*) ' ALERTE 4 :   Very fast ice'
402               !CALL ice_prt( kt, ji, jj, 1, ' ALERTE 4 :   Very fast ice ' )
403               inb_alp(ialert_id) = inb_alp(ialert_id) + 1
404            ENDIF
405         END DO
406      END DO
407
408      ! Alert on salt flux
409      ialert_id = 5 ! reference number of this alert
410      cl_alname(ialert_id) = ' High salt flux               ' ! name of the alert
411      DO jj = 1, jpj
412         DO ji = 1, jpi
413            IF( ABS( sfx (ji,jj) ) > 1.0e-2 ) THEN  ! = 1 psu/day for 1m ocean depth
414               WRITE(numout,*) ' ALERTE 5 :   High salt flux'
415               !CALL ice_prt( kt, ji, jj, 3, ' ALERTE 5 :   High salt flux ' )
416               inb_alp(ialert_id) = inb_alp(ialert_id) + 1
417            ENDIF
418         END DO
419      END DO
420
421      ! Alert if there is ice on continents
422      ialert_id = 6 ! reference number of this alert
423      cl_alname(ialert_id) = ' Ice on continents           ' ! name of the alert
424      DO jj = 1, jpj
425         DO ji = 1, jpi
426            IF(   tmask(ji,jj,1) <= 0._wp   .AND.   at_i(ji,jj) > 0._wp   ) THEN
427               WRITE(numout,*) ' ALERTE 6 :   Ice on continents'
428               !CALL ice_prt( kt, ji, jj, 1, ' ALERTE 6 :   Ice on continents ' )
429               inb_alp(ialert_id) = inb_alp(ialert_id) + 1
430            ENDIF
431         END DO
432      END DO
433
434!
435!     ! Alert if very fresh ice
436      ialert_id = 7 ! reference number of this alert
437      cl_alname(ialert_id) = ' Very fresh ice               ' ! name of the alert
438      DO jl = 1, jpl
439         DO jj = 1, jpj
440            DO ji = 1, jpi
441               IF( s_i(ji,jj,jl) < 0.1 .AND. a_i(ji,jj,jl) > 0._wp ) THEN
442                  WRITE(numout,*) ' ALERTE 7 :   Very fresh ice'
443!                 CALL ice_prt(kt,ji,jj,1, ' ALERTE 7 :   Very fresh ice ' )
444                  inb_alp(ialert_id) = inb_alp(ialert_id) + 1
445               ENDIF
446            END DO
447         END DO
448      END DO
449!
450      ! Alert if qns very big
451      ialert_id = 8 ! reference number of this alert
452      cl_alname(ialert_id) = ' fnsolar very big             ' ! name of the alert
453      DO jj = 1, jpj
454         DO ji = 1, jpi
455            IF( ABS( qns(ji,jj) ) > 1500._wp .AND. at_i(ji,jj) > 0._wp ) THEN
456               !
457               WRITE(numout,*) ' ALERTE 8 :   Very high non-solar heat flux'
458               !CALL ice_prt( kt, ji, jj, 2, '   ')
459               inb_alp(ialert_id) = inb_alp(ialert_id) + 1
460               !
461            ENDIF
462         END DO
463      END DO
464      !+++++
465
466!     ! Alert if too old ice
467      ialert_id = 9 ! reference number of this alert
468      cl_alname(ialert_id) = ' Very old   ice               ' ! name of the alert
469      DO jl = 1, jpl
470         DO jj = 1, jpj
471            DO ji = 1, jpi
472               IF ( ( ( ABS( o_i(ji,jj,jl) ) > rdt_ice ) .OR. &
473                      ( ABS( o_i(ji,jj,jl) ) < 0._wp) ) .AND. &
474                             ( a_i(ji,jj,jl) > 0._wp ) ) THEN
475                  WRITE(numout,*) ' ALERTE 9 :   Wrong ice age'
476                  !CALL ice_prt( kt, ji, jj, 1, ' ALERTE 9 :   Wrong ice age ')
477                  inb_alp(ialert_id) = inb_alp(ialert_id) + 1
478               ENDIF
479            END DO
480         END DO
481      END DO
482 
483      ! Alert if very warm ice
484      ialert_id = 10 ! reference number of this alert
485      cl_alname(ialert_id) = ' Very warm ice                ' ! name of the alert
486      inb_alp(ialert_id) = 0
487      DO jl = 1, jpl
488         DO jk = 1, nlay_i
489            DO jj = 1, jpj
490               DO ji = 1, jpi
491                  ztmelts    =  -rTmlt * sz_i(ji,jj,jk,jl) + rt0
492                  IF( t_i(ji,jj,jk,jl) > ztmelts  .AND.  v_i(ji,jj,jl) > 1.e-10   &
493                     &                            .AND.  a_i(ji,jj,jl) > 0._wp   ) THEN
494                     WRITE(numout,*) ' ALERTE 10 :   Very warm ice'
495                    inb_alp(ialert_id) = inb_alp(ialert_id) + 1
496                  ENDIF
497               END DO
498            END DO
499         END DO
500      END DO
501
502      ! sum of the alerts on all processors
503      IF( lk_mpp ) THEN
504         DO ialert_id = 1, inb_altests
505            CALL mpp_sum('icectl', inb_alp(ialert_id))
506         END DO
507      ENDIF
508
509      ! print alerts
510      IF( lwp ) THEN
511         ialert_id = 1                                 ! reference number of this alert
512         cl_alname(ialert_id) = ' NO alerte 1      '   ! name of the alert
513         WRITE(numout,*) ' time step ',kt
514         WRITE(numout,*) ' All alerts at the end of ice model '
515         DO ialert_id = 1, inb_altests
516            WRITE(numout,*) ialert_id, cl_alname(ialert_id)//' : ', inb_alp(ialert_id), ' times ! '
517         END DO
518      ENDIF
519     !
520   END SUBROUTINE ice_ctl
521 
522   SUBROUTINE ice_prt( kt, ki, kj, kn, cd1 )
523      !!-------------------------------------------------------------------
524      !!                   ***  ROUTINE ice_prt ***
525      !!                 
526      !! ** Purpose :   Writes global ice state on the (i,j) point
527      !!                in ocean.ouput
528      !!                3 possibilities exist
529      !!                n = 1/-1 -> simple ice state
530      !!                n = 2    -> exhaustive state
531      !!                n = 3    -> ice/ocean salt fluxes
532      !!
533      !! ** input   :   point coordinates (i,j)
534      !!                n : number of the option
535      !!-------------------------------------------------------------------
536      INTEGER         , INTENT(in) ::   kt            ! ocean time step
537      INTEGER         , INTENT(in) ::   ki, kj, kn    ! ocean gridpoint indices
538      CHARACTER(len=*), INTENT(in) ::   cd1           !
539      !!
540      INTEGER :: jl, ji, jj
541      !!-------------------------------------------------------------------
542
543      DO ji = mi0(ki), mi1(ki)
544         DO jj = mj0(kj), mj1(kj)
545
546            WRITE(numout,*) ' time step ',kt,' ',cd1             ! print title
547
548            !----------------
549            !  Simple state
550            !----------------
551           
552            IF ( kn == 1 .OR. kn == -1 ) THEN
553               WRITE(numout,*) ' ice_prt - Point : ',ji,jj
554               WRITE(numout,*) ' ~~~~~~~~~~~~~~ '
555               WRITE(numout,*) ' Simple state '
556               WRITE(numout,*) ' masks s,u,v   : ', tmask(ji,jj,1), umask(ji,jj,1), vmask(ji,jj,1)
557               WRITE(numout,*) ' lat - long    : ', gphit(ji,jj), glamt(ji,jj)
558               WRITE(numout,*) ' - Ice drift   '
559               WRITE(numout,*) '   ~~~~~~~~~~~ '
560               WRITE(numout,*) ' u_ice(i-1,j)  : ', u_ice(ji-1,jj)
561               WRITE(numout,*) ' u_ice(i  ,j)  : ', u_ice(ji,jj)
562               WRITE(numout,*) ' v_ice(i  ,j-1): ', v_ice(ji,jj-1)
563               WRITE(numout,*) ' v_ice(i  ,j)  : ', v_ice(ji,jj)
564               WRITE(numout,*) ' strength      : ', strength(ji,jj)
565               WRITE(numout,*)
566               WRITE(numout,*) ' - Cell values '
567               WRITE(numout,*) '   ~~~~~~~~~~~ '
568               WRITE(numout,*) ' at_i          : ', at_i(ji,jj)       
569               WRITE(numout,*) ' ato_i         : ', ato_i(ji,jj)       
570               WRITE(numout,*) ' vt_i          : ', vt_i(ji,jj)       
571               WRITE(numout,*) ' vt_s          : ', vt_s(ji,jj)       
572               DO jl = 1, jpl
573                  WRITE(numout,*) ' - Category (', jl,')'
574                  WRITE(numout,*) ' a_i           : ', a_i(ji,jj,jl)
575                  WRITE(numout,*) ' h_i           : ', h_i(ji,jj,jl)
576                  WRITE(numout,*) ' h_s           : ', h_s(ji,jj,jl)
577                  WRITE(numout,*) ' v_i           : ', v_i(ji,jj,jl)
578                  WRITE(numout,*) ' v_s           : ', v_s(ji,jj,jl)
579                  WRITE(numout,*) ' e_s           : ', e_s(ji,jj,1:nlay_s,jl)
580                  WRITE(numout,*) ' e_i           : ', e_i(ji,jj,1:nlay_i,jl)
581                  WRITE(numout,*) ' t_su          : ', t_su(ji,jj,jl)
582                  WRITE(numout,*) ' t_snow        : ', t_s(ji,jj,1:nlay_s,jl)
583                  WRITE(numout,*) ' t_i           : ', t_i(ji,jj,1:nlay_i,jl)
584                  WRITE(numout,*) ' s_i           : ', s_i(ji,jj,jl)
585                  WRITE(numout,*) ' sv_i          : ', sv_i(ji,jj,jl)
586                  WRITE(numout,*)
587               END DO
588            ENDIF
589
590            !--------------------
591            !  Exhaustive state
592            !--------------------
593           
594            IF ( kn .EQ. 2 ) THEN
595               WRITE(numout,*) ' ice_prt - Point : ',ji,jj
596               WRITE(numout,*) ' ~~~~~~~~~~~~~~ '
597               WRITE(numout,*) ' Exhaustive state '
598               WRITE(numout,*) ' lat - long ', gphit(ji,jj), glamt(ji,jj)
599               WRITE(numout,*) 
600               WRITE(numout,*) ' - Cell values '
601               WRITE(numout,*) '   ~~~~~~~~~~~ '
602               WRITE(numout,*) ' at_i          : ', at_i(ji,jj)       
603               WRITE(numout,*) ' vt_i          : ', vt_i(ji,jj)       
604               WRITE(numout,*) ' vt_s          : ', vt_s(ji,jj)       
605               WRITE(numout,*) ' u_ice(i-1,j)  : ', u_ice(ji-1,jj)
606               WRITE(numout,*) ' u_ice(i  ,j)  : ', u_ice(ji,jj)
607               WRITE(numout,*) ' v_ice(i  ,j-1): ', v_ice(ji,jj-1)
608               WRITE(numout,*) ' v_ice(i  ,j)  : ', v_ice(ji,jj)
609               WRITE(numout,*) ' strength      : ', strength(ji,jj)
610               WRITE(numout,*) ' u_ice_b       : ', u_ice_b(ji,jj)    , ' v_ice_b       : ', v_ice_b(ji,jj) 
611               WRITE(numout,*)
612               
613               DO jl = 1, jpl
614                  WRITE(numout,*) ' - Category (',jl,')'
615                  WRITE(numout,*) '   ~~~~~~~~         ' 
616                  WRITE(numout,*) ' h_i        : ', h_i(ji,jj,jl)              , ' h_s        : ', h_s(ji,jj,jl)
617                  WRITE(numout,*) ' t_i        : ', t_i(ji,jj,1:nlay_i,jl)
618                  WRITE(numout,*) ' t_su       : ', t_su(ji,jj,jl)             , ' t_s        : ', t_s(ji,jj,1:nlay_s,jl)
619                  WRITE(numout,*) ' s_i        : ', s_i(ji,jj,jl)              , ' o_i        : ', o_i(ji,jj,jl)
620                  WRITE(numout,*) ' a_i        : ', a_i(ji,jj,jl)              , ' a_i_b      : ', a_i_b(ji,jj,jl)   
621                  WRITE(numout,*) ' v_i        : ', v_i(ji,jj,jl)              , ' v_i_b      : ', v_i_b(ji,jj,jl)   
622                  WRITE(numout,*) ' v_s        : ', v_s(ji,jj,jl)              , ' v_s_b      : ', v_s_b(ji,jj,jl) 
623                  WRITE(numout,*) ' e_i1       : ', e_i(ji,jj,1,jl)            , ' ei1        : ', e_i_b(ji,jj,1,jl) 
624                  WRITE(numout,*) ' e_i2       : ', e_i(ji,jj,2,jl)            , ' ei2_b      : ', e_i_b(ji,jj,2,jl) 
625                  WRITE(numout,*) ' e_snow     : ', e_s(ji,jj,1,jl)            , ' e_snow_b   : ', e_s_b(ji,jj,1,jl) 
626                  WRITE(numout,*) ' sv_i       : ', sv_i(ji,jj,jl)             , ' sv_i_b     : ', sv_i_b(ji,jj,jl)   
627                  WRITE(numout,*) ' oa_i       : ', oa_i(ji,jj,jl)             , ' oa_i_b     : ', oa_i_b(ji,jj,jl)
628               END DO !jl
629               
630               WRITE(numout,*)
631               WRITE(numout,*) ' - Heat / FW fluxes '
632               WRITE(numout,*) '   ~~~~~~~~~~~~~~~~ '
633               WRITE(numout,*) ' - Heat fluxes in and out the ice ***'
634               WRITE(numout,*) ' qsr_ini       : ', (1._wp-at_i_b(ji,jj)) * qsr(ji,jj) + SUM( a_i_b(ji,jj,:) * qsr_ice(ji,jj,:) )
635               WRITE(numout,*) ' qns_ini       : ', (1._wp-at_i_b(ji,jj)) * qns(ji,jj) + SUM( a_i_b(ji,jj,:) * qns_ice(ji,jj,:) )
636               WRITE(numout,*)
637               WRITE(numout,*) 
638               WRITE(numout,*) ' sst        : ', sst_m(ji,jj) 
639               WRITE(numout,*) ' sss        : ', sss_m(ji,jj) 
640               WRITE(numout,*) 
641               WRITE(numout,*) ' - Stresses '
642               WRITE(numout,*) '   ~~~~~~~~ '
643               WRITE(numout,*) ' utau_ice   : ', utau_ice(ji,jj) 
644               WRITE(numout,*) ' vtau_ice   : ', vtau_ice(ji,jj)
645               WRITE(numout,*) ' utau       : ', utau    (ji,jj) 
646               WRITE(numout,*) ' vtau       : ', vtau    (ji,jj)
647            ENDIF
648           
649            !---------------------
650            ! Salt / heat fluxes
651            !---------------------
652           
653            IF ( kn .EQ. 3 ) THEN
654               WRITE(numout,*) ' ice_prt - Point : ',ji,jj
655               WRITE(numout,*) ' ~~~~~~~~~~~~~~ '
656               WRITE(numout,*) ' - Salt / Heat Fluxes '
657               WRITE(numout,*) '   ~~~~~~~~~~~~~~~~ '
658               WRITE(numout,*) ' lat - long ', gphit(ji,jj), glamt(ji,jj)
659               WRITE(numout,*)
660               WRITE(numout,*) ' - Heat fluxes at bottom interface ***'
661               WRITE(numout,*) ' qsr       : ', qsr(ji,jj)
662               WRITE(numout,*) ' qns       : ', qns(ji,jj)
663               WRITE(numout,*)
664               WRITE(numout,*) ' hfx_mass     : ', hfx_thd(ji,jj) + hfx_dyn(ji,jj) + hfx_snw(ji,jj) + hfx_res(ji,jj)
665               WRITE(numout,*) ' qt_atm_oi    : ', qt_atm_oi(ji,jj)
666               WRITE(numout,*) ' qt_oce_ai    : ', qt_oce_ai(ji,jj)
667               WRITE(numout,*) ' dhc          : ', diag_heat(ji,jj)             
668               WRITE(numout,*)
669               WRITE(numout,*) ' hfx_dyn      : ', hfx_dyn(ji,jj)
670               WRITE(numout,*) ' hfx_thd      : ', hfx_thd(ji,jj)
671               WRITE(numout,*) ' hfx_res      : ', hfx_res(ji,jj)
672               WRITE(numout,*) ' qsb_ice_bot  : ', qsb_ice_bot(ji,jj) 
673               WRITE(numout,*) ' qlead        : ', qlead(ji,jj) * r1_rdtice
674               WRITE(numout,*)
675               WRITE(numout,*) ' - Salt fluxes at bottom interface ***'
676               WRITE(numout,*) ' emp       : ', emp    (ji,jj)
677               WRITE(numout,*) ' sfx       : ', sfx    (ji,jj)
678               WRITE(numout,*) ' sfx_res   : ', sfx_res(ji,jj)
679               WRITE(numout,*) ' sfx_bri   : ', sfx_bri(ji,jj)
680               WRITE(numout,*) ' sfx_dyn   : ', sfx_dyn(ji,jj)
681               WRITE(numout,*)
682               WRITE(numout,*) ' - Momentum fluxes '
683               WRITE(numout,*) ' utau      : ', utau(ji,jj) 
684               WRITE(numout,*) ' vtau      : ', vtau(ji,jj)
685            ENDIF
686            WRITE(numout,*) ' '
687            !
688         END DO
689      END DO
690      !
691   END SUBROUTINE ice_prt
692
693   SUBROUTINE ice_prt3D( cd_routine )
694      !!-------------------------------------------------------------------
695      !!                  ***  ROUTINE ice_prt3D ***
696      !!
697      !! ** Purpose : CTL prints of ice arrays in case ln_ctl is activated
698      !!
699      !!-------------------------------------------------------------------
700      CHARACTER(len=*), INTENT(in) ::   cd_routine    ! name of the routine
701      INTEGER                      ::   jk, jl        ! dummy loop indices
702     
703      CALL prt_ctl_info(' ========== ')
704      CALL prt_ctl_info( cd_routine )
705      CALL prt_ctl_info(' ========== ')
706      CALL prt_ctl_info(' - Cell values : ')
707      CALL prt_ctl_info('   ~~~~~~~~~~~~~ ')
708      CALL prt_ctl(tab2d_1=e1e2t      , clinfo1=' cell area   :')
709      CALL prt_ctl(tab2d_1=at_i       , clinfo1=' at_i        :')
710      CALL prt_ctl(tab2d_1=ato_i      , clinfo1=' ato_i       :')
711      CALL prt_ctl(tab2d_1=vt_i       , clinfo1=' vt_i        :')
712      CALL prt_ctl(tab2d_1=vt_s       , clinfo1=' vt_s        :')
713      CALL prt_ctl(tab2d_1=divu_i     , clinfo1=' divu_i      :')
714      CALL prt_ctl(tab2d_1=delta_i    , clinfo1=' delta_i     :')
715      CALL prt_ctl(tab2d_1=stress1_i  , clinfo1=' stress1_i   :')
716      CALL prt_ctl(tab2d_1=stress2_i  , clinfo1=' stress2_i   :')
717      CALL prt_ctl(tab2d_1=stress12_i , clinfo1=' stress12_i  :')
718      CALL prt_ctl(tab2d_1=strength   , clinfo1=' strength    :')
719      CALL prt_ctl(tab2d_1=delta_i    , clinfo1=' delta_i     :')
720      CALL prt_ctl(tab2d_1=u_ice      , clinfo1=' u_ice       :', tab2d_2=v_ice      , clinfo2=' v_ice       :')
721       
722      DO jl = 1, jpl
723         CALL prt_ctl_info(' ')
724         CALL prt_ctl_info(' - Category : ', ivar1=jl)
725         CALL prt_ctl_info('   ~~~~~~~~~~')
726         CALL prt_ctl(tab2d_1=h_i        (:,:,jl)        , clinfo1= ' h_i         : ')
727         CALL prt_ctl(tab2d_1=h_s        (:,:,jl)        , clinfo1= ' h_s         : ')
728         CALL prt_ctl(tab2d_1=t_su       (:,:,jl)        , clinfo1= ' t_su        : ')
729         CALL prt_ctl(tab2d_1=t_s        (:,:,1,jl)      , clinfo1= ' t_snow      : ')
730         CALL prt_ctl(tab2d_1=s_i        (:,:,jl)        , clinfo1= ' s_i         : ')
731         CALL prt_ctl(tab2d_1=o_i        (:,:,jl)        , clinfo1= ' o_i         : ')
732         CALL prt_ctl(tab2d_1=a_i        (:,:,jl)        , clinfo1= ' a_i         : ')
733         CALL prt_ctl(tab2d_1=v_i        (:,:,jl)        , clinfo1= ' v_i         : ')
734         CALL prt_ctl(tab2d_1=v_s        (:,:,jl)        , clinfo1= ' v_s         : ')
735         CALL prt_ctl(tab2d_1=e_i        (:,:,1,jl)      , clinfo1= ' e_i1        : ')
736         CALL prt_ctl(tab2d_1=e_s        (:,:,1,jl)      , clinfo1= ' e_snow      : ')
737         CALL prt_ctl(tab2d_1=sv_i       (:,:,jl)        , clinfo1= ' sv_i        : ')
738         CALL prt_ctl(tab2d_1=oa_i       (:,:,jl)        , clinfo1= ' oa_i        : ')
739         
740         DO jk = 1, nlay_i
741            CALL prt_ctl_info(' - Layer : ', ivar1=jk)
742            CALL prt_ctl(tab2d_1=t_i(:,:,jk,jl) , clinfo1= ' t_i       : ')
743         END DO
744      END DO
745     
746      CALL prt_ctl_info(' ')
747      CALL prt_ctl_info(' - Heat / FW fluxes : ')
748      CALL prt_ctl_info('   ~~~~~~~~~~~~~~~~~~ ')
749      CALL prt_ctl(tab2d_1=sst_m  , clinfo1= ' sst   : ', tab2d_2=sss_m     , clinfo2= ' sss       : ')
750      CALL prt_ctl(tab2d_1=qsr    , clinfo1= ' qsr   : ', tab2d_2=qns       , clinfo2= ' qns       : ')
751      CALL prt_ctl(tab2d_1=emp    , clinfo1= ' emp   : ', tab2d_2=sfx       , clinfo2= ' sfx       : ')
752     
753      CALL prt_ctl_info(' ')
754      CALL prt_ctl_info(' - Stresses : ')
755      CALL prt_ctl_info('   ~~~~~~~~~~ ')
756      CALL prt_ctl(tab2d_1=utau       , clinfo1= ' utau      : ', tab2d_2=vtau       , clinfo2= ' vtau      : ')
757      CALL prt_ctl(tab2d_1=utau_ice   , clinfo1= ' utau_ice  : ', tab2d_2=vtau_ice   , clinfo2= ' vtau_ice  : ')
758     
759   END SUBROUTINE ice_prt3D
760     
761#else
762   !!----------------------------------------------------------------------
763   !!   Default option         Empty Module           No SI3 sea-ice model
764   !!----------------------------------------------------------------------
765#endif
766
767   !!======================================================================
768END MODULE icectl
Note: See TracBrowser for help on using the repository browser.