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_LOCEAN_2013/NEMOGCM/NEMO/OPA_SRC/SBC – NEMO

source: branches/2013/dev_LOCEAN_2013/NEMOGCM/NEMO/OPA_SRC/SBC/sbcmod.F90 @ 4148

Last change on this file since 4148 was 4148, checked in by cetlod, 10 years ago

merge in trunk changes between r3853 and r3940 and commit the changes, see ticket #1169

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