source: trunk/NEMO/OPA_SRC/SBC/sbcice_lim_2.F90 @ 888

Last change on this file since 888 was 888, checked in by ctlod, 13 years ago

merge dev_001_SBC branche with the trunk to include the New Surface Module package, see ticket: #113

File size: 10.6 KB
Line 
1MODULE sbcice_lim_2
2   !!======================================================================
3   !!                       ***  MODULE  sbcice_lim_2  ***
4   !! Surface module :  update surface ocean boundary condition over ice
5   !!                   covered area using LIM sea-ice model
6   !! Sea-Ice model  :  LIM 2.0 Sea ice model time-stepping
7   !!======================================================================
8   !! History :  9.0   !  06-06  (G. Madec)  from icestp_2.F90
9   !!----------------------------------------------------------------------
10#if defined key_lim2
11   !!----------------------------------------------------------------------
12   !!   'key_lim2' :                                  LIM 2.0 sea-ice model
13   !!----------------------------------------------------------------------
14   !!----------------------------------------------------------------------
15   !!   sbc_ice_lim_2  : sea-ice model time-stepping and
16   !!                    update ocean sbc over ice-covered area
17   !!----------------------------------------------------------------------
18   USE oce             ! ocean dynamics and tracers
19   USE dom_oce         ! ocean space and time domain
20   USE ice_2
21   USE iceini_2
22   USE ice_oce         ! ice variables
23   USE dom_ice_2
24   USE cpl_oce
25
26   USE sbc_oce         ! Surface boundary condition: ocean fields
27   USE sbc_ice         ! Surface boundary condition: ice   fields
28   USE sbcblk_core     ! Surface boundary condition: CORE bulk
29   USE sbcblk_clio     ! Surface boundary condition: CLIO bulk
30   USE albedo
31
32   USE daymod          ! day calendar
33   USE phycst          ! Define parameters for the routines
34   USE eosbn2          ! equation of state
35   USE limdyn_2
36   USE limtrp_2
37   USE limdmp_2
38   USE limthd_2
39   USE limsbc_2        ! sea surface boundary condition
40   USE limdia_2
41   USE limwri_2
42   USE limrst_2
43
44   USE lbclnk
45   USE iom             ! I/O manager library
46   USE in_out_manager  ! I/O manager
47   USE prtctl          ! Print control
48
49   IMPLICIT NONE
50   PRIVATE
51
52   PUBLIC sbc_ice_lim_2 ! routine called by sbcmod.F90
53   
54   CHARACTER(len=1) ::   cl_grid = 'B'     ! type of grid used in ice dynamics
55
56   !! * Substitutions
57#  include "domzgr_substitute.h90"
58#  include "vectopt_loop_substitute.h90"
59   !!----------------------------------------------------------------------
60   !!   OPA 9.0 , LOCEAN-IPSL (2006)
61   !! $ Id: $
62   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
63   !!----------------------------------------------------------------------
64
65CONTAINS
66
67   SUBROUTINE sbc_ice_lim_2( kt, kblk )
68      !!---------------------------------------------------------------------
69      !!                  ***  ROUTINE sbc_ice_lim_2  ***
70      !!                   
71      !! ** Purpose :   update the ocean surface boundary condition via the
72      !!                Louvain la Neuve Sea Ice Model time stepping
73      !!
74      !! ** Method  :   ice model time stepping
75      !!              - call the ice dynamics routine
76      !!              - call the ice advection/diffusion routine
77      !!              - call the ice thermodynamics routine
78      !!              - call the routine that computes mass and
79      !!                heat fluxes at the ice/ocean interface
80      !!              - save the outputs
81      !!              - save the outputs for restart when necessary
82      !!
83      !! ** Action  : - time evolution of the LIM sea-ice model
84      !!              - update all sbc variables below sea-ice:
85      !!                utau, vtau, qns , qsr, emp , emps
86      !!---------------------------------------------------------------------
87      INTEGER, INTENT(in) ::   kt      ! ocean time step
88      INTEGER, INTENT(in) ::   kblk    ! type of bulk (=3 CLIO, =4 CORE)
89      !!
90      INTEGER  ::   ji, jj   ! dummy loop indices
91      REAL(wp), DIMENSION(jpi,jpj,1) ::   alb_ice_os   ! albedo of the ice under overcast sky
92      REAL(wp), DIMENSION(jpi,jpj,1) ::   alb_ice_cs   ! albedo of ice under clear sky
93      REAL(wp), DIMENSION(jpi,jpj,1) ::   zsist        ! surface ice temperature (K)
94      REAL(wp), DIMENSION(jpi,jpj,1) ::   zhicif       ! ice thickness
95      REAL(wp), DIMENSION(jpi,jpj,1) ::   zhsnif       ! snow thickness
96      REAL(wp), DIMENSION(jpi,jpj,1) ::   zqns_ice     ! non solar sea-ice heat flux
97      REAL(wp), DIMENSION(jpi,jpj,1) ::   zqsr_ice     !     solar sea-ice heat flux
98      REAL(wp), DIMENSION(jpi,jpj,1) ::   zqla_ice     ! ice latent heat flux
99      REAL(wp), DIMENSION(jpi,jpj,1) ::   zdqns_ice    ! sensitivity ice net heat flux
100      REAL(wp), DIMENSION(jpi,jpj,1) ::   zdqla_ice    ! sensitivity ice latent heat flux
101      !!----------------------------------------------------------------------
102
103      IF( kt == nit000 ) THEN
104         IF(lwp) WRITE(numout,*)
105         IF(lwp) WRITE(numout,*) 'sbc_ice_lim_2 : update ocean surface boudary condition' 
106         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~   via Louvain la Neuve Ice Model (LIM) time stepping'
107
108         CALL ice_init_2
109
110      ENDIF
111
112      IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN
113         !
114         ! ... mean surface ocean current at ice dynamics point
115         !     B-grid dynamics :  I-point (F-point with sea-ice indexation)
116         DO jj = 2, jpj
117            DO ji = fs_2, jpi   ! vector opt.
118               ui_oce(ji,jj) = 0.5 * ( ssu_m(ji-1,jj  ) + ssu_m(ji-1,jj-1) ) * tmu(ji,jj)
119               vi_oce(ji,jj) = 0.5 * ( ssv_m(ji  ,jj-1) + ssv_m(ji-1,jj-1) ) * tmu(ji,jj)
120            END DO
121         END DO
122         CALL lbc_lnk( ui_oce, 'I', -1. )   ! I-point (i.e. F-point with ice indices)
123         CALL lbc_lnk( vi_oce, 'I', -1. )   ! I-point (i.e. F-point with ice indices)
124
125         ! ... masked sea surface freezing temperature [Kelvin] (set to rt0 over land)
126         tfu(:,:) = tfreez( sss_m ) +  rt0 
127
128         zsist (:,:,1) = sist (:,:)
129         zhicif(:,:,1) = hicif(:,:)   ;   zhsnif(:,:,1) = hsnif(:,:)
130
131         ! ... ice albedo
132         CALL albedo_ice( zsist, zhicif, zhsnif, alb_ice_cs, alb_ice_os )
133
134         ! ... Sea-ice surface boundary conditions output from bulk formulae :
135         !     - utaui_ice  ! surface ice stress i-component (I-point)   [N/m2]
136         !     - vtaui_ice  ! surface ice stress j-component (I-point)   [N/m2]
137         !     - qns_ice    ! non solar heat flux over ice   (T-point)   [W/m2]
138         !     - qsr_ice    !     solar heat flux over ice   (T-point)   [W/m2]
139         !     - qla_ice    ! latent    heat flux over ice   (T-point)   [W/m2]
140         !     - dqns_ice   ! non solar heat sensistivity    (T-point)   [W/m2]
141         !     - dqla_ice   ! latent    heat sensistivity    (T-point)   [W/m2]
142         !     - tprecip    ! total precipitation            (T-point)   [Kg/m2/s]
143         !     - sprecip    ! solid precipitation            (T-point)   [Kg/m2/s]
144         !     - fr1_i0     ! 1sr fraction of qsr penetration in ice     [%]
145         !     - fr2_i0     ! 2nd fraction of qsr penetration in ice     [%]
146         !
147         SELECT CASE( kblk )
148         CASE( 3 )           ! CLIO bulk formulation
149            CALL blk_ice_clio( zsist , ui_ice , vi_ice   , alb_ice_cs , alb_ice_os ,             &
150               &                               utaui_ice , vtaui_ice  , zqns_ice   , zqsr_ice,   &
151               &                               zqla_ice  , zdqns_ice  , zdqla_ice  ,             &
152               &                               tprecip   , sprecip    ,                          &
153               &                               fr1_i0    , fr2_i0     , cl_grid  )
154         CASE( 4 )           ! CORE bulk formulation
155            CALL blk_ice_core( zsist , ui_ice , vi_ice   , alb_ice_cs ,                         &
156               &                               utaui_ice , vtaui_ice  , zqns_ice  , zqsr_ice,   &
157               &                               zqla_ice  , zdqns_ice  , zdqla_ice ,             &
158               &                               tprecip   , sprecip    ,                         &
159               &                               fr1_i0    , fr2_i0     , cl_grid)
160         END SELECT
161
162         qsr_ice(:,:) = zqsr_ice(:,:,1)
163         qns_ice(:,:) = zqns_ice(:,:,1)   ;   dqns_ice(:,:) = zdqns_ice(:,:,1)
164         qla_ice(:,:) = zqla_ice(:,:,1)   ;   dqla_ice(:,:) = zdqla_ice(:,:,1)
165
166         IF(ln_ctl) THEN         ! print mean trends (used for debugging)
167            CALL prt_ctl_info( 'Ice Forcings ' )
168            CALL prt_ctl( tab2d_1=tprecip  ,clinfo1=' sbc_ice_lim: precip   : ', tab2d_2=sprecip  , clinfo2=' Snow     : ' )
169            CALL prt_ctl( tab2d_1=utaui_ice,clinfo1=' sbc_ice_lim: utaui_ice: ', tab2d_2=vtaui_ice, clinfo2=' vtaui_ice: ' )
170            CALL prt_ctl( tab2d_1=sst_m    ,clinfo1=' sbc_ice_lim: sst      : ', tab2d_2=sss_m    , clinfo2=' sss      : ' )
171            CALL prt_ctl( tab2d_1=ui_oce   ,clinfo1=' sbc_ice_lim: u_io     : ', tab2d_2=vi_oce   , clinfo2=' v_io     : ' )
172            CALL prt_ctl( tab2d_1=hsnif    ,clinfo1=' sbc_ice_lim: hsnif  1 : ', tab2d_2=hicif    , clinfo2=' hicif    : ' )
173            CALL prt_ctl( tab2d_1=frld     ,clinfo1=' sbc_ice_lim: frld   1 : ', tab2d_2=sist     , clinfo2=' sist     : ' )
174         ENDIF
175
176         ! ---------------- !
177         !  Ice model step  !
178         ! ---------------- !
179         ;                              CALL lim_rst_opn_2  ( kt )      ! Open Ice restart file
180         ;                              CALL lim_dyn_2      ( kt )      ! Ice dynamics    ( rheology/dynamics )
181         ;                              CALL lim_trp_2      ( kt )      ! Ice transport   ( Advection/diffusion )
182         IF( ln_limdmp )                CALL lim_dmp_2      ( kt )      ! Ice damping
183         ;                              CALL lim_thd_2      ( kt )      ! Ice thermodynamics
184         ;                              CALL lim_sbc_2      ( kt )      ! Ice/Ocean Mass & Heat fluxes
185         IF( MOD( kt+nn_fsbc-1, ninfo ) == 0 .OR.   &
186            &  ntmoy == 1 )             CALL lim_dia_2      ( kt )      ! Ice Diagnostics
187         ;                              CALL lim_wri_2      ( kt )      ! Ice outputs
188         IF( lrst_ice )                 CALL lim_rst_write_2( kt )      ! Ice restart file
189         !
190      ENDIF
191      !
192   END SUBROUTINE sbc_ice_lim_2
193
194#else
195   !!----------------------------------------------------------------------
196   !!   Default option           Dummy module      NO LIM 2.0 sea-ice model
197   !!----------------------------------------------------------------------
198CONTAINS
199   SUBROUTINE sbc_ice_lim_2 ( kt, kblk )     ! Dummy routine
200      WRITE(*,*) 'sbc_ice_lim_2: You should not have seen this print! error?', kt, kblk
201   END SUBROUTINE sbc_ice_lim_2
202#endif
203
204   !!======================================================================
205END MODULE sbcice_lim_2
Note: See TracBrowser for help on using the repository browser.