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

source: branches/UKMO/dev_r5518_test_GO6_package_update/NEMOGCM/NEMO/OPA_SRC/SBC/sbcmod.F90 @ 7877

Last change on this file since 7877 was 7877, checked in by frrh, 7 years ago

Merge missing swathe of revisions from branches/2015/nemo_v3_6_STABLE/NEMOGCM
using the command:
svn merge -r6424:6477 svn+ssh://forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/branches/2015/nemo_v3_6_STABLE/NEMOGCM

Note: this required manual conflict resolution of the content of NEMOGCM/TOOLS/SIREN/src/docsrc/
since the existing contenets of those directories in the package branch are not consistent
with the contents of branches/2015/nemo_v3_6_STABLE at revision 6424. (This should be an
incidental matter as the content in question only relates to documentation of NEMO tools
and is not relevant to NEMO source code.)

File size: 31.5 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   !!            3.6  ! 2014-11  (P. Mathiot, C. Harris) add ice shelves melting                   
16   !!----------------------------------------------------------------------
17
18   !!----------------------------------------------------------------------
19   !!   sbc_init       : read namsbc namelist
20   !!   sbc            : surface ocean momentum, heat and freshwater boundary conditions
21   !!----------------------------------------------------------------------
22   USE oce              ! ocean dynamics and tracers
23   USE dom_oce          ! ocean space and time domain
24   USE phycst           ! physical constants
25   USE sbc_oce          ! Surface boundary condition: ocean fields
26   USE trc_oce          ! shared ocean-passive tracers variables
27   USE sbc_ice          ! Surface boundary condition: ice fields
28   USE sbcdcy           ! surface boundary condition: diurnal cycle
29   USE sbcssm           ! surface boundary condition: sea-surface mean variables
30   USE sbcapr           ! surface boundary condition: atmospheric pressure
31   USE sbcana           ! surface boundary condition: analytical formulation
32   USE sbcflx           ! surface boundary condition: flux formulation
33   USE sbcblk_clio      ! surface boundary condition: bulk formulation : CLIO
34   USE sbcblk_core      ! surface boundary condition: bulk formulation : CORE
35   USE sbcblk_mfs       ! surface boundary condition: bulk formulation : MFS
36   USE sbcice_if        ! surface boundary condition: ice-if sea-ice model
37   USE sbcice_lim       ! surface boundary condition: LIM 3.0 sea-ice model
38   USE sbcice_lim_2     ! surface boundary condition: LIM 2.0 sea-ice model
39   USE sbcice_cice      ! surface boundary condition: CICE    sea-ice model
40   USE sbccpl           ! surface boundary condition: coupled florulation
41   USE cpl_oasis3       ! OASIS routines for coupling
42   USE sbcssr           ! surface boundary condition: sea surface restoring
43   USE sbcrnf           ! surface boundary condition: runoffs
44   USE sbcisf           ! surface boundary condition: ice shelf
45   USE sbcfwb           ! surface boundary condition: freshwater budget
46   USE closea           ! closed sea
47   USE icbstp           ! Icebergs!
48
49   USE prtctl           ! Print control                    (prt_ctl routine)
50   USE iom              ! IOM library
51   USE in_out_manager   ! I/O manager
52   USE lib_mpp          ! MPP library
53   USE timing           ! Timing
54   USE sbcwave          ! Wave module
55   USE bdy_par          ! Require lk_bdy
56
57   IMPLICIT NONE
58   PRIVATE
59
60   PUBLIC   sbc        ! routine called by step.F90
61   PUBLIC   sbc_init   ! routine called by opa.F90
62   
63   INTEGER ::   nsbc   ! type of surface boundary condition (deduced from namsbc informations)
64     
65   !! * Substitutions
66#  include "domzgr_substitute.h90"
67   !!----------------------------------------------------------------------
68   !! NEMO/OPA 4.0 , NEMO-consortium (2011)
69   !! $Id$
70   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
71   !!----------------------------------------------------------------------
72CONTAINS
73
74   SUBROUTINE sbc_init
75      !!---------------------------------------------------------------------
76      !!                    ***  ROUTINE sbc_init ***
77      !!
78      !! ** Purpose :   Initialisation of the ocean surface boundary computation
79      !!
80      !! ** Method  :   Read the namsbc namelist and set derived parameters
81      !!                Call init routines for all other SBC modules that have one
82      !!
83      !! ** Action  : - read namsbc parameters
84      !!              - nsbc: type of sbc
85      !!----------------------------------------------------------------------
86      INTEGER ::   icpt   ! local integer
87      !!
88      NAMELIST/namsbc/ nn_fsbc   , ln_ana    , ln_flx, ln_blk_clio, ln_blk_core, ln_mixcpl,   &
89         &             ln_blk_mfs, ln_apr_dyn, nn_ice, nn_ice_embd, ln_dm2dc   , ln_rnf   ,   &
90         &             ln_ssr    , nn_isf    , nn_fwb, ln_cdgw    , ln_wave    , ln_sdw   ,   &
91         &             nn_lsm    , nn_limflx , nn_components, ln_cpl
92      INTEGER  ::   ios
93      INTEGER  ::   ierr, ierr0, ierr1, ierr2, ierr3, jpm
94      LOGICAL  ::   ll_purecpl
95      !!----------------------------------------------------------------------
96
97      IF(lwp) THEN
98         WRITE(numout,*)
99         WRITE(numout,*) 'sbc_init : surface boundary condition setting'
100         WRITE(numout,*) '~~~~~~~~ '
101      ENDIF
102
103      REWIND( numnam_ref )              ! Namelist namsbc in reference namelist : Surface boundary
104      READ  ( numnam_ref, namsbc, IOSTAT = ios, ERR = 901)
105901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsbc in reference namelist', lwp )
106
107      REWIND( numnam_cfg )              ! Namelist namsbc in configuration namelist : Parameters of the run
108      READ  ( numnam_cfg, namsbc, IOSTAT = ios, ERR = 902 )
109902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsbc in configuration namelist', lwp )
110      IF(lwm) WRITE ( numond, namsbc )
111
112      !                          ! overwrite namelist parameter using CPP key information
113      IF( Agrif_Root() ) THEN                ! AGRIF zoom
114        IF( lk_lim2 )   nn_ice      = 2
115        IF( lk_lim3 )   nn_ice      = 3
116        IF( lk_cice )   nn_ice      = 4
117      ENDIF
118      IF( cp_cfg == 'gyre' ) THEN            ! GYRE configuration
119          ln_ana      = .TRUE.   
120          nn_ice      =   0
121      ENDIF
122
123      IF(lwp) THEN               ! Control print
124         WRITE(numout,*) '        Namelist namsbc (partly overwritten with CPP key setting)'
125         WRITE(numout,*) '           frequency update of sbc (and ice)             nn_fsbc     = ', nn_fsbc
126         WRITE(numout,*) '           Type of sbc : '
127         WRITE(numout,*) '              analytical formulation                     ln_ana      = ', ln_ana
128         WRITE(numout,*) '              flux       formulation                     ln_flx      = ', ln_flx
129         WRITE(numout,*) '              CLIO bulk  formulation                     ln_blk_clio = ', ln_blk_clio
130         WRITE(numout,*) '              CORE bulk  formulation                     ln_blk_core = ', ln_blk_core
131         WRITE(numout,*) '              MFS  bulk  formulation                     ln_blk_mfs  = ', ln_blk_mfs
132         WRITE(numout,*) '              ocean-atmosphere coupled formulation       ln_cpl      = ', ln_cpl
133         WRITE(numout,*) '              forced-coupled mixed formulation           ln_mixcpl   = ', ln_mixcpl
134         WRITE(numout,*) '              OASIS coupling (with atm or sas)           lk_oasis    = ', lk_oasis
135         WRITE(numout,*) '              components of your executable              nn_components = ', nn_components
136         WRITE(numout,*) '              Multicategory heat flux formulation (LIM3) nn_limflx   = ', nn_limflx
137         WRITE(numout,*) '           Misc. options of sbc : '
138         WRITE(numout,*) '              Patm gradient added in ocean & ice Eqs.    ln_apr_dyn  = ', ln_apr_dyn
139         WRITE(numout,*) '              ice management in the sbc (=0/1/2/3)       nn_ice      = ', nn_ice 
140         WRITE(numout,*) '              ice-ocean embedded/levitating (=0/1/2)     nn_ice_embd = ', nn_ice_embd
141         WRITE(numout,*) '              daily mean to diurnal cycle qsr            ln_dm2dc    = ', ln_dm2dc 
142         WRITE(numout,*) '              runoff / runoff mouths                     ln_rnf      = ', ln_rnf
143         WRITE(numout,*) '              iceshelf formulation                       nn_isf      = ', nn_isf
144         WRITE(numout,*) '              Sea Surface Restoring on SST and/or SSS    ln_ssr      = ', ln_ssr
145         WRITE(numout,*) '              FreshWater Budget control  (=0/1/2)        nn_fwb      = ', nn_fwb
146         WRITE(numout,*) '              closed sea (=0/1) (set in namdom)          nn_closea   = ', nn_closea
147         WRITE(numout,*) '              n. of iterations if land-sea-mask applied  nn_lsm      = ', nn_lsm
148      ENDIF
149
150      ! LIM3 Multi-category heat flux formulation
151      SELECT CASE ( nn_limflx)
152      CASE ( -1 )
153         IF(lwp) WRITE(numout,*) '              Use of per-category fluxes (nn_limflx = -1) '
154      CASE ( 0  )
155         IF(lwp) WRITE(numout,*) '              Average per-category fluxes (nn_limflx = 0) ' 
156      CASE ( 1  )
157         IF(lwp) WRITE(numout,*) '              Average then redistribute per-category fluxes (nn_limflx = 1) '
158      CASE ( 2  )
159         IF(lwp) WRITE(numout,*) '              Redistribute a single flux over categories (nn_limflx = 2) '
160      END SELECT
161      !
162      IF ( nn_components /= jp_iam_nemo .AND. .NOT. lk_oasis )   &
163         &      CALL ctl_stop( 'STOP', 'sbc_init : OPA-SAS coupled via OASIS, but key_oasis3 disabled' )
164      IF ( nn_components == jp_iam_opa .AND. ln_cpl )   &
165         &      CALL ctl_stop( 'STOP', 'sbc_init : OPA-SAS coupled via OASIS, but ln_cpl = T in OPA' )
166      IF ( nn_components == jp_iam_opa .AND. ln_mixcpl )   &
167         &      CALL ctl_stop( 'STOP', 'sbc_init : OPA-SAS coupled via OASIS, but ln_mixcpl = T in OPA' )
168      IF ( ln_cpl .AND. .NOT. lk_oasis )    &
169         &      CALL ctl_stop( 'STOP', 'sbc_init : OASIS-coupled atmosphere model, but key_oasis3 disabled' )
170      IF( ln_mixcpl .AND. .NOT. lk_oasis )    &
171         &      CALL ctl_stop( 'the forced-coupled mixed mode (ln_mixcpl) requires the cpp key key_oasis3' )
172      IF( ln_mixcpl .AND. .NOT. ln_cpl )    &
173         &      CALL ctl_stop( 'the forced-coupled mixed mode (ln_mixcpl) requires ln_cpl = T' )
174      IF( ln_mixcpl .AND. nn_components /= jp_iam_nemo )    &
175         &      CALL ctl_stop( 'the forced-coupled mixed mode (ln_mixcpl) is not yet working with sas-opa coupling via oasis' )
176
177      !                              ! allocate sbc arrays
178      IF( sbc_oce_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'sbc_init : unable to allocate sbc_oce arrays' )
179
180      !                          ! Checks:
181      IF( nn_isf .EQ. 0 ) THEN                      ! variable initialisation if no ice shelf
182         IF( sbc_isf_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'sbc_init : unable to allocate sbc_isf arrays' )
183         fwfisf  (:,:)   = 0.0_wp ; fwfisf_b  (:,:)   = 0.0_wp
184         risf_tsc(:,:,:) = 0.0_wp ; risf_tsc_b(:,:,:) = 0.0_wp
185         rdivisf       = 0.0_wp
186      END IF
187      IF( nn_ice == 0 .AND. nn_components /= jp_iam_opa )   fr_i(:,:) = 0.e0 ! no ice in the domain, ice fraction is always zero
188
189      sfx(:,:) = 0.0_wp                            ! the salt flux due to freezing/melting will be computed (i.e. will be non-zero)
190                                                   ! only if sea-ice is present
191 
192      fmmflx(:,:) = 0.0_wp                        ! freezing-melting array initialisation
193     
194      taum(:,:) = 0.0_wp                           ! Initialise taum for use in gls in case of reduced restart
195
196      !                                            ! restartability   
197      IF( ( nn_ice == 2 .OR. nn_ice ==3 ) .AND. .NOT.( ln_blk_clio .OR. ln_blk_core .OR. ln_cpl ) )   &
198         &   CALL ctl_stop( 'LIM sea-ice model requires a bulk formulation or coupled configuration' )
199      IF( nn_ice == 4 .AND. .NOT.( ln_blk_core .OR. ln_cpl ) )   &
200         &   CALL ctl_stop( 'CICE sea-ice model requires ln_blk_core or ln_cpl' )
201      IF( nn_ice == 4 .AND. lk_agrif )   &
202         &   CALL ctl_stop( 'CICE sea-ice model not currently available with AGRIF' )
203      IF( ( nn_ice == 3 .OR. nn_ice == 4 ) .AND. nn_ice_embd == 0 )   &
204         &   CALL ctl_stop( 'LIM3 and CICE sea-ice models require nn_ice_embd = 1 or 2' )
205      IF( ( nn_ice /= 3 ) .AND. ( nn_limflx >= 0 ) )   &
206         &   WRITE(numout,*) 'The nn_limflx>=0 option has no effect if sea ice model is not LIM3'
207      IF( ( nn_ice == 3 ) .AND. ( ln_cpl ) .AND. ( ( nn_limflx == -1 ) .OR. ( nn_limflx == 1 ) ) )   &
208         &   CALL ctl_stop( 'The chosen nn_limflx for LIM3 in coupled mode must be 0 or 2' )
209      IF( ( nn_ice == 3 ) .AND. ( .NOT. ln_cpl ) .AND. ( nn_limflx == 2 ) )   &
210         &   CALL ctl_stop( 'The chosen nn_limflx for LIM3 in forced mode cannot be 2' )
211
212      IF( ln_dm2dc )   nday_qsr = -1   ! initialisation flag
213
214      IF( ln_dm2dc .AND. .NOT.( ln_flx .OR. ln_blk_core ) .AND. nn_components /= jp_iam_opa )   &
215         &   CALL ctl_stop( 'diurnal cycle into qsr field from daily values requires a flux or core-bulk formulation' )
216     
217      IF ( ln_wave ) THEN
218      !Activated wave module but neither drag nor stokes drift activated
219         IF ( .NOT.(ln_cdgw .OR. ln_sdw) )   THEN
220            CALL ctl_warn( 'Ask for wave coupling but nor drag coefficient (ln_cdgw=F) neither stokes drift activated (ln_sdw=F)' )
221      !drag coefficient read from wave model definable only with mfs bulk formulae and core
222         ELSEIF (ln_cdgw .AND. .NOT.(ln_blk_mfs .OR. ln_blk_core) )       THEN       
223             CALL ctl_stop( 'drag coefficient read from wave model definable only with mfs bulk formulae and core')
224         ENDIF
225      ELSE
226      IF ( ln_cdgw .OR. ln_sdw  )                                         & 
227         &   CALL ctl_stop('Not Activated Wave Module (ln_wave=F) but     &
228         & asked coupling with drag coefficient (ln_cdgw =T) or Stokes drift (ln_sdw=T) ')
229      ENDIF 
230      !                          ! Choice of the Surface Boudary Condition (set nsbc)
231      ll_purecpl = ln_cpl .AND. .NOT. ln_mixcpl
232      !
233      icpt = 0
234      IF( ln_ana          ) THEN   ;   nsbc = jp_ana     ; icpt = icpt + 1   ;   ENDIF       ! analytical           formulation
235      IF( ln_flx          ) THEN   ;   nsbc = jp_flx     ; icpt = icpt + 1   ;   ENDIF       ! flux                 formulation
236      IF( ln_blk_clio     ) THEN   ;   nsbc = jp_clio    ; icpt = icpt + 1   ;   ENDIF       ! CLIO bulk            formulation
237      IF( ln_blk_core     ) THEN   ;   nsbc = jp_core    ; icpt = icpt + 1   ;   ENDIF       ! CORE bulk            formulation
238      IF( ln_blk_mfs      ) THEN   ;   nsbc = jp_mfs     ; icpt = icpt + 1   ;   ENDIF       ! MFS  bulk            formulation
239      IF( ll_purecpl      ) THEN   ;   nsbc = jp_purecpl ; icpt = icpt + 1   ;   ENDIF       ! Pure Coupled         formulation
240      IF( cp_cfg == 'gyre') THEN   ;   nsbc = jp_gyre                        ;   ENDIF       ! GYRE analytical      formulation
241      IF( nn_components == jp_iam_opa )   &
242         &                  THEN   ;   nsbc = jp_none    ; icpt = icpt + 1   ;   ENDIF       ! opa coupling via SAS module
243      IF( lk_esopa        )            nsbc = jp_esopa                                       ! esopa test, ALL formulations
244      !
245      IF( icpt /= 1 .AND. .NOT.lk_esopa ) THEN
246         WRITE(numout,*)
247         WRITE(numout,*) '           E R R O R in setting the sbc, one and only one namelist/CPP key option '
248         WRITE(numout,*) '                     must be choosen. You choose ', icpt, ' option(s)'
249         WRITE(numout,*) '                     We stop'
250         nstop = nstop + 1
251      ENDIF
252      IF(lwp) THEN
253         WRITE(numout,*)
254         IF( nsbc == jp_esopa   )   WRITE(numout,*) '              ESOPA test All surface boundary conditions'
255         IF( nsbc == jp_gyre    )   WRITE(numout,*) '              GYRE analytical formulation'
256         IF( nsbc == jp_ana     )   WRITE(numout,*) '              analytical formulation'
257         IF( nsbc == jp_flx     )   WRITE(numout,*) '              flux formulation'
258         IF( nsbc == jp_clio    )   WRITE(numout,*) '              CLIO bulk formulation'
259         IF( nsbc == jp_core    )   WRITE(numout,*) '              CORE bulk formulation'
260         IF( nsbc == jp_purecpl )   WRITE(numout,*) '              pure coupled formulation'
261         IF( nsbc == jp_mfs     )   WRITE(numout,*) '              MFS Bulk formulation'
262         IF( nsbc == jp_none    )   WRITE(numout,*) '              OPA coupled to SAS via oasis'
263         IF( ln_mixcpl          )   WRITE(numout,*) '              + forced-coupled mixed formulation'
264         IF( nn_components/= jp_iam_nemo )  &
265            &                       WRITE(numout,*) '              + OASIS coupled SAS'
266      ENDIF
267      !
268      IF( lk_oasis )   CALL sbc_cpl_init (nn_ice)   ! OASIS initialisation. must be done before: (1) first time step
269      !                                                     !                                            (2) the use of nn_fsbc
270
271!     nn_fsbc initialization if OPA-SAS coupling via OASIS
272!     sas model time step has to be declared in OASIS (mandatory) -> nn_fsbc has to be modified accordingly
273      IF ( nn_components /= jp_iam_nemo ) THEN
274
275         IF ( nn_components == jp_iam_opa ) nn_fsbc = cpl_freq('O_SFLX') / NINT(rdt)
276         IF ( nn_components == jp_iam_sas ) nn_fsbc = cpl_freq('I_SFLX') / NINT(rdt)
277         !
278         IF(lwp)THEN
279            WRITE(numout,*)
280            WRITE(numout,*)"   OPA-SAS coupled via OASIS : nn_fsbc re-defined from OASIS namcouple ", nn_fsbc
281            WRITE(numout,*)
282         ENDIF
283      ENDIF
284
285      IF( MOD( nitend - nit000 + 1, nn_fsbc) /= 0 .OR.   &
286          MOD( nstock             , nn_fsbc) /= 0 ) THEN
287         WRITE(ctmp1,*) 'experiment length (', nitend - nit000 + 1, ') or nstock (', nstock,   &
288            &           ' is NOT a multiple of nn_fsbc (', nn_fsbc, ')'
289         CALL ctl_stop( ctmp1, 'Impossible to properly do model restart' )
290      ENDIF
291      !
292      IF( MOD( rday, REAL(nn_fsbc, wp) * rdt ) /= 0 )   &
293         &  CALL ctl_warn( 'nn_fsbc is NOT a multiple of the number of time steps in a day' )
294      !
295      IF( ln_dm2dc .AND. ( ( NINT(rday) / ( nn_fsbc * NINT(rdt) ) )  < 8 ) )   &
296         &   CALL ctl_warn( 'diurnal cycle for qsr: the sampling of the diurnal cycle is too small...' )
297
298                               CALL sbc_ssm_init               ! Sea-surface mean fields initialisation
299      !
300      IF( ln_ssr           )   CALL sbc_ssr_init               ! Sea-Surface Restoring initialisation
301      !
302                               CALL sbc_rnf_init               ! Runof initialisation
303      !
304      IF( nn_ice == 3      )   CALL sbc_lim_init               ! LIM3 initialisation
305
306      IF( nn_ice == 4      )   CALL cice_sbc_init( nsbc )      ! CICE initialisation
307     
308   END SUBROUTINE sbc_init
309
310
311   SUBROUTINE sbc( kt )
312      !!---------------------------------------------------------------------
313      !!                    ***  ROUTINE sbc  ***
314      !!             
315      !! ** Purpose :   provide at each time-step the ocean surface boundary
316      !!                condition (momentum, heat and freshwater fluxes)
317      !!
318      !! ** Method  :   blah blah  to be written ?????????
319      !!                CAUTION : never mask the surface stress field (tke sbc)
320      !!
321      !! ** Action  : - set the ocean surface boundary condition at before and now
322      !!                time step, i.e. 
323      !!                utau_b, vtau_b, qns_b, qsr_b, emp_n, sfx_b, qrp_b, erp_b
324      !!                utau  , vtau  , qns  , qsr  , emp  , sfx  , qrp  , erp
325      !!              - updte the ice fraction : fr_i
326      !!----------------------------------------------------------------------
327      INTEGER, INTENT(in) ::   kt       ! ocean time step
328      !!---------------------------------------------------------------------
329      !
330      IF( nn_timing == 1 )  CALL timing_start('sbc')
331      !
332      !                                            ! ---------------------------------------- !
333      IF( kt /= nit000 ) THEN                      !          Swap of forcing fields          !
334         !                                         ! ---------------------------------------- !
335         utau_b(:,:) = utau(:,:)                         ! Swap the ocean forcing fields
336         vtau_b(:,:) = vtau(:,:)                         ! (except at nit000 where before fields
337         qns_b (:,:) = qns (:,:)                         !  are set at the end of the routine)
338         ! The 3D heat content due to qsr forcing is treated in traqsr
339         ! qsr_b (:,:) = qsr (:,:)
340         emp_b(:,:) = emp(:,:)
341         sfx_b(:,:) = sfx(:,:)
342         IF ( ln_rnf ) THEN
343            rnf_b    (:,:  ) = rnf    (:,:  )
344            rnf_tsc_b(:,:,:) = rnf_tsc(:,:,:)
345         ENDIF
346      ENDIF
347      !                                            ! ---------------------------------------- !
348      !                                            !        forcing field computation         !
349      !                                            ! ---------------------------------------- !
350      !
351      IF ( .NOT. lk_bdy ) then
352         IF( ln_apr_dyn ) CALL sbc_apr( kt )                ! atmospheric pressure provided at kt+0.5*nn_fsbc
353      ENDIF
354                                                         ! (caution called before sbc_ssm)
355      !
356      IF( nn_components /= jp_iam_sas )   CALL sbc_ssm( kt )   ! ocean sea surface variables (sst_m, sss_m, ssu_m, ssv_m)
357      !                                                        ! averaged over nf_sbc time-step
358
359      IF (ln_wave) CALL sbc_wave( kt )
360                                                   !==  sbc formulation  ==!
361                                                           
362      SELECT CASE( nsbc )                                ! Compute ocean surface boundary condition
363      !                                                  ! (i.e. utau,vtau, qns, qsr, emp, sfx)
364      CASE( jp_gyre  )   ;   CALL sbc_gyre    ( kt )                    ! analytical formulation : GYRE configuration
365      CASE( jp_ana   )   ;   CALL sbc_ana     ( kt )                    ! analytical formulation : uniform sbc
366      CASE( jp_flx   )   ;   CALL sbc_flx     ( kt )                    ! flux formulation
367      CASE( jp_clio  )   ;   CALL sbc_blk_clio( kt )                    ! bulk formulation : CLIO for the ocean
368      CASE( jp_core  )   
369         IF( nn_components == jp_iam_sas ) &
370            &                CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice )   ! OPA-SAS coupling: SAS receiving fields from OPA
371                             CALL sbc_blk_core( kt )                    ! bulk formulation : CORE for the ocean
372                                                                        ! from oce: sea surface variables (sst_m, sss_m,  ssu_m,  ssv_m)
373      CASE( jp_purecpl )  ;  CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice )   ! pure coupled formulation
374                                                                        !
375      CASE( jp_mfs   )   ;   CALL sbc_blk_mfs ( kt )                    ! bulk formulation : MFS for the ocean
376      CASE( jp_none  ) 
377         IF( nn_components == jp_iam_opa ) &
378                             CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice )   ! OPA-SAS coupling: OPA receiving fields from SAS
379      CASE( jp_esopa )                               
380                             CALL sbc_ana     ( kt )                    ! ESOPA, test ALL the formulations
381                             CALL sbc_gyre    ( kt )                    !
382                             CALL sbc_flx     ( kt )                    !
383                             CALL sbc_blk_clio( kt )                    !
384                             CALL sbc_blk_core( kt )                    !
385                             CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice )   !
386      END SELECT
387
388      IF( ln_mixcpl )        CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice )   ! forced-coupled mixed formulation after forcing
389
390
391      !                                            !==  Misc. Options  ==!
392     
393      SELECT CASE( nn_ice )                                       ! Update heat and freshwater fluxes over sea-ice areas
394      CASE(  1 )   ;         CALL sbc_ice_if   ( kt )                ! Ice-cover climatology ("Ice-if" model)
395      CASE(  2 )   ;         CALL sbc_ice_lim_2( kt, nsbc )          ! LIM-2 ice model
396      CASE(  3 )   ;         CALL sbc_ice_lim  ( kt, nsbc )          ! LIM-3 ice model
397      CASE(  4 )   ;         CALL sbc_ice_cice ( kt, nsbc )          ! CICE ice model
398      END SELECT                                             
399
400      IF( ln_icebergs    )   CALL icb_stp( kt )                   ! compute icebergs
401
402      IF( nn_isf   /= 0  )   CALL sbc_isf( kt )                    ! compute iceshelves
403
404      IF( ln_rnf         )   CALL sbc_rnf( kt )                   ! add runoffs to fresh water fluxes
405 
406      IF( ln_ssr         )   CALL sbc_ssr( kt )                   ! add SST/SSS damping term
407
408      IF( nn_fwb    /= 0 )   CALL sbc_fwb( kt, nn_fwb, nn_fsbc )  ! control the freshwater budget
409
410      IF( nn_closea == 1 )   CALL sbc_clo( kt )                   ! treatment of closed sea in the model domain
411      !                                                           ! (update freshwater fluxes)
412!RBbug do not understand why see ticket 667
413!clem: it looks like it is necessary for the north fold (in certain circumstances). Don't know why.
414      CALL lbc_lnk( emp, 'T', 1. )
415      !
416      IF( kt == nit000 ) THEN                          !   set the forcing field at nit000 - 1    !
417         !                                             ! ---------------------------------------- !
418         IF( ln_rstart .AND.    &                               !* Restart: read in restart file
419            & iom_varid( numror, 'utau_b', ldstop = .FALSE. ) > 0 ) THEN
420            IF(lwp) WRITE(numout,*) '          nit000-1 surface forcing fields red in the restart file'
421            CALL iom_get( numror, jpdom_autoglo, 'utau_b', utau_b )   ! before i-stress  (U-point)
422            CALL iom_get( numror, jpdom_autoglo, 'vtau_b', vtau_b )   ! before j-stress  (V-point)
423            CALL iom_get( numror, jpdom_autoglo, 'qns_b' , qns_b  )   ! before non solar heat flux (T-point)
424            ! The 3D heat content due to qsr forcing is treated in traqsr
425            ! CALL iom_get( numror, jpdom_autoglo, 'qsr_b' , qsr_b  ) ! before     solar heat flux (T-point)
426            CALL iom_get( numror, jpdom_autoglo, 'emp_b', emp_b  )    ! before     freshwater flux (T-point)
427            ! To ensure restart capability with 3.3x/3.4 restart files    !! to be removed in v3.6
428            IF( iom_varid( numror, 'sfx_b', ldstop = .FALSE. ) > 0 ) THEN
429               CALL iom_get( numror, jpdom_autoglo, 'sfx_b', sfx_b )  ! before salt flux (T-point)
430            ELSE
431               sfx_b (:,:) = sfx(:,:)
432            ENDIF
433         ELSE                                                   !* no restart: set from nit000 values
434            IF(lwp) WRITE(numout,*) '          nit000-1 surface forcing fields set to nit000'
435            utau_b(:,:) = utau(:,:) 
436            vtau_b(:,:) = vtau(:,:)
437            qns_b (:,:) = qns (:,:)
438            emp_b (:,:) = emp(:,:)
439            sfx_b (:,:) = sfx(:,:)
440         ENDIF
441      ENDIF
442      !                                                ! ---------------------------------------- !
443      IF( lrst_oce ) THEN                              !      Write in the ocean restart file     !
444         !                                             ! ---------------------------------------- !
445         IF(lwp) WRITE(numout,*)
446         IF(lwp) WRITE(numout,*) 'sbc : ocean surface forcing fields written in ocean restart file ',   &
447            &                    'at it= ', kt,' date= ', ndastp
448         IF(lwp) WRITE(numout,*) '~~~~'
449         CALL iom_rstput( kt, nitrst, numrow, 'utau_b' , utau )
450         CALL iom_rstput( kt, nitrst, numrow, 'vtau_b' , vtau )
451         CALL iom_rstput( kt, nitrst, numrow, 'qns_b'  , qns  )
452         ! The 3D heat content due to qsr forcing is treated in traqsr
453         ! CALL iom_rstput( kt, nitrst, numrow, 'qsr_b'  , qsr  )
454         CALL iom_rstput( kt, nitrst, numrow, 'emp_b'  , emp  )
455         CALL iom_rstput( kt, nitrst, numrow, 'sfx_b'  , sfx  )
456      ENDIF
457
458      !                                                ! ---------------------------------------- !
459      !                                                !        Outputs and control print         !
460      !                                                ! ---------------------------------------- !
461      IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN
462         CALL iom_put( "empmr"  , emp    - rnf )                ! upward water flux
463         CALL iom_put( "empbmr" , emp_b  - rnf )                ! before upward water flux ( needed to recalculate the time evolution of ssh in offline )
464         CALL iom_put( "saltflx", sfx  )                        ! downward salt flux 
465                                                                ! (includes virtual salt flux beneath ice
466                                                                ! in linear free surface case)
467         CALL iom_put( "fmmflx", fmmflx  )                      ! Freezing-melting water flux
468         CALL iom_put( "qt"    , qns  + qsr )                   ! total heat flux
469         CALL iom_put( "qns"   , qns        )                   ! solar heat flux
470         CALL iom_put( "qsr"   ,       qsr  )                   ! solar heat flux
471         IF( nn_ice > 0 .OR. nn_components == jp_iam_opa )   CALL iom_put( "ice_cover", fr_i )   ! ice fraction
472         CALL iom_put( "taum"  , taum       )                   ! wind stress module
473         CALL iom_put( "wspd"  , wndm       )                   ! wind speed  module over free ocean or leads in presence of sea-ice
474      ENDIF
475      !
476      CALL iom_put( "utau", utau )   ! i-wind stress   (stress can be updated at
477      CALL iom_put( "vtau", vtau )   ! j-wind stress    each time step in sea-ice)
478      !
479      IF(ln_ctl) THEN         ! print mean trends (used for debugging)
480         CALL prt_ctl(tab2d_1=fr_i              , clinfo1=' fr_i     - : ', mask1=tmask, ovlap=1 )
481         CALL prt_ctl(tab2d_1=(emp-rnf + fwfisf), clinfo1=' emp-rnf  - : ', mask1=tmask, ovlap=1 )
482         CALL prt_ctl(tab2d_1=(sfx-rnf + fwfisf), clinfo1=' sfx-rnf  - : ', mask1=tmask, ovlap=1 )
483         CALL prt_ctl(tab2d_1=qns              , clinfo1=' qns      - : ', mask1=tmask, ovlap=1 )
484         CALL prt_ctl(tab2d_1=qsr              , clinfo1=' qsr      - : ', mask1=tmask, ovlap=1 )
485         CALL prt_ctl(tab3d_1=tmask            , clinfo1=' tmask    - : ', mask1=tmask, ovlap=1, kdim=jpk )
486         CALL prt_ctl(tab3d_1=tsn(:,:,:,jp_tem), clinfo1=' sst      - : ', mask1=tmask, ovlap=1, kdim=1   )
487         CALL prt_ctl(tab3d_1=tsn(:,:,:,jp_sal), clinfo1=' sss      - : ', mask1=tmask, ovlap=1, kdim=1   )
488         CALL prt_ctl(tab2d_1=utau             , clinfo1=' utau     - : ', mask1=umask,                      &
489            &         tab2d_2=vtau             , clinfo2=' vtau     - : ', mask2=vmask, ovlap=1 )
490      ENDIF
491
492      IF( kt == nitend )   CALL sbc_final         ! Close down surface module if necessary
493      !
494      IF( nn_timing == 1 )  CALL timing_stop('sbc')
495      !
496   END SUBROUTINE sbc
497
498
499   SUBROUTINE sbc_final
500      !!---------------------------------------------------------------------
501      !!                    ***  ROUTINE sbc_final  ***
502      !!
503      !! ** Purpose :   Finalize CICE (if used)
504      !!---------------------------------------------------------------------
505      !
506      IF( nn_ice == 4 )   CALL cice_sbc_final
507      !
508   END SUBROUTINE sbc_final
509
510   !!======================================================================
511END MODULE sbcmod
Note: See TracBrowser for help on using the repository browser.