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

source: branches/2015/dev_r5803_NOC_WAD/NEMOGCM/NEMO/OPA_SRC/SBC/sbcmod.F90 @ 5870

Last change on this file since 5870 was 5870, checked in by acc, 8 years ago

Branch 2015/dev_r5803_NOC_WAD. Merge in trunk changes from 5803 to 5869 in preparation for merge. Also tidied and reorganised some wetting and drying code. Renamed wadlmt.F90 to wetdry.F90. Wetting drying code changes restricted to domzgr.F90, domvvl.F90 nemogcm.F90 sshwzv.F90, dynspg_ts.F90, wetdry.F90 and dynhpg.F90. Code passes full SETTE tests with ln_wd=.false.. Still awaiting test case for checking with ln_wd=.false.

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