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

source: branches/2011/dev_r2802_UKMO8_cice/NEMOGCM/NEMO/OPA_SRC/SBC/sbcmod.F90 @ 2874

Last change on this file since 2874 was 2874, checked in by charris, 13 years ago

Code for running NEMO with CICE (for fully coupled mode this should be used in combination with dev_r2802_UKMO8_sbccpl). Changes are described briefly below.

physct: Constants modified to be consistent with CICE

nemogcm / prtctl / mppini: Changes to NEMO decomposition (activated using key_nemocice_decomp) to produce 'square' options in CICE. Can run without this key / code but this requires a global gather / scatter in the NEMO-CICE coupling which gets very slow on large processors numbers.

sbc_ice: CICE options and arrays added

sbcmod: CICE option added, including calls for initialising and finalising CICE.

sbcblk_core: Make sure necessary forcing field are available for CICE

sbcice_cice: Main CICE coupling code.

  • Property svn:keywords set to Id
File size: 21.7 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   !!----------------------------------------------------------------------
14
15   !!----------------------------------------------------------------------
16   !!   sbc_init       : read namsbc namelist
17   !!   sbc            : surface ocean momentum, heat and freshwater boundary conditions
18   !!----------------------------------------------------------------------
19   USE oce              ! ocean dynamics and tracers
20   USE dom_oce          ! ocean space and time domain
21   USE phycst           ! physical constants
22   USE sbc_oce          ! Surface boundary condition: ocean fields
23   USE sbc_ice          ! Surface boundary condition: ice fields
24   USE sbcdcy           ! surface boundary condition: diurnal cycle
25   USE sbcssm           ! surface boundary condition: sea-surface mean variables
26   USE sbcapr           ! surface boundary condition: atmospheric pressure
27   USE sbcana           ! surface boundary condition: analytical formulation
28   USE sbcflx           ! surface boundary condition: flux formulation
29   USE sbcblk_clio      ! surface boundary condition: bulk formulation : CLIO
30   USE sbcblk_core      ! surface boundary condition: bulk formulation : CORE
31   USE sbcice_if        ! surface boundary condition: ice-if sea-ice model
32   USE sbcice_lim       ! surface boundary condition: LIM 3.0 sea-ice model
33   USE sbcice_lim_2     ! surface boundary condition: LIM 2.0 sea-ice model
34   USE sbcice_cice      ! surface boundary condition: CICE    sea-ice model
35   USE sbccpl           ! surface boundary condition: coupled florulation
36   USE cpl_oasis3, ONLY:lk_cpl      ! are we in coupled mode?
37   USE sbcssr           ! surface boundary condition: sea surface restoring
38   USE sbcrnf           ! surface boundary condition: runoffs
39   USE sbcfwb           ! surface boundary condition: freshwater budget
40   USE closea           ! closed sea
41   USE bdy_par          ! unstructured open boundary data variables
42   USE bdyice           ! unstructured open boundary data  (bdy_ice_frs routine)
43
44   USE prtctl           ! Print control                    (prt_ctl routine)
45   USE restart          ! ocean restart
46   USE iom              ! IOM library
47   USE in_out_manager   ! I/O manager
48   USE lib_mpp          ! MPP library
49
50   IMPLICIT NONE
51   PRIVATE
52
53   PUBLIC   sbc        ! routine called by step.F90
54   PUBLIC   sbc_init   ! routine called by opa.F90
55   
56   INTEGER ::   nsbc   ! type of surface boundary condition (deduced from namsbc informations)
57     
58   !! * Substitutions
59#  include "domzgr_substitute.h90"
60   !!----------------------------------------------------------------------
61   !! NEMO/OPA 4.0 , NEMO-consortium (2011)
62   !! $Id$
63   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
64   !!----------------------------------------------------------------------
65CONTAINS
66
67   SUBROUTINE sbc_init
68      !!---------------------------------------------------------------------
69      !!                    ***  ROUTINE sbc_init ***
70      !!
71      !! ** Purpose :   Initialisation of the ocean surface boundary computation
72      !!
73      !! ** Method  :   Read the namsbc namelist and set derived parameters
74      !!
75      !! ** Action  : - read namsbc parameters
76      !!              - nsbc: type of sbc
77      !!----------------------------------------------------------------------
78      INTEGER ::   icpt   ! local integer
79      !!
80      NAMELIST/namsbc/ nn_fsbc   , ln_ana , ln_flx  , ln_blk_clio, ln_blk_core, ln_cpl,   &
81         &             ln_apr_dyn, nn_ice , ln_dm2dc, ln_rnf     , ln_ssr     , nn_fwb
82      !!----------------------------------------------------------------------
83
84      IF(lwp) THEN
85         WRITE(numout,*)
86         WRITE(numout,*) 'sbc_init : surface boundary condition setting'
87         WRITE(numout,*) '~~~~~~~~ '
88      ENDIF
89
90      REWIND( numnam )           ! Read Namelist namsbc
91      READ  ( numnam, namsbc )
92
93      !                          ! overwrite namelist parameter using CPP key information
94      IF( Agrif_Root() ) THEN                ! AGRIF zoom
95        IF( lk_lim2 )   nn_ice      = 2
96        IF( lk_lim3 )   nn_ice      = 3
97        IF( lk_cice )   nn_ice      = 4
98      ENDIF
99      IF( cp_cfg == 'gyre' ) THEN            ! GYRE configuration
100          ln_ana      = .TRUE.   
101          nn_ice      =   0
102      ENDIF
103     
104      IF(lwp) THEN               ! Control print
105         WRITE(numout,*) '        Namelist namsbc (partly overwritten with CPP key setting)'
106         WRITE(numout,*) '           frequency update of sbc (and ice)             nn_fsbc     = ', nn_fsbc
107         WRITE(numout,*) '           Type of sbc : '
108         WRITE(numout,*) '              analytical formulation                     ln_ana      = ', ln_ana
109         WRITE(numout,*) '              flux       formulation                     ln_flx      = ', ln_flx
110         WRITE(numout,*) '              CLIO bulk  formulation                     ln_blk_clio = ', ln_blk_clio
111         WRITE(numout,*) '              CLIO bulk  formulation                     ln_blk_core = ', ln_blk_core
112         WRITE(numout,*) '              coupled    formulation (T if key_sbc_cpl)  ln_cpl      = ', ln_cpl
113         WRITE(numout,*) '           Misc. options of sbc : '
114         WRITE(numout,*) '              Patm gradient added in ocean & ice Eqs.    ln_apr_dyn  = ', ln_apr_dyn
115         WRITE(numout,*) '              ice management in the sbc (=0/1/2/3)       nn_ice      = ', nn_ice 
116         WRITE(numout,*) '              daily mean to diurnal cycle qsr            ln_dm2dc    = ', ln_dm2dc 
117         WRITE(numout,*) '              runoff / runoff mouths                     ln_rnf      = ', ln_rnf
118         WRITE(numout,*) '              Sea Surface Restoring on SST and/or SSS    ln_ssr      = ', ln_ssr
119         WRITE(numout,*) '              FreshWater Budget control  (=0/1/2)        nn_fwb      = ', nn_fwb
120         WRITE(numout,*) '              closed sea (=0/1) (set in namdom)          nn_closea   = ', nn_closea
121      ENDIF
122
123      !                              ! allocate sbc arrays
124      IF( sbc_oce_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'sbc_init : unable to allocate sbc_oce arrays' )
125
126      !                          ! Checks:
127      IF( .NOT. ln_rnf ) THEN                      ! no specific treatment in vicinity of river mouths
128         ln_rnf_mouth  = .false.                     
129         IF( sbc_rnf_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'sbc_init : unable to allocate sbc_rnf arrays' )
130         nkrnf         = 0
131         rnf     (:,:) = 0.e0
132         rnfmsk  (:,:) = 0.e0
133         rnfmsk_z(:)   = 0.e0
134      ENDIF
135      IF( nn_ice == 0  )   fr_i(:,:) = 0.e0        ! no ice in the domain, ice fraction is always zero
136
137      !                                            ! restartability   
138      IF( MOD( nitend - nit000 + 1, nn_fsbc) /= 0 .OR.   &
139          MOD( nstock             , nn_fsbc) /= 0 ) THEN
140         WRITE(ctmp1,*) 'experiment length (', nitend - nit000 + 1, ') or nstock (', nstock,   &
141            &           ' is NOT a multiple of nn_fsbc (', nn_fsbc, ')'
142         CALL ctl_stop( ctmp1, 'Impossible to properly do model restart' )
143      ENDIF
144      !
145      IF( MOD( rday, REAL(nn_fsbc, wp) * rdt ) /= 0 )   &
146         &  CALL ctl_warn( 'nn_fsbc is NOT a multiple of the number of time steps in a day' )
147      !
148      IF( ( nn_ice == 2 .OR. nn_ice ==3 ) .AND. .NOT.( ln_blk_clio .OR. ln_blk_core .OR. lk_cpl ) )   &
149         &   CALL ctl_stop( 'LIM sea-ice model requires a bulk formulation or coupled configuration' )
150      IF( nn_ice == 4 .AND. .NOT.( ln_flx .OR. ln_blk_core .OR. lk_cpl ) )   &
151         &   CALL ctl_stop( 'CICE sea-ice model requires ln_blk_core, ln_flx or ln_cpl' )
152     
153      IF( ln_dm2dc )   nday_qsr = -1   ! initialisation flag
154
155      IF( ln_dm2dc .AND. .NOT.( ln_flx .OR. ln_blk_core ) )   &
156         &   CALL ctl_stop( 'diurnal cycle into qsr field from daily values requires a flux or core-bulk formulation' )
157     
158      IF( ln_dm2dc .AND. ( ( NINT(rday) / ( nn_fsbc * NINT(rdt) ) )  < 8 ) )   &
159         &   CALL ctl_warn( 'diurnal cycle for qsr: the sampling of the diurnal cycle is too small...' )
160     
161      !                          ! Choice of the Surface Boudary Condition (set nsbc)
162      icpt = 0
163      IF( ln_ana          ) THEN   ;   nsbc =  1   ; icpt = icpt + 1   ;   ENDIF       ! analytical      formulation
164      IF( ln_flx          ) THEN   ;   nsbc =  2   ; icpt = icpt + 1   ;   ENDIF       ! flux            formulation
165      IF( ln_blk_clio     ) THEN   ;   nsbc =  3   ; icpt = icpt + 1   ;   ENDIF       ! CLIO bulk       formulation
166      IF( ln_blk_core     ) THEN   ;   nsbc =  4   ; icpt = icpt + 1   ;   ENDIF       ! CORE bulk       formulation
167      IF( ln_cpl          ) THEN   ;   nsbc =  5   ; icpt = icpt + 1   ;   ENDIF       ! Coupled         formulation
168      IF( cp_cfg == 'gyre') THEN   ;   nsbc =  0                       ;   ENDIF       ! GYRE analytical formulation
169      IF( lk_esopa        )            nsbc = -1                                       ! esopa test, ALL formulations
170      !
171      IF( icpt /= 1 .AND. .NOT.lk_esopa ) THEN
172         WRITE(numout,*)
173         WRITE(numout,*) '           E R R O R in setting the sbc, one and only one namelist/CPP key option '
174         WRITE(numout,*) '                     must be choosen. You choose ', icpt, ' option(s)'
175         WRITE(numout,*) '                     We stop'
176         nstop = nstop + 1
177      ENDIF
178      IF(lwp) THEN
179         WRITE(numout,*)
180         IF( nsbc == -1 )   WRITE(numout,*) '              ESOPA test All surface boundary conditions'
181         IF( nsbc ==  0 )   WRITE(numout,*) '              GYRE analytical formulation'
182         IF( nsbc ==  1 )   WRITE(numout,*) '              analytical formulation'
183         IF( nsbc ==  2 )   WRITE(numout,*) '              flux formulation'
184         IF( nsbc ==  3 )   WRITE(numout,*) '              CLIO bulk formulation'
185         IF( nsbc ==  4 )   WRITE(numout,*) '              CORE bulk formulation'
186         IF( nsbc ==  5 )   WRITE(numout,*) '              coupled formulation'
187      ENDIF
188
189      IF( nn_ice == 4 )   CALL cice_sbc_init (nsbc)
190      !
191   END SUBROUTINE sbc_init
192
193
194   SUBROUTINE sbc( kt )
195      !!---------------------------------------------------------------------
196      !!                    ***  ROUTINE sbc  ***
197      !!             
198      !! ** Purpose :   provide at each time-step the ocean surface boundary
199      !!                condition (momentum, heat and freshwater fluxes)
200      !!
201      !! ** Method  :   blah blah  to be written ?????????
202      !!                CAUTION : never mask the surface stress field (tke sbc)
203      !!
204      !! ** Action  : - set the ocean surface boundary condition at before and now
205      !!                time step, i.e. 
206      !!                utau_b, vtau_b, qns_b, qsr_b, emp_n, emps_b, qrp_b, erp_b
207      !!                utau  , vtau  , qns  , qsr  , emp  , emps  , qrp  , erp
208      !!              - updte the ice fraction : fr_i
209      !!----------------------------------------------------------------------
210      INTEGER, INTENT(in) ::   kt       ! ocean time step
211      !!---------------------------------------------------------------------
212
213      !                                            ! ---------------------------------------- !
214      IF( kt /= nit000 ) THEN                      !          Swap of forcing fields          !
215         !                                         ! ---------------------------------------- !
216         utau_b(:,:) = utau(:,:)                         ! Swap the ocean forcing fields
217         vtau_b(:,:) = vtau(:,:)                         ! (except at nit000 where before fields
218         qns_b (:,:) = qns (:,:)                         !  are set at the end of the routine)
219         ! The 3D heat content due to qsr forcing is treated in traqsr
220         ! qsr_b (:,:) = qsr (:,:)
221         emp_b (:,:) = emp (:,:)
222         emps_b(:,:) = emps(:,:)
223      ENDIF
224      !                                            ! ---------------------------------------- !
225      !                                            !        forcing field computation         !
226      !                                            ! ---------------------------------------- !
227
228      CALL iom_setkt( kt + nn_fsbc - 1 )                 ! in sbc, iom_put is called every nn_fsbc time step
229      !
230      IF( ln_apr_dyn ) CALL sbc_apr( kt )                ! atmospheric pressure provided at kt+0.5*nn_fsbc
231                                                         ! (caution called before sbc_ssm)
232      !
233      CALL sbc_ssm( kt )                                 ! ocean sea surface variables (sst_m, sss_m, ssu_m, ssv_m)
234      !                                                  ! averaged over nf_sbc time-step
235
236                                                   !==  sbc formulation  ==!
237                                                           
238      SELECT CASE( nsbc )                                ! Compute ocean surface boundary condition
239      !                                                  ! (i.e. utau,vtau, qns, qsr, emp, emps)
240      CASE(  0 )   ;   CALL sbc_gyre    ( kt )                    ! analytical formulation : GYRE configuration
241      CASE(  1 )   ;   CALL sbc_ana     ( kt )                    ! analytical formulation : uniform sbc
242      CASE(  2 )   ;   CALL sbc_flx     ( kt )                    ! flux formulation
243      CASE(  3 )   ;   CALL sbc_blk_clio( kt )                    ! bulk formulation : CLIO for the ocean
244      CASE(  4 )   ;   CALL sbc_blk_core( kt )                    ! bulk formulation : CORE for the ocean
245      CASE(  5 )   ;   CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice )   ! coupled formulation
246      CASE( -1 )                               
247                       CALL sbc_ana     ( kt )                    ! ESOPA, test ALL the formulations
248                       CALL sbc_gyre    ( kt )                    !
249                       CALL sbc_flx     ( kt )                    !
250                       CALL sbc_blk_clio( kt )                    !
251                       CALL sbc_blk_core( kt )                    !
252                       CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice )   !
253      END SELECT
254
255      !                                            !==  Misc. Options  ==!
256     
257      SELECT CASE( nn_ice )                                     ! Update heat and freshwater fluxes over sea-ice areas
258      CASE(  1 )   ;       CALL sbc_ice_if   ( kt )                  ! Ice-cover climatology ("Ice-if" model)
259         !                                                     
260      CASE(  2 )   ;       CALL sbc_ice_lim_2( kt, nsbc )            ! LIM-2 ice model
261         IF( lk_bdy )      CALL bdy_ice_frs  ( kt )                  ! BDY boundary condition
262         !                                                     
263      CASE(  3 )   ;       CALL sbc_ice_lim  ( kt, nsbc )            ! LIM-3 ice model
264         !
265      CASE(  4 )   ;       CALL sbc_ice_cice ( kt, nsbc )            ! CICE ice model
266      END SELECT                                             
267
268      IF( ln_rnf       )   CALL sbc_rnf( kt )                   ! add runoffs to fresh water fluxes
269 
270      IF( ln_ssr       )   CALL sbc_ssr( kt )                   ! add SST/SSS damping term
271
272      IF( nn_fwb  /= 0 )   CALL sbc_fwb( kt, nn_fwb, nn_fsbc )  ! control the freshwater budget
273
274      IF( nclosea == 1 )   CALL sbc_clo( kt )                   ! treatment of closed sea in the model domain
275      !                                                         ! (update freshwater fluxes)
276!RBbug do not understand why see ticket 667
277      CALL lbc_lnk( emp, 'T', 1. )
278      !
279      IF( kt == nit000 ) THEN                          !   set the forcing field at nit000 - 1    !
280         !                                             ! ---------------------------------------- !
281         IF( ln_rstart .AND.    &                               !* Restart: read in restart file
282            & iom_varid( numror, 'utau_b', ldstop = .FALSE. ) > 0 ) THEN
283            IF(lwp) WRITE(numout,*) '          nit000-1 surface forcing fields red in the restart file'
284            CALL iom_get( numror, jpdom_autoglo, 'utau_b', utau_b )   ! before i-stress  (U-point)
285            CALL iom_get( numror, jpdom_autoglo, 'vtau_b', vtau_b )   ! before j-stress  (V-point)
286            CALL iom_get( numror, jpdom_autoglo, 'qns_b' , qns_b  )   ! before non solar heat flux (T-point)
287            ! The 3D heat content due to qsr forcing is treated in traqsr
288            ! CALL iom_get( numror, jpdom_autoglo, 'qsr_b' , qsr_b  )   ! before     solar heat flux (T-point)
289            CALL iom_get( numror, jpdom_autoglo, 'emp_b' , emp_b  )   ! before     freshwater flux (T-point)
290            CALL iom_get( numror, jpdom_autoglo, 'emps_b', emps_b )   ! before C/D freshwater flux (T-point)
291         ELSE                                                   !* no restart: set from nit000 values
292            IF(lwp) WRITE(numout,*) '          nit000-1 surface forcing fields set to nit000'
293            utau_b(:,:) = utau(:,:) 
294            vtau_b(:,:) = vtau(:,:)
295            qns_b (:,:) = qns (:,:)
296            ! qsr_b (:,:) = qsr (:,:)
297            emp_b (:,:) = emp (:,:)
298            emps_b(:,:) = emps(:,:)
299         ENDIF
300      ENDIF
301      !                                                ! ---------------------------------------- !
302      IF( lrst_oce ) THEN                              !      Write in the ocean restart file     !
303         !                                             ! ---------------------------------------- !
304         IF(lwp) WRITE(numout,*)
305         IF(lwp) WRITE(numout,*) 'sbc : ocean surface forcing fields written in ocean restart file ',   &
306            &                    'at it= ', kt,' date= ', ndastp
307         IF(lwp) WRITE(numout,*) '~~~~'
308         CALL iom_rstput( kt, nitrst, numrow, 'utau_b' , utau )
309         CALL iom_rstput( kt, nitrst, numrow, 'vtau_b' , vtau )
310         CALL iom_rstput( kt, nitrst, numrow, 'qns_b'  , qns  )
311         ! The 3D heat content due to qsr forcing is treated in traqsr
312         ! CALL iom_rstput( kt, nitrst, numrow, 'qsr_b'  , qsr  )
313         CALL iom_rstput( kt, nitrst, numrow, 'emp_b'  , emp  )
314         CALL iom_rstput( kt, nitrst, numrow, 'emps_b' , emps )
315      ENDIF
316
317      !                                                ! ---------------------------------------- !
318      !                                                !        Outputs and control print         !
319      !                                                ! ---------------------------------------- !
320      IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN
321         CALL iom_put( "empmr" , emp  - rnf )                   ! upward water flux
322         CALL iom_put( "empsmr", emps - rnf )                   ! c/d water flux
323         CALL iom_put( "qt"    , qns  + qsr )                   ! total heat flux
324         CALL iom_put( "qns"   , qns        )                   ! solar heat flux
325         CALL iom_put( "qsr"   ,       qsr  )                   ! solar heat flux
326         IF( nn_ice > 0 )   CALL iom_put( "ice_cover", fr_i )   ! ice fraction
327      ENDIF
328      !
329      CALL iom_setkt( kt )           ! iom_put outside of sbc is called at every time step
330      !
331      CALL iom_put( "utau", utau )   ! i-wind stress   (stress can be updated at
332      CALL iom_put( "vtau", vtau )   ! j-wind stress    each time step in sea-ice)
333      CALL iom_put( "taum", taum )   ! wind stress module
334      CALL iom_put( "wspd", wndm )   ! wind speed  module
335      !
336      IF(ln_ctl) THEN         ! print mean trends (used for debugging)
337         CALL prt_ctl(tab2d_1=fr_i      , clinfo1=' fr_i     - : ', mask1=tmask, ovlap=1 )
338         CALL prt_ctl(tab2d_1=(emp-rnf) , clinfo1=' emp-rnf  - : ', mask1=tmask, ovlap=1 )
339         CALL prt_ctl(tab2d_1=(emps-rnf), clinfo1=' emps-rnf - : ', mask1=tmask, ovlap=1 )
340         CALL prt_ctl(tab2d_1=qns       , clinfo1=' qns      - : ', mask1=tmask, ovlap=1 )
341         CALL prt_ctl(tab2d_1=qsr       , clinfo1=' qsr      - : ', mask1=tmask, ovlap=1 )
342         CALL prt_ctl(tab3d_1=tmask     , clinfo1=' tmask    - : ', mask1=tmask, ovlap=1, kdim=jpk )
343         CALL prt_ctl(tab3d_1=tn        , clinfo1=' sst      - : ', mask1=tmask, ovlap=1, kdim=1   )
344         CALL prt_ctl(tab3d_1=sn        , clinfo1=' sss      - : ', mask1=tmask, ovlap=1, kdim=1   )
345         CALL prt_ctl(tab2d_1=utau      , clinfo1=' utau     - : ', mask1=umask,                      &
346            &         tab2d_2=vtau      , clinfo2=' vtau     - : ', mask2=vmask, ovlap=1 )
347      ENDIF
348
349      IF( kt == nitend )   CALL sbc_final         ! Close down surface module if necessary
350      !
351   END SUBROUTINE sbc
352
353   SUBROUTINE sbc_final
354      !!---------------------------------------------------------------------
355      !!                    ***  ROUTINE sbc_final  ***
356      !!---------------------------------------------------------------------
357
358      !-----------------------------------------------------------------
359      ! Finalize CICE (if used)
360      !-----------------------------------------------------------------
361
362      IF( nn_ice == 4 )   CALL cice_sbc_final
363      !
364   END SUBROUTINE sbc_final
365
366   !!======================================================================
367END MODULE sbcmod
Note: See TracBrowser for help on using the repository browser.