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.
sbcmod.F90 in branches/2013/dev_MERGE_2013/NEMOGCM/NEMO/OPA_SRC/SBC – NEMO

source: branches/2013/dev_MERGE_2013/NEMOGCM/NEMO/OPA_SRC/SBC/sbcmod.F90 @ 4333

Last change on this file since 4333 was 4333, checked in by clem, 10 years ago

remove remaining bugs in LIM3, so that it can run in both regional and global config

  • Property svn:keywords set to Id
File size: 26.2 KB
Line 
1MODULE sbcmod
2   !!======================================================================
3   !!                       ***  MODULE  sbcmod  ***
4   !! Surface module :  provide to the ocean its surface boundary condition
5   !!======================================================================
6   !! History :  3.0  ! 2006-07  (G. Madec)  Original code
7   !!            3.1  ! 2008-08  (S. Masson, A. Caubel, E. Maisonnave, G. Madec) coupled interface
8   !!            3.3  ! 2010-04  (M. Leclair, G. Madec)  Forcing averaged over 2 time steps
9   !!            3.3  ! 2010-10  (S. Masson)  add diurnal cycle
10   !!            3.3  ! 2010-09  (D. Storkey) add ice boundary conditions (BDY)
11   !!             -   ! 2010-11  (G. Madec) ice-ocean stress always computed at each ocean time-step
12   !!             -   ! 2010-10  (J. Chanut, C. Bricaud, G. Madec)  add the surface pressure forcing
13   !!            3.4  ! 2011-11  (C. Harris) CICE added as an option
14   !!            3.5  ! 2012-11  (A. Coward, G. Madec) Rethink of heat, mass and salt surface fluxes
15   !!----------------------------------------------------------------------
16
17   !!----------------------------------------------------------------------
18   !!   sbc_init       : read namsbc namelist
19   !!   sbc            : surface ocean momentum, heat and freshwater boundary conditions
20   !!----------------------------------------------------------------------
21   USE oce              ! ocean dynamics and tracers
22   USE dom_oce          ! ocean space and time domain
23   USE phycst           ! physical constants
24   USE sbc_oce          ! Surface boundary condition: ocean fields
25   USE sbc_ice          ! Surface boundary condition: ice fields
26   USE sbcdcy           ! surface boundary condition: diurnal cycle
27   USE sbcssm           ! surface boundary condition: sea-surface mean variables
28   USE sbcapr           ! surface boundary condition: atmospheric pressure
29   USE sbcana           ! surface boundary condition: analytical formulation
30   USE sbcflx           ! surface boundary condition: flux formulation
31   USE sbcblk_clio      ! surface boundary condition: bulk formulation : CLIO
32   USE sbcblk_core      ! surface boundary condition: bulk formulation : CORE
33   USE sbcblk_mfs       ! surface boundary condition: bulk formulation : MFS
34   USE sbcice_if        ! surface boundary condition: ice-if sea-ice model
35   USE sbcice_lim       ! surface boundary condition: LIM 3.0 sea-ice model
36   USE sbcice_lim_2     ! surface boundary condition: LIM 2.0 sea-ice model
37   USE sbcice_cice      ! surface boundary condition: CICE    sea-ice model
38   USE sbccpl           ! surface boundary condition: coupled florulation
39   USE cpl_oasis3, ONLY:lk_cpl      ! are we in coupled mode?
40   USE sbcssr           ! surface boundary condition: sea surface restoring
41   USE sbcrnf           ! surface boundary condition: runoffs
42   USE sbcfwb           ! surface boundary condition: freshwater budget
43   USE closea           ! closed sea
44   USE icbstp           ! Icebergs!
45
46   USE prtctl           ! Print control                    (prt_ctl routine)
47   USE iom              ! IOM library
48   USE in_out_manager   ! I/O manager
49   USE lib_mpp          ! MPP library
50   USE timing           ! Timing
51   USE sbcwave          ! Wave module
52
53   IMPLICIT NONE
54   PRIVATE
55
56   PUBLIC   sbc        ! routine called by step.F90
57   PUBLIC   sbc_init   ! routine called by opa.F90
58   
59   INTEGER ::   nsbc   ! type of surface boundary condition (deduced from namsbc informations)
60     
61   !! * Substitutions
62#  include "domzgr_substitute.h90"
63   !!----------------------------------------------------------------------
64   !! NEMO/OPA 4.0 , NEMO-consortium (2011)
65   !! $Id$
66   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
67   !!----------------------------------------------------------------------
68CONTAINS
69
70   SUBROUTINE sbc_init
71      !!---------------------------------------------------------------------
72      !!                    ***  ROUTINE sbc_init ***
73      !!
74      !! ** Purpose :   Initialisation of the ocean surface boundary computation
75      !!
76      !! ** Method  :   Read the namsbc namelist and set derived parameters
77      !!                Call init routines for all other SBC modules that have one
78      !!
79      !! ** Action  : - read namsbc parameters
80      !!              - nsbc: type of sbc
81      !!----------------------------------------------------------------------
82      INTEGER ::   icpt   ! local integer
83      !!
84      NAMELIST/namsbc/ nn_fsbc   , ln_ana    , ln_flx,  ln_blk_clio, ln_blk_core, ln_cpl,   &
85         &             ln_blk_mfs, ln_apr_dyn, nn_ice,  nn_ice_embd, ln_dm2dc   , ln_rnf,   &
86         &             ln_ssr    , nn_fwb    , ln_cdgw , ln_wave , ln_sdw, nn_lsm, cn_iceflx
87      INTEGER  ::   ios
88      !!----------------------------------------------------------------------
89
90      IF(lwp) THEN
91         WRITE(numout,*)
92         WRITE(numout,*) 'sbc_init : surface boundary condition setting'
93         WRITE(numout,*) '~~~~~~~~ '
94      ENDIF
95
96      REWIND( numnam_ref )              ! Namelist namsbc in reference namelist : Surface boundary
97      READ  ( numnam_ref, namsbc, IOSTAT = ios, ERR = 901)
98901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsbc in reference namelist', lwp )
99
100      REWIND( numnam_cfg )              ! Namelist namsbc in configuration namelist : Parameters of the run
101      READ  ( numnam_cfg, namsbc, IOSTAT = ios, ERR = 902 )
102902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsbc in configuration namelist', lwp )
103      WRITE ( numond, namsbc )
104
105      !                          ! overwrite namelist parameter using CPP key information
106      IF( Agrif_Root() ) THEN                ! AGRIF zoom
107        IF( lk_lim2 )   nn_ice      = 2
108        IF( lk_lim3 )   nn_ice      = 3
109        IF( lk_cice )   nn_ice      = 4
110      ENDIF
111      IF( cp_cfg == 'gyre' ) THEN            ! GYRE configuration
112          ln_ana      = .TRUE.   
113          nn_ice      =   0
114      ENDIF
115     
116      IF(lwp) THEN               ! Control print
117         WRITE(numout,*) '        Namelist namsbc (partly overwritten with CPP key setting)'
118         WRITE(numout,*) '           frequency update of sbc (and ice)             nn_fsbc     = ', nn_fsbc
119         WRITE(numout,*) '           Type of sbc : '
120         WRITE(numout,*) '              analytical formulation                     ln_ana      = ', ln_ana
121         WRITE(numout,*) '              flux       formulation                     ln_flx      = ', ln_flx
122         WRITE(numout,*) '              CLIO bulk  formulation                     ln_blk_clio = ', ln_blk_clio
123         WRITE(numout,*) '              CORE bulk  formulation                     ln_blk_core = ', ln_blk_core
124         WRITE(numout,*) '              MFS  bulk  formulation                     ln_blk_mfs  = ', ln_blk_mfs
125         WRITE(numout,*) '              coupled    formulation (T if key_sbc_cpl)  ln_cpl      = ', ln_cpl
126         WRITE(numout,*) '              Flux handling over ice categories          cn_iceflx   = ', TRIM (cn_iceflx)
127         WRITE(numout,*) '           Misc. options of sbc : '
128         WRITE(numout,*) '              Patm gradient added in ocean & ice Eqs.    ln_apr_dyn  = ', ln_apr_dyn
129         WRITE(numout,*) '              ice management in the sbc (=0/1/2/3)       nn_ice      = ', nn_ice 
130         WRITE(numout,*) '              ice-ocean embedded/levitating (=0/1/2)     nn_ice_embd = ', nn_ice_embd
131         WRITE(numout,*) '              daily mean to diurnal cycle qsr            ln_dm2dc    = ', ln_dm2dc 
132         WRITE(numout,*) '              runoff / runoff mouths                     ln_rnf      = ', ln_rnf
133         WRITE(numout,*) '              Sea Surface Restoring on SST and/or SSS    ln_ssr      = ', ln_ssr
134         WRITE(numout,*) '              FreshWater Budget control  (=0/1/2)        nn_fwb      = ', nn_fwb
135         WRITE(numout,*) '              closed sea (=0/1) (set in namdom)          nn_closea   = ', nn_closea
136         WRITE(numout,*) '              n. of iterations if land-sea-mask applied  nn_lsm      = ', nn_lsm
137      ENDIF
138
139      !   Flux handling over ice categories
140#if defined key_coupled 
141      SELECT CASE ( TRIM (cn_iceflx))
142      CASE ('ave')
143         ln_iceflx_ave    = .TRUE.
144         ln_iceflx_linear = .FALSE.
145      CASE ('linear')
146         ln_iceflx_ave    = .FALSE.
147         ln_iceflx_linear = .TRUE.
148      CASE default
149         ln_iceflx_ave    = .FALSE.
150         ln_iceflx_linear = .FALSE.
151      END SELECT
152      IF(lwp) WRITE(numout,*) '              Fluxes averaged over all ice categories         ln_iceflx_ave    = ', ln_iceflx_ave
153      IF(lwp) WRITE(numout,*) '              Fluxes distributed linearly over ice categories ln_iceflx_linear = ', ln_iceflx_linear
154#endif
155      !
156      !                              ! allocate sbc arrays
157      IF( sbc_oce_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'sbc_init : unable to allocate sbc_oce arrays' )
158
159      !                          ! Checks:
160      IF( .NOT. ln_rnf ) THEN                      ! no specific treatment in vicinity of river mouths
161         ln_rnf_mouth  = .false.                     
162         IF( sbc_rnf_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'sbc_init : unable to allocate sbc_rnf arrays' )
163         nkrnf         = 0
164         rnf     (:,:) = 0.0_wp
165         rnfmsk  (:,:) = 0.0_wp
166         rnfmsk_z(:)   = 0.0_wp
167      ENDIF
168      IF( nn_ice == 0  )   fr_i(:,:) = 0.e0        ! no ice in the domain, ice fraction is always zero
169
170      sfx(:,:) = 0.0_wp                            ! the salt flux due to freezing/melting will be computed (i.e. will be non-zero)
171                                                   ! only if sea-ice is present
172 
173      fmmflx(:,:) = 0.0_wp                        ! freezing-melting array initialisation
174
175      !                                            ! restartability   
176      IF( MOD( nitend - nit000 + 1, nn_fsbc) /= 0 .OR.   &
177          MOD( nstock             , nn_fsbc) /= 0 ) THEN
178         WRITE(ctmp1,*) 'experiment length (', nitend - nit000 + 1, ') or nstock (', nstock,   &
179            &           ' is NOT a multiple of nn_fsbc (', nn_fsbc, ')'
180         CALL ctl_stop( ctmp1, 'Impossible to properly do model restart' )
181      ENDIF
182      !
183      IF( MOD( rday, REAL(nn_fsbc, wp) * rdt ) /= 0 )   &
184         &  CALL ctl_warn( 'nn_fsbc is NOT a multiple of the number of time steps in a day' )
185      !
186      IF( ( nn_ice == 2 .OR. nn_ice ==3 ) .AND. .NOT.( ln_blk_clio .OR. ln_blk_core .OR. lk_cpl ) )   &
187         &   CALL ctl_stop( 'LIM sea-ice model requires a bulk formulation or coupled configuration' )
188      IF( nn_ice == 4 .AND. .NOT.( ln_blk_core .OR. lk_cpl ) )   &
189         &   CALL ctl_stop( 'CICE sea-ice model requires ln_blk_core or lk_cpl' )
190      IF( nn_ice == 4 .AND. lk_agrif )   &
191         &   CALL ctl_stop( 'CICE sea-ice model not currently available with AGRIF' )
192      IF( ( nn_ice == 3 .OR. nn_ice == 4 ) .AND. nn_ice_embd == 0 )   &
193         &   CALL ctl_stop( 'LIM3 and CICE sea-ice models require nn_ice_embd = 1 or 2' )
194#if defined key_coupled
195      IF( ln_iceflx_ave .AND. ln_iceflx_linear ) &
196         &   CALL ctl_stop( ' ln_iceflx_ave and ln_iceflx_linear options are not compatible' )
197      IF( ( nn_ice ==3 .AND. lk_cpl) .AND. .NOT. ( ln_iceflx_ave .OR. ln_iceflx_linear ) ) &
198         &   CALL ctl_stop( ' With lim3 coupled, either ln_iceflx_ave or ln_iceflx_linear must be set to .TRUE.' )
199#endif     
200      IF( ln_dm2dc )   nday_qsr = -1   ! initialisation flag
201
202      IF( ln_dm2dc .AND. .NOT.( ln_flx .OR. ln_blk_core ) )   &
203         &   CALL ctl_stop( 'diurnal cycle into qsr field from daily values requires a flux or core-bulk formulation' )
204     
205      IF( ln_dm2dc .AND. ( ( NINT(rday) / ( nn_fsbc * NINT(rdt) ) )  < 8 ) )   &
206         &   CALL ctl_warn( 'diurnal cycle for qsr: the sampling of the diurnal cycle is too small...' )
207
208      IF ( ln_wave ) THEN
209      !Activated wave module but neither drag nor stokes drift activated
210         IF ( .NOT.(ln_cdgw .OR. ln_sdw) )   THEN
211            CALL ctl_warn( 'Ask for wave coupling but nor drag coefficient (ln_cdgw=F) neither stokes drift activated (ln_sdw=F)' )
212      !drag coefficient read from wave model definable only with mfs bulk formulae and core
213         ELSEIF (ln_cdgw .AND. .NOT.(ln_blk_mfs .OR. ln_blk_core) )       THEN       
214             CALL ctl_stop( 'drag coefficient read from wave model definable only with mfs bulk formulae and core')
215         ENDIF
216      ELSE
217      IF ( ln_cdgw .OR. ln_sdw  )                                         & 
218         &   CALL ctl_stop('Not Activated Wave Module (ln_wave=F) but     &
219         & asked coupling with drag coefficient (ln_cdgw =T) or Stokes drift (ln_sdw=T) ')
220      ENDIF 
221     
222      !                          ! Choice of the Surface Boudary Condition (set nsbc)
223      icpt = 0
224      IF( ln_ana          ) THEN   ;   nsbc =  1   ; icpt = icpt + 1   ;   ENDIF       ! analytical      formulation
225      IF( ln_flx          ) THEN   ;   nsbc =  2   ; icpt = icpt + 1   ;   ENDIF       ! flux            formulation
226      IF( ln_blk_clio     ) THEN   ;   nsbc =  3   ; icpt = icpt + 1   ;   ENDIF       ! CLIO bulk       formulation
227      IF( ln_blk_core     ) THEN   ;   nsbc =  4   ; icpt = icpt + 1   ;   ENDIF       ! CORE bulk       formulation
228      IF( ln_blk_mfs      ) THEN   ;   nsbc =  6   ; icpt = icpt + 1   ;   ENDIF       ! MFS  bulk       formulation
229      IF( ln_cpl          ) THEN   ;   nsbc =  5   ; icpt = icpt + 1   ;   ENDIF       ! Coupled         formulation
230      IF( cp_cfg == 'gyre') THEN   ;   nsbc =  0                       ;   ENDIF       ! GYRE analytical formulation
231      IF( lk_esopa        )            nsbc = -1                                       ! esopa test, ALL formulations
232      !
233      IF( icpt /= 1 .AND. .NOT.lk_esopa ) THEN
234         WRITE(numout,*)
235         WRITE(numout,*) '           E R R O R in setting the sbc, one and only one namelist/CPP key option '
236         WRITE(numout,*) '                     must be choosen. You choose ', icpt, ' option(s)'
237         WRITE(numout,*) '                     We stop'
238         nstop = nstop + 1
239      ENDIF
240      IF(lwp) THEN
241         WRITE(numout,*)
242         IF( nsbc == -1 )   WRITE(numout,*) '              ESOPA test All surface boundary conditions'
243         IF( nsbc ==  0 )   WRITE(numout,*) '              GYRE analytical formulation'
244         IF( nsbc ==  1 )   WRITE(numout,*) '              analytical formulation'
245         IF( nsbc ==  2 )   WRITE(numout,*) '              flux formulation'
246         IF( nsbc ==  3 )   WRITE(numout,*) '              CLIO bulk formulation'
247         IF( nsbc ==  4 )   WRITE(numout,*) '              CORE bulk formulation'
248         IF( nsbc ==  5 )   WRITE(numout,*) '              coupled formulation'
249         IF( nsbc ==  6 )   WRITE(numout,*) '              MFS Bulk formulation'
250      ENDIF
251      !
252                          CALL sbc_ssm_init               ! Sea-surface mean fields initialisation
253      !
254      IF( ln_ssr      )   CALL sbc_ssr_init               ! Sea-Surface Restoring initialisation
255      !
256      IF( nn_ice == 4 )   CALL cice_sbc_init( nsbc )      ! CICE initialisation
257      !
258   END SUBROUTINE sbc_init
259
260
261   SUBROUTINE sbc( kt )
262      !!---------------------------------------------------------------------
263      !!                    ***  ROUTINE sbc  ***
264      !!             
265      !! ** Purpose :   provide at each time-step the ocean surface boundary
266      !!                condition (momentum, heat and freshwater fluxes)
267      !!
268      !! ** Method  :   blah blah  to be written ?????????
269      !!                CAUTION : never mask the surface stress field (tke sbc)
270      !!
271      !! ** Action  : - set the ocean surface boundary condition at before and now
272      !!                time step, i.e. 
273      !!                utau_b, vtau_b, qns_b, qsr_b, emp_n, sfx_b, qrp_b, erp_b
274      !!                utau  , vtau  , qns  , qsr  , emp  , sfx  , qrp  , erp
275      !!              - updte the ice fraction : fr_i
276      !!----------------------------------------------------------------------
277      INTEGER, INTENT(in) ::   kt       ! ocean time step
278      !!---------------------------------------------------------------------
279      !
280      IF( nn_timing == 1 )  CALL timing_start('sbc')
281      !
282      !                                            ! ---------------------------------------- !
283      IF( kt /= nit000 ) THEN                      !          Swap of forcing fields          !
284         !                                         ! ---------------------------------------- !
285         utau_b(:,:) = utau(:,:)                         ! Swap the ocean forcing fields
286         vtau_b(:,:) = vtau(:,:)                         ! (except at nit000 where before fields
287         qns_b (:,:) = qns (:,:)                         !  are set at the end of the routine)
288         ! The 3D heat content due to qsr forcing is treated in traqsr
289         ! qsr_b (:,:) = qsr (:,:)
290         emp_b(:,:) = emp(:,:)
291         sfx_b(:,:) = sfx(:,:)
292      ENDIF
293      !                                            ! ---------------------------------------- !
294      !                                            !        forcing field computation         !
295      !                                            ! ---------------------------------------- !
296      !
297      IF( ln_apr_dyn ) CALL sbc_apr( kt )                ! atmospheric pressure provided at kt+0.5*nn_fsbc
298                                                         ! (caution called before sbc_ssm)
299      !
300      CALL sbc_ssm( kt )                                 ! ocean sea surface variables (sst_m, sss_m, ssu_m, ssv_m)
301      !                                                  ! averaged over nf_sbc time-step
302
303      IF (ln_wave) CALL sbc_wave( kt )
304                                                   !==  sbc formulation  ==!
305                                                           
306      SELECT CASE( nsbc )                                ! Compute ocean surface boundary condition
307      !                                                  ! (i.e. utau,vtau, qns, qsr, emp, sfx)
308      CASE(  0 )   ;   CALL sbc_gyre    ( kt )                    ! analytical formulation : GYRE configuration
309      CASE(  1 )   ;   CALL sbc_ana     ( kt )                    ! analytical formulation : uniform sbc
310      CASE(  2 )   ;   CALL sbc_flx     ( kt )                    ! flux formulation
311      CASE(  3 )   ;   CALL sbc_blk_clio( kt )                    ! bulk formulation : CLIO for the ocean
312      CASE(  4 )   ;   CALL sbc_blk_core( kt )                    ! bulk formulation : CORE for the ocean
313      CASE(  5 )   ;   CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice )   ! coupled formulation
314      CASE(  6 )   ;   CALL sbc_blk_mfs ( kt )                    ! bulk formulation : MFS for the ocean
315      CASE( -1 )                               
316                       CALL sbc_ana     ( kt )                    ! ESOPA, test ALL the formulations
317                       CALL sbc_gyre    ( kt )                    !
318                       CALL sbc_flx     ( kt )                    !
319                       CALL sbc_blk_clio( kt )                    !
320                       CALL sbc_blk_core( kt )                    !
321                       CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice )   !
322      END SELECT
323
324      !                                            !==  Misc. Options  ==!
325     
326      SELECT CASE( nn_ice )                                       ! Update heat and freshwater fluxes over sea-ice areas
327      CASE(  1 )   ;         CALL sbc_ice_if   ( kt )                ! Ice-cover climatology ("Ice-if" model)
328      CASE(  2 )   ;         CALL sbc_ice_lim_2( kt, nsbc )          ! LIM-2 ice model
329      CASE(  3 )   ;         CALL sbc_ice_lim  ( kt, nsbc )          ! LIM-3 ice model
330      !is it useful?
331      CASE(  4 )   ;         CALL sbc_ice_cice ( kt, nsbc )          ! CICE ice model
332      END SELECT                                             
333
334      IF( ln_icebergs    )   CALL icb_stp( kt )                   ! compute icebergs
335
336      IF( ln_rnf         )   CALL sbc_rnf( kt )                   ! add runoffs to fresh water fluxes
337 
338      IF( ln_ssr         )   CALL sbc_ssr( kt )                   ! add SST/SSS damping term
339
340      IF( nn_fwb    /= 0 )   CALL sbc_fwb( kt, nn_fwb, nn_fsbc )  ! control the freshwater budget
341
342      IF( nn_closea == 1 )   CALL sbc_clo( kt )                   ! treatment of closed sea in the model domain
343      !                                                           ! (update freshwater fluxes)
344!RBbug do not understand why see ticket 667
345      !clem-bugsal CALL lbc_lnk( emp, 'T', 1. )
346      !
347      IF( kt == nit000 ) THEN                          !   set the forcing field at nit000 - 1    !
348         !                                             ! ---------------------------------------- !
349         IF( ln_rstart .AND.    &                               !* Restart: read in restart file
350            & iom_varid( numror, 'utau_b', ldstop = .FALSE. ) > 0 ) THEN
351            IF(lwp) WRITE(numout,*) '          nit000-1 surface forcing fields red in the restart file'
352            CALL iom_get( numror, jpdom_autoglo, 'utau_b', utau_b )   ! before i-stress  (U-point)
353            CALL iom_get( numror, jpdom_autoglo, 'vtau_b', vtau_b )   ! before j-stress  (V-point)
354            CALL iom_get( numror, jpdom_autoglo, 'qns_b' , qns_b  )   ! before non solar heat flux (T-point)
355            ! The 3D heat content due to qsr forcing is treated in traqsr
356            ! CALL iom_get( numror, jpdom_autoglo, 'qsr_b' , qsr_b  ) ! before     solar heat flux (T-point)
357            CALL iom_get( numror, jpdom_autoglo, 'emp_b', emp_b  )    ! before     freshwater flux (T-point)
358            ! To ensure restart capability with 3.3x/3.4 restart files    !! to be removed in v3.6
359            IF( iom_varid( numror, 'sfx_b', ldstop = .FALSE. ) > 0 ) THEN
360               CALL iom_get( numror, jpdom_autoglo, 'sfx_b', sfx_b )  ! before salt flux (T-point)
361            ELSE
362               sfx_b (:,:) = sfx(:,:)
363            ENDIF
364         ELSE                                                   !* no restart: set from nit000 values
365            IF(lwp) WRITE(numout,*) '          nit000-1 surface forcing fields set to nit000'
366            utau_b(:,:) = utau(:,:) 
367            vtau_b(:,:) = vtau(:,:)
368            qns_b (:,:) = qns (:,:)
369            emp_b (:,:) = emp(:,:)
370            sfx_b (:,:) = sfx(:,:)
371         ENDIF
372      ENDIF
373      !                                                ! ---------------------------------------- !
374      IF( lrst_oce ) THEN                              !      Write in the ocean restart file     !
375         !                                             ! ---------------------------------------- !
376         IF(lwp) WRITE(numout,*)
377         IF(lwp) WRITE(numout,*) 'sbc : ocean surface forcing fields written in ocean restart file ',   &
378            &                    'at it= ', kt,' date= ', ndastp
379         IF(lwp) WRITE(numout,*) '~~~~'
380         CALL iom_rstput( kt, nitrst, numrow, 'utau_b' , utau )
381         CALL iom_rstput( kt, nitrst, numrow, 'vtau_b' , vtau )
382         CALL iom_rstput( kt, nitrst, numrow, 'qns_b'  , qns  )
383         ! The 3D heat content due to qsr forcing is treated in traqsr
384         ! CALL iom_rstput( kt, nitrst, numrow, 'qsr_b'  , qsr  )
385         CALL iom_rstput( kt, nitrst, numrow, 'emp_b'  , emp  )
386         CALL iom_rstput( kt, nitrst, numrow, 'sfx_b' , sfx )
387      ENDIF
388
389      !                                                ! ---------------------------------------- !
390      !                                                !        Outputs and control print         !
391      !                                                ! ---------------------------------------- !
392      IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN
393         CALL iom_put( "empmr" , emp  - rnf )                   ! upward water flux
394         CALL iom_put( "saltflx", sfx  )                        ! downward salt flux 
395                                                                ! (includes virtual salt flux beneath ice
396                                                                ! in linear free surface case)
397         CALL iom_put( "fmmflx", fmmflx  )                      ! Freezing-melting water flux
398         CALL iom_put( "qt"    , qns  + qsr )                   ! total heat flux
399         CALL iom_put( "qns"   , qns        )                   ! solar heat flux
400         CALL iom_put( "qsr"   ,       qsr  )                   ! solar heat flux
401         IF( nn_ice > 0 )   CALL iom_put( "ice_cover", fr_i )   ! ice fraction
402      ENDIF
403      !
404      CALL iom_put( "utau", utau )   ! i-wind stress   (stress can be updated at
405      CALL iom_put( "vtau", vtau )   ! j-wind stress    each time step in sea-ice)
406      CALL iom_put( "taum", taum )   ! wind stress module
407      CALL iom_put( "wspd", wndm )   ! wind speed  module
408      !
409      IF(ln_ctl) THEN         ! print mean trends (used for debugging)
410         CALL prt_ctl(tab2d_1=fr_i             , clinfo1=' fr_i     - : ', mask1=tmask, ovlap=1 )
411         CALL prt_ctl(tab2d_1=(emp-rnf)        , clinfo1=' emp-rnf  - : ', mask1=tmask, ovlap=1 )
412         CALL prt_ctl(tab2d_1=(sfx-rnf)        , clinfo1=' sfx-rnf  - : ', mask1=tmask, ovlap=1 )
413         CALL prt_ctl(tab2d_1=qns              , clinfo1=' qns      - : ', mask1=tmask, ovlap=1 )
414         CALL prt_ctl(tab2d_1=qsr              , clinfo1=' qsr      - : ', mask1=tmask, ovlap=1 )
415         CALL prt_ctl(tab3d_1=tmask            , clinfo1=' tmask    - : ', mask1=tmask, ovlap=1, kdim=jpk )
416         CALL prt_ctl(tab3d_1=tsn(:,:,:,jp_tem), clinfo1=' sst      - : ', mask1=tmask, ovlap=1, kdim=1   )
417         CALL prt_ctl(tab3d_1=tsn(:,:,:,jp_sal), clinfo1=' sss      - : ', mask1=tmask, ovlap=1, kdim=1   )
418         CALL prt_ctl(tab2d_1=utau             , clinfo1=' utau     - : ', mask1=umask,                      &
419            &         tab2d_2=vtau             , clinfo2=' vtau     - : ', mask2=vmask, ovlap=1 )
420      ENDIF
421
422      IF( kt == nitend )   CALL sbc_final         ! Close down surface module if necessary
423      !
424      IF( nn_timing == 1 )  CALL timing_stop('sbc')
425      !
426   END SUBROUTINE sbc
427
428
429   SUBROUTINE sbc_final
430      !!---------------------------------------------------------------------
431      !!                    ***  ROUTINE sbc_final  ***
432      !!
433      !! ** Purpose :   Finalize CICE (if used)
434      !!---------------------------------------------------------------------
435      !
436      IF( nn_ice == 4 )   CALL cice_sbc_final
437      !
438   END SUBROUTINE sbc_final
439
440   !!======================================================================
441END MODULE sbcmod
Note: See TracBrowser for help on using the repository browser.