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.
traadv_ubs.F90 in NEMO/branches/2020/dev_r13296_HPC-07_mocavero_mpi3/src/OCE/TRA – NEMO

source: NEMO/branches/2020/dev_r13296_HPC-07_mocavero_mpi3/src/OCE/TRA/traadv_ubs.F90 @ 13630

Last change on this file since 13630 was 13630, checked in by mocavero, 4 years ago

Add neighborhood collectives calls in the NEMO src - ticket #2496

  • Property svn:keywords set to Id
File size: 19.4 KB
Line 
1MODULE traadv_ubs
2   !!==============================================================================
3   !!                       ***  MODULE  traadv_ubs  ***
4   !! Ocean active tracers:  horizontal & vertical advective trend
5   !!==============================================================================
6   !! History :  1.0  !  2006-08  (L. Debreu, R. Benshila)  Original code
7   !!            3.3  !  2010-05  (C. Ethe, G. Madec)  merge TRC-TRA + switch from velocity to transport
8   !!----------------------------------------------------------------------
9
10   !!----------------------------------------------------------------------
11   !!   tra_adv_ubs : update the tracer trend with the horizontal
12   !!                 advection trends using a third order biaised scheme 
13   !!----------------------------------------------------------------------
14   USE oce            ! ocean dynamics and active tracers
15   USE dom_oce        ! ocean space and time domain
16   USE trc_oce        ! share passive tracers/Ocean variables
17   USE trd_oce        ! trends: ocean variables
18   USE traadv_fct      ! acces to routine interp_4th_cpt
19   USE trdtra         ! trends manager: tracers
20   USE diaptr         ! poleward transport diagnostics
21   USE diaar5         ! AR5 diagnostics
22   !
23   USE iom            ! I/O library
24   USE in_out_manager ! I/O manager
25   USE lib_mpp        ! massively parallel library
26   USE lbclnk         ! ocean lateral boundary condition (or mpp link)
27   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
28
29   IMPLICIT NONE
30   PRIVATE
31
32   PUBLIC   tra_adv_ubs   ! routine called by traadv module
33
34   LOGICAL :: l_trd   ! flag to compute trends
35   LOGICAL :: l_ptr   ! flag to compute poleward transport
36   LOGICAL :: l_hst   ! flag to compute heat transport
37
38
39   !! * Substitutions
40#  include "do_loop_substitute.h90"
41#  include "domzgr_substitute.h90"
42   !!----------------------------------------------------------------------
43   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
44   !! $Id$
45   !! Software governed by the CeCILL license (see ./LICENSE)
46   !!----------------------------------------------------------------------
47CONTAINS
48
49   SUBROUTINE tra_adv_ubs( kt, kit000, cdtype, p2dt, pU, pV, pW,          &
50      &                    Kbb, Kmm, pt, kjpt, Krhs, kn_ubs_v )
51      !!----------------------------------------------------------------------
52      !!                  ***  ROUTINE tra_adv_ubs  ***
53      !!                 
54      !! ** Purpose :   Compute the now trend due to the advection of tracers
55      !!      and add it to the general trend of passive tracer equations.
56      !!
57      !! ** Method  :   The 3rd order Upstream Biased Scheme (UBS) is based on an
58      !!      upstream-biased parabolic interpolation (Shchepetkin and McWilliams 2005)
59      !!      It is only used in the horizontal direction.
60      !!      For example the i-component of the advective fluxes are given by :
61      !!                !  e2u e3u un ( mi(Tn) - zltu(i  ) )   if un(i) >= 0
62      !!          ztu = !  or
63      !!                !  e2u e3u un ( mi(Tn) - zltu(i+1) )   if un(i) < 0
64      !!      where zltu is the second derivative of the before temperature field:
65      !!          zltu = 1/e3t di[ e2u e3u / e1u di[Tb] ]
66      !!        This results in a dissipatively dominant (i.e. hyper-diffusive)
67      !!      truncation error. The overall performance of the advection scheme
68      !!      is similar to that reported in (Farrow and Stevens, 1995).
69      !!        For stability reasons, the first term of the fluxes which corresponds
70      !!      to a second order centered scheme is evaluated using the now velocity
71      !!      (centered in time) while the second term which is the diffusive part
72      !!      of the scheme, is evaluated using the before velocity (forward in time).
73      !!      Note that UBS is not positive. Do not use it on passive tracers.
74      !!                On the vertical, the advection is evaluated using a FCT scheme,
75      !!      as the UBS have been found to be too diffusive.
76      !!                kn_ubs_v argument controles whether the FCT is based on
77      !!      a 2nd order centrered scheme (kn_ubs_v=2) or on a 4th order compact
78      !!      scheme (kn_ubs_v=4).
79      !!
80      !! ** Action : - update pt(:,:,:,:,Krhs)  with the now advective tracer trends
81      !!             - send trends to trdtra module for further diagnostcs (l_trdtra=T)
82      !!             - poleward advective heat and salt transport (ln_diaptr=T)
83      !!
84      !! Reference : Shchepetkin, A. F., J. C. McWilliams, 2005, Ocean Modelling, 9, 347-404.
85      !!             Farrow, D.E., Stevens, D.P., 1995, J. Phys. Ocean. 25, 1731�1741.
86      !!----------------------------------------------------------------------
87      INTEGER                                  , INTENT(in   ) ::   kt              ! ocean time-step index
88      INTEGER                                  , INTENT(in   ) ::   Kbb, Kmm, Krhs  ! ocean time level indices
89      INTEGER                                  , INTENT(in   ) ::   kit000          ! first time step index
90      CHARACTER(len=3)                         , INTENT(in   ) ::   cdtype          ! =TRA or TRC (tracer indicator)
91      INTEGER                                  , INTENT(in   ) ::   kjpt            ! number of tracers
92      INTEGER                                  , INTENT(in   ) ::   kn_ubs_v        ! number of tracers
93      REAL(wp)                                 , INTENT(in   ) ::   p2dt            ! tracer time-step
94      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume transport components
95      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! tracers and RHS of tracer equation
96      !
97      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
98      REAL(wp) ::   ztra, zbtr, zcoef                       ! local scalars
99      REAL(wp) ::   zfp_ui, zfm_ui, zcenut, ztak, zfp_wk, zfm_wk   !   -      -
100      REAL(wp) ::   zfp_vj, zfm_vj, zcenvt, zeeu, zeev, z_hdivn    !   -      -
101      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   ztu, ztv, zltu, zltv, zti, ztw   ! 3D workspace
102      !!----------------------------------------------------------------------
103      !
104      IF( kt == kit000 )  THEN
105         IF(lwp) WRITE(numout,*)
106         IF(lwp) WRITE(numout,*) 'tra_adv_ubs :  horizontal UBS advection scheme on ', cdtype
107         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~'
108      ENDIF
109      !
110      l_trd = .FALSE.
111      l_hst = .FALSE.
112      l_ptr = .FALSE.
113      IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) )      l_trd = .TRUE.
114      IF(   cdtype == 'TRA' .AND. ( iom_use( 'sophtadv' ) .OR. iom_use( 'sophtadv' ) )  )   l_ptr = .TRUE. 
115      IF(   cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. &
116         &                          iom_use("uadv_salttr") .OR. iom_use("vadv_salttr")  ) ) l_hst = .TRUE.
117      !
118      ztw (:,:, 1 ) = 0._wp      ! surface & bottom value : set to zero for all tracers
119      zltu(:,:,jpk) = 0._wp   ;   zltv(:,:,jpk) = 0._wp
120      ztw (:,:,jpk) = 0._wp   ;   zti (:,:,jpk) = 0._wp
121      !
122      !                                                          ! ===========
123      DO jn = 1, kjpt                                            ! tracer loop
124         !                                                       ! ===========
125         !                                             
126         DO jk = 1, jpkm1                !==  horizontal laplacian of before tracer ==!
127            DO_2D( 1, 0, 1, 0 )                   ! First derivative (masked gradient)
128               zeeu = e2_e1u(ji,jj) * e3u(ji,jj,jk,Kmm) * umask(ji,jj,jk)
129               zeev = e1_e2v(ji,jj) * e3v(ji,jj,jk,Kmm) * vmask(ji,jj,jk)
130               ztu(ji,jj,jk) = zeeu * ( pt(ji+1,jj  ,jk,jn,Kbb) - pt(ji,jj,jk,jn,Kbb) )
131               ztv(ji,jj,jk) = zeev * ( pt(ji  ,jj+1,jk,jn,Kbb) - pt(ji,jj,jk,jn,Kbb) )
132            END_2D
133            DO_2D( 0, 0, 0, 0 )                   ! Second derivative (divergence)
134               zcoef = 1._wp / ( 6._wp * e3t(ji,jj,jk,Kmm) )
135               zltu(ji,jj,jk) = (  ztu(ji,jj,jk) - ztu(ji-1,jj,jk)  ) * zcoef
136               zltv(ji,jj,jk) = (  ztv(ji,jj,jk) - ztv(ji,jj-1,jk)  ) * zcoef
137            END_2D
138            !                                   
139         END DO         
140#if defined key_mpi3
141         CALL lbc_lnk_nc_multi( 'traadv_ubs', zltu, 'T', 1.0_wp )   ;    CALL lbc_lnk_nc_multi( 'traadv_ubs', zltv, 'T', 1.0_wp )   ! Lateral boundary cond. (unchanged sgn)
142#else
143         CALL lbc_lnk( 'traadv_ubs', zltu, 'T', 1.0_wp )   ;    CALL lbc_lnk( 'traadv_ubs', zltv, 'T', 1.0_wp )   ! Lateral boundary cond. (unchanged sgn)
144#endif
145         !   
146         DO_3D( 1, 0, 1, 0, 1, jpkm1 )   !==  Horizontal advective fluxes  ==!     (UBS)
147            zfp_ui = pU(ji,jj,jk) + ABS( pU(ji,jj,jk) )        ! upstream transport (x2)
148            zfm_ui = pU(ji,jj,jk) - ABS( pU(ji,jj,jk) )
149            zfp_vj = pV(ji,jj,jk) + ABS( pV(ji,jj,jk) )
150            zfm_vj = pV(ji,jj,jk) - ABS( pV(ji,jj,jk) )
151            !                                                  ! 2nd order centered advective fluxes (x2)
152            zcenut = pU(ji,jj,jk) * ( pt(ji,jj,jk,jn,Kmm) + pt(ji+1,jj  ,jk,jn,Kmm) )
153            zcenvt = pV(ji,jj,jk) * ( pt(ji,jj,jk,jn,Kmm) + pt(ji  ,jj+1,jk,jn,Kmm) )
154            !                                                  ! UBS advective fluxes
155            ztu(ji,jj,jk) = 0.5 * ( zcenut - zfp_ui * zltu(ji,jj,jk) - zfm_ui * zltu(ji+1,jj,jk) )
156            ztv(ji,jj,jk) = 0.5 * ( zcenvt - zfp_vj * zltv(ji,jj,jk) - zfm_vj * zltv(ji,jj+1,jk) )
157         END_3D
158         !
159         zltu(:,:,:) = pt(:,:,:,jn,Krhs)      ! store the initial trends before its update
160         !
161         DO jk = 1, jpkm1        !==  add the horizontal advective trend  ==!
162            DO_2D( 0, 0, 0, 0 )
163               pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs)                        &
164                  &             - (  ztu(ji,jj,jk) - ztu(ji-1,jj  ,jk)    &
165                  &                + ztv(ji,jj,jk) - ztv(ji  ,jj-1,jk)  ) &
166                  &                * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)
167            END_2D
168            !                                             
169         END DO
170         !
171         zltu(:,:,:) = pt(:,:,:,jn,Krhs) - zltu(:,:,:)    ! Horizontal advective trend used in vertical 2nd order FCT case
172         !                                                ! and/or in trend diagnostic (l_trd=T)
173         !               
174         IF( l_trd ) THEN                  ! trend diagnostics
175             CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_xad, ztu, pU, pt(:,:,:,jn,Kmm) )
176             CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_yad, ztv, pV, pt(:,:,:,jn,Kmm) )
177         END IF
178         !     
179         !                                ! "Poleward" heat and salt transports (contribution of upstream fluxes)
180         IF( l_ptr )  CALL dia_ptr_hst( jn, 'adv', ztv(:,:,:) )
181         !                                !  heati/salt transport
182         IF( l_hst )  CALL dia_ar5_hst( jn, 'adv', ztu(:,:,:), ztv(:,:,:) )
183         !
184         !
185         !                       !== vertical advective trend  ==!
186         !
187         SELECT CASE( kn_ubs_v )       ! select the vertical advection scheme
188         !
189         CASE(  2  )                   ! 2nd order FCT
190            !         
191            IF( l_trd )   zltv(:,:,:) = pt(:,:,:,jn,Krhs)          ! store pt(:,:,:,:,Krhs) if trend diag.
192            !
193            !                               !*  upstream advection with initial mass fluxes & intermediate update  ==!
194            DO_3D( 1, 1, 1, 1, 2, jpkm1 )
195               zfp_wk = pW(ji,jj,jk) + ABS( pW(ji,jj,jk) )
196               zfm_wk = pW(ji,jj,jk) - ABS( pW(ji,jj,jk) )
197               ztw(ji,jj,jk) = 0.5_wp * (  zfp_wk * pt(ji,jj,jk,jn,Kbb) + zfm_wk * pt(ji,jj,jk-1,jn,Kbb)  ) * wmask(ji,jj,jk)
198            END_3D
199            IF( ln_linssh ) THEN                ! top ocean value (only in linear free surface as ztw has been w-masked)
200               IF( ln_isfcav ) THEN                   ! top of the ice-shelf cavities and at the ocean surface
201                  DO_2D( 1, 1, 1, 1 )
202                     ztw(ji,jj, mikt(ji,jj) ) = pW(ji,jj,mikt(ji,jj)) * pt(ji,jj,mikt(ji,jj),jn,Kbb)   ! linear free surface
203                  END_2D
204               ELSE                                   ! no cavities: only at the ocean surface
205                  ztw(:,:,1) = pW(:,:,1) * pt(:,:,1,jn,Kbb)
206               ENDIF
207            ENDIF
208            !
209            DO_3D( 0, 0, 0, 0, 1, jpkm1 )   !* trend and after field with monotonic scheme
210               ztak = - ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) )    &
211                  &     * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)
212               pt(ji,jj,jk,jn,Krhs) =   pt(ji,jj,jk,jn,Krhs) +  ztak 
213               zti(ji,jj,jk)    = ( pt(ji,jj,jk,jn,Kbb) + p2dt * ( ztak + zltu(ji,jj,jk) ) ) * tmask(ji,jj,jk)
214            END_3D
215#if defined key_mpi3
216            CALL lbc_lnk_nc_multi( 'traadv_ubs', zti, 'T', 1.0_wp )      ! Lateral boundary conditions on zti, zsi   (unchanged sign)
217#else
218            CALL lbc_lnk( 'traadv_ubs', zti, 'T', 1.0_wp )      ! Lateral boundary conditions on zti, zsi   (unchanged sign)
219#endif
220            !
221            !                          !*  anti-diffusive flux : high order minus low order
222            DO_3D( 1, 1, 1, 1, 2, jpkm1 )
223               ztw(ji,jj,jk) = (   0.5_wp * pW(ji,jj,jk) * ( pt(ji,jj,jk,jn,Kmm) + pt(ji,jj,jk-1,jn,Kmm) )   &
224                  &              - ztw(ji,jj,jk)   ) * wmask(ji,jj,jk)
225            END_3D
226            !                                            ! top ocean value: high order == upstream  ==>>  zwz=0
227            IF( ln_linssh )   ztw(:,:, 1 ) = 0._wp       ! only ocean surface as interior zwz values have been w-masked
228            !
229            CALL nonosc_z( Kmm, pt(:,:,:,jn,Kbb), ztw, zti, p2dt )      !  monotonicity algorithm
230            !
231         CASE(  4  )                               ! 4th order COMPACT
232            CALL interp_4th_cpt( pt(:,:,:,jn,Kmm) , ztw )         ! 4th order compact interpolation of T at w-point
233            DO_3D( 0, 0, 0, 0, 2, jpkm1 )
234               ztw(ji,jj,jk) = pW(ji,jj,jk) * ztw(ji,jj,jk) * wmask(ji,jj,jk)
235            END_3D
236            IF( ln_linssh )   ztw(:,:, 1 ) = pW(:,:,1) * pt(:,:,1,jn,Kmm)     !!gm ISF & 4th COMPACT doesn't work
237            !
238         END SELECT
239         !
240         DO_3D( 0, 0, 0, 0, 1, jpkm1 )   !  final trend with corrected fluxes
241            pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) )    &
242               &                                        * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)
243         END_3D
244         !
245         IF( l_trd )  THEN               ! vertical advective trend diagnostics
246            DO_3D( 0, 0, 0, 0, 1, jpkm1 )                 ! (compute -w.dk[ptn]= -dk[w.ptn] + ptn.dk[w])
247               zltv(ji,jj,jk) = pt(ji,jj,jk,jn,Krhs) - zltv(ji,jj,jk)                          &
248                  &           + pt(ji,jj,jk,jn,Kmm) * (  pW(ji,jj,jk) - pW(ji,jj,jk+1)  )   &
249                  &                              * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)
250            END_3D
251            CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_zad, zltv )
252         ENDIF
253         !
254      END DO
255      !
256   END SUBROUTINE tra_adv_ubs
257
258
259   SUBROUTINE nonosc_z( Kmm, pbef, pcc, paft, p2dt )
260      !!---------------------------------------------------------------------
261      !!                    ***  ROUTINE nonosc_z  ***
262      !!     
263      !! **  Purpose :   compute monotonic tracer fluxes from the upstream
264      !!       scheme and the before field by a nonoscillatory algorithm
265      !!
266      !! **  Method  :   ... ???
267      !!       warning : pbef and paft must be masked, but the boundaries
268      !!       conditions on the fluxes are not necessary zalezak (1979)
269      !!       drange (1995) multi-dimensional forward-in-time and upstream-
270      !!       in-space based differencing for fluid
271      !!----------------------------------------------------------------------
272      INTEGER , INTENT(in   )                          ::   Kmm    ! time level index
273      REAL(wp), INTENT(in   )                          ::   p2dt   ! tracer time-step
274      REAL(wp),                DIMENSION (jpi,jpj,jpk) ::   pbef   ! before field
275      REAL(wp), INTENT(inout), DIMENSION (jpi,jpj,jpk) ::   paft   ! after field
276      REAL(wp), INTENT(inout), DIMENSION (jpi,jpj,jpk) ::   pcc    ! monotonic flux in the k direction
277      !
278      INTEGER  ::   ji, jj, jk   ! dummy loop indices
279      INTEGER  ::   ikm1         ! local integer
280      REAL(wp) ::   zpos, zneg, zbt, za, zb, zc, zbig, zrtrn   ! local scalars
281      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zbetup, zbetdo     ! 3D workspace
282      !!----------------------------------------------------------------------
283      !
284      zbig  = 1.e+38_wp
285      zrtrn = 1.e-15_wp
286      zbetup(:,:,:) = 0._wp   ;   zbetdo(:,:,:) = 0._wp
287      !
288      ! Search local extrema
289      ! --------------------
290      !                    ! large negative value (-zbig) inside land
291      pbef(:,:,:) = pbef(:,:,:) * tmask(:,:,:) - zbig * ( 1.e0 - tmask(:,:,:) )
292      paft(:,:,:) = paft(:,:,:) * tmask(:,:,:) - zbig * ( 1.e0 - tmask(:,:,:) )
293      !
294      DO jk = 1, jpkm1     ! search maximum in neighbourhood
295         ikm1 = MAX(jk-1,1)
296         DO_2D( 0, 0, 0, 0 )
297            zbetup(ji,jj,jk) = MAX(  pbef(ji  ,jj  ,jk  ), paft(ji  ,jj  ,jk  ),   &
298               &                     pbef(ji  ,jj  ,ikm1), pbef(ji  ,jj  ,jk+1),   &
299               &                     paft(ji  ,jj  ,ikm1), paft(ji  ,jj  ,jk+1)  )
300         END_2D
301      END DO
302      !                    ! large positive value (+zbig) inside land
303      pbef(:,:,:) = pbef(:,:,:) * tmask(:,:,:) + zbig * ( 1.e0 - tmask(:,:,:) )
304      paft(:,:,:) = paft(:,:,:) * tmask(:,:,:) + zbig * ( 1.e0 - tmask(:,:,:) )
305      !
306      DO jk = 1, jpkm1     ! search minimum in neighbourhood
307         ikm1 = MAX(jk-1,1)
308         DO_2D( 0, 0, 0, 0 )
309            zbetdo(ji,jj,jk) = MIN(  pbef(ji  ,jj  ,jk  ), paft(ji  ,jj  ,jk  ),   &
310               &                     pbef(ji  ,jj  ,ikm1), pbef(ji  ,jj  ,jk+1),   &
311               &                     paft(ji  ,jj  ,ikm1), paft(ji  ,jj  ,jk+1)  )
312         END_2D
313      END DO
314      !                    ! restore masked values to zero
315      pbef(:,:,:) = pbef(:,:,:) * tmask(:,:,:)
316      paft(:,:,:) = paft(:,:,:) * tmask(:,:,:)
317      !
318      ! Positive and negative part of fluxes and beta terms
319      ! ---------------------------------------------------
320      DO_3D( 0, 0, 0, 0, 1, jpkm1 )
321         ! positive & negative part of the flux
322         zpos = MAX( 0., pcc(ji  ,jj  ,jk+1) ) - MIN( 0., pcc(ji  ,jj  ,jk  ) )
323         zneg = MAX( 0., pcc(ji  ,jj  ,jk  ) ) - MIN( 0., pcc(ji  ,jj  ,jk+1) )
324         ! up & down beta terms
325         zbt = e1e2t(ji,jj) * e3t(ji,jj,jk,Kmm) / p2dt
326         zbetup(ji,jj,jk) = ( zbetup(ji,jj,jk) - paft(ji,jj,jk) ) / (zpos+zrtrn) * zbt
327         zbetdo(ji,jj,jk) = ( paft(ji,jj,jk) - zbetdo(ji,jj,jk) ) / (zneg+zrtrn) * zbt
328      END_3D
329      !
330      ! monotonic flux in the k direction, i.e. pcc
331      ! -------------------------------------------
332      DO_3D( 0, 0, 0, 0, 2, jpkm1 )
333         za = MIN( 1., zbetdo(ji,jj,jk), zbetup(ji,jj,jk-1) )
334         zb = MIN( 1., zbetup(ji,jj,jk), zbetdo(ji,jj,jk-1) )
335         zc = 0.5 * ( 1.e0 + SIGN( 1.0_wp, pcc(ji,jj,jk) ) )
336         pcc(ji,jj,jk) = pcc(ji,jj,jk) * ( zc * za + ( 1.e0 - zc) * zb )
337      END_3D
338      !
339   END SUBROUTINE nonosc_z
340
341   !!======================================================================
342END MODULE traadv_ubs
Note: See TracBrowser for help on using the repository browser.