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_mle.F90 in branches/2015/dev_r5803_NOC_WAD/NEMOGCM/NEMO/OPA_SRC/TRA – NEMO

source: branches/2015/dev_r5803_NOC_WAD/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_mle.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: 19.0 KB
Line 
1MODULE traadv_mle
2   !!======================================================================
3   !!                    ***  MODULE  traadv_mle  ***
4   !! Ocean tracers: Mixed Layer Eddy induced transport
5   !!======================================================================
6   !! History :  3.3  !  2010-08  (G. Madec)  Original code
7   !!----------------------------------------------------------------------
8
9   !!----------------------------------------------------------------------
10   !!   tra_adv_mle      : update the effective transport with the Mixed Layer Eddy induced transport
11   !!   tra_adv_mle_init : initialisation of the Mixed Layer Eddy induced transport computation
12   !!----------------------------------------------------------------------
13   USE oce            ! ocean dynamics and tracers variables
14   USE dom_oce        ! ocean space and time domain variables
15   USE phycst         ! physical constant
16   USE zdfmxl         ! mixed layer depth
17   USE lbclnk         ! lateral boundary condition / mpp link
18   USE in_out_manager ! I/O manager
19   USE iom            ! IOM library
20   USE lib_mpp        ! MPP library
21   USE wrk_nemo       ! work arrays
22   USE timing         ! Timing
23
24   IMPLICIT NONE
25   PRIVATE
26
27   PUBLIC   tra_adv_mle        ! routine called in traadv.F90
28   PUBLIC   tra_adv_mle_init   ! routine called in traadv.F90
29
30   !                                       !!* namelist namtra_adv_mle *
31   LOGICAL, PUBLIC ::   ln_mle              ! flag to activate the Mixed Layer Eddy (MLE) parameterisation
32   INTEGER         ::   nn_mle              ! MLE type: =0 standard Fox-Kemper ; =1 new formulation
33   INTEGER         ::   nn_mld_uv           ! space interpolation of MLD at u- & v-pts (0=min,1=averaged,2=max)
34   INTEGER         ::   nn_conv             ! =1 no MLE in case of convection ; =0 always MLE
35   REAL(wp)        ::   rn_ce               ! MLE coefficient
36   !                                        ! parameters used in nn_mle = 0 case
37   REAL(wp)        ::   rn_lf                  ! typical scale of mixed layer front
38   REAL(wp)        ::   rn_time                ! time scale for mixing momentum across the mixed layer
39   !                                        ! parameters used in nn_mle = 1 case
40   REAL(wp)        ::   rn_lat                 ! reference latitude for a 5 km scale of ML front
41   REAL(wp)        ::   rn_rho_c_mle           ! Density criterion for definition of MLD used by FK
42
43   REAL(wp) ::   r5_21 = 5.e0 / 21.e0   ! factor used in mle streamfunction computation
44   REAL(wp) ::   rb_c                   ! ML buoyancy criteria = g rho_c /rau0 where rho_c is defined in zdfmld
45   REAL(wp) ::   rc_f                   ! MLE coefficient (= rn_ce / (5 km * fo) ) in nn_mle=1 case
46
47   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   rfu, rfv   ! modified Coriolis parameter (f+tau) at u- & v-pts
48   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   r1_ft      ! inverse of the modified Coriolis parameter at t-pts
49
50   !! * Substitutions
51#  include "domzgr_substitute.h90"
52#  include "vectopt_loop_substitute.h90"
53   !!----------------------------------------------------------------------
54   !! NEMO/OPA 4.0 , NEMO Consortium (2015)
55   !! $Id$
56   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
57   !!----------------------------------------------------------------------
58CONTAINS
59
60   SUBROUTINE tra_adv_mle( kt, kit000, pu, pv, pw, cdtype )
61      !!----------------------------------------------------------------------
62      !!                  ***  ROUTINE adv_mle  ***
63      !!
64      !! ** Purpose :   Add to the transport the Mixed Layer Eddy induced transport
65      !!
66      !! ** Method  :   The 3 components of the Mixed Layer Eddy (MLE) induced
67      !!              transport are computed as follows :
68      !!                zu_mle = dk[ zpsi_uw ]
69      !!                zv_mle = dk[ zpsi_vw ]
70      !!                zw_mle = - di[ zpsi_uw ] - dj[ zpsi_vw ]
71      !!                where zpsi is the MLE streamfunction at uw and vw points (see the doc)
72      !!              and added to the input velocity :
73      !!                p.n = p.n + z._mle
74      !!
75      !! ** Action  : - (pun,pvn,pwn) increased by the mle transport
76      !!                CAUTION, the transport is not updated at the last line/raw
77      !!                         this may be a problem for some advection schemes
78      !!
79      !! References: Fox-Kemper et al., JPO, 38, 1145-1165, 2008
80      !!             Fox-Kemper and Ferrari, JPO, 38, 1166-1179, 2008
81      !!----------------------------------------------------------------------
82      INTEGER                         , INTENT(in   ) ::   kt         ! ocean time-step index
83      INTEGER                         , INTENT(in   ) ::   kit000     ! first time step index
84      CHARACTER(len=3)                , INTENT(in   ) ::   cdtype     ! =TRA or TRC (tracer indicator)
85      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu         ! in : 3 ocean transport components
86      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pv         ! out: same 3  transport components
87      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pw         !   increased by the MLE induced transport
88      !
89      INTEGER  ::   ji, jj, jk   ! dummy loop indices
90      INTEGER  ::   ikmax        ! temporary integer
91      REAL(wp) ::   zcuw, zmuw   ! local scalar
92      REAL(wp) ::   zcvw, zmvw   !   -      -
93      REAL(wp) ::   zc                                     !   -      -
94      !
95      INTEGER  ::   ii, ij, ik              ! local integers
96      INTEGER, DIMENSION(3) ::   ilocu      !
97      INTEGER, DIMENSION(2) ::   ilocs      !
98      REAL(wp), POINTER, DIMENSION(:,:  ) :: zpsim_u, zpsim_v, zmld, zbm, zhu, zhv, zn2, zLf_NH, zLf_MH
99      REAL(wp), POINTER, DIMENSION(:,:,:) :: zpsi_uw, zpsi_vw
100      INTEGER, POINTER, DIMENSION(:,:) :: inml_mle
101      !!----------------------------------------------------------------------
102      !
103      IF( nn_timing == 1 )  CALL timing_start('tra_adv_mle')
104      CALL wrk_alloc( jpi, jpj, zpsim_u, zpsim_v, zmld, zbm, zhu, zhv, zn2, zLf_NH, zLf_MH)
105      CALL wrk_alloc( jpi, jpj, jpk, zpsi_uw, zpsi_vw)
106      CALL wrk_alloc( jpi, jpj, inml_mle)
107      !
108      !                                      !==  MLD used for MLE  ==!
109      !                                                ! compute from the 10m density to deal with the diurnal cycle
110      inml_mle(:,:) = mbkt(:,:) + 1                    ! init. to number of ocean w-level (T-level + 1)
111      DO jk = jpkm1, nlb10, -1                         ! from the bottom to nlb10 (10m)
112         DO jj = 1, jpj
113            DO ji = 1, jpi                             ! index of the w-level at the ML based
114               IF( rhop(ji,jj,jk) > rhop(ji,jj,nla10) + rn_rho_c_mle )   inml_mle(ji,jj) = jk      ! Mixed layer
115            END DO
116         END DO
117      END DO
118      ikmax = MIN( MAXVAL( inml_mle(:,:) ), jpkm1 )                  ! max level of the computation
119      !
120      !
121      zmld(:,:) = 0._wp                      !==   Horizontal shape of the MLE  ==!
122      zbm (:,:) = 0._wp
123      zn2 (:,:) = 0._wp
124      DO jk = 1, ikmax                                 ! MLD and mean buoyancy and N2 over the mixed layer
125         DO jj = 1, jpj
126            DO ji = 1, jpi
127               zc = fse3t(ji,jj,jk) * REAL( MIN( MAX( 0, inml_mle(ji,jj)-jk ) , 1  )  )    ! zc being 0 outside the ML t-points
128               zmld(ji,jj) = zmld(ji,jj) + zc
129               zbm (ji,jj) = zbm (ji,jj) + zc * (rau0 - rhop(ji,jj,jk) ) * r1_rau0
130               zn2 (ji,jj) = zn2 (ji,jj) + zc * (rn2(ji,jj,jk)+rn2(ji,jj,jk+1))*0.5_wp
131            END DO
132         END DO
133      END DO
134
135      SELECT CASE( nn_mld_uv )                         ! MLD at u- & v-pts
136      CASE ( 0 )                                               != min of the 2 neighbour MLDs
137         DO jj = 1, jpjm1
138            DO ji = 1, fs_jpim1   ! vector opt.
139               zhu(ji,jj) = MIN( zmld(ji+1,jj), zmld(ji,jj) )
140               zhv(ji,jj) = MIN( zmld(ji,jj+1), zmld(ji,jj) )
141            END DO
142         END DO
143      CASE ( 1 )                                               != average of the 2 neighbour MLDs
144         DO jj = 1, jpjm1
145            DO ji = 1, fs_jpim1   ! vector opt.
146               zhu(ji,jj) = ( zmld(ji+1,jj) + zmld(ji,jj) ) * 0.5_wp
147               zhv(ji,jj) = ( zmld(ji,jj+1) + zmld(ji,jj) ) * 0.5_wp
148            END DO
149         END DO
150      CASE ( 2 )                                               != max of the 2 neighbour MLDs
151         DO jj = 1, jpjm1
152            DO ji = 1, fs_jpim1   ! vector opt.
153               zhu(ji,jj) = MAX( zmld(ji+1,jj), zmld(ji,jj) )
154               zhv(ji,jj) = MAX( zmld(ji,jj+1), zmld(ji,jj) )
155            END DO
156         END DO
157      END SELECT
158      !                                                ! convert density into buoyancy
159      zbm(:,:) = + grav * zbm(:,:) / MAX( fse3t(:,:,1), zmld(:,:) )
160      !
161      !
162      !                                      !==  Magnitude of the MLE stream function  ==!
163      !
164      !                 di[bm]  Ds
165      ! Psi = Ce  H^2 ---------------- e2u  mu(z)   where fu Lf = MAX( fu*rn_fl , (Db H)^1/2 )
166      !                  e1u   Lf fu                      and the e2u for the "transport"
167      !                                                      (not *e3u as divided by e3u at the end)
168      !
169      IF( nn_mle == 0 ) THEN           ! Fox-Kemper et al. 2010 formulation
170         DO jj = 1, jpjm1
171            DO ji = 1, fs_jpim1   ! vector opt.
172               zpsim_u(ji,jj) = rn_ce * zhu(ji,jj) * zhu(ji,jj)  * e2_e1u(ji,jj)                                            &
173                  &           * ( zbm(ji+1,jj) - zbm(ji,jj) ) * MIN( 111.e3_wp , e1u(ji,jj) )   &
174                  &           / (  MAX( rn_lf * rfu(ji,jj) , SQRT( rb_c * zhu(ji,jj) ) )   )
175                  !
176               zpsim_v(ji,jj) = rn_ce * zhv(ji,jj) * zhv(ji,jj)  * e1_e2v(ji,jj)                                            &
177                  &           * ( zbm(ji,jj+1) - zbm(ji,jj) ) * MIN( 111.e3_wp , e2v(ji,jj) )   &
178                  &           / (  MAX( rn_lf * rfv(ji,jj) , SQRT( rb_c * zhv(ji,jj) ) )   )
179            END DO
180         END DO
181         !
182      ELSEIF( nn_mle == 1 ) THEN       ! New formulation (Lf = 5km fo/ff with fo=Coriolis parameter at latitude rn_lat)
183         DO jj = 1, jpjm1
184            DO ji = 1, fs_jpim1   ! vector opt.
185               zpsim_u(ji,jj) = rc_f *   zhu(ji,jj)   * zhu(ji,jj)   * e2_e1u(ji,jj)               &
186                  &                  * ( zbm(ji+1,jj) - zbm(ji,jj) ) * MIN( 111.e3_wp , e1u(ji,jj) )
187                  !
188               zpsim_v(ji,jj) = rc_f *   zhv(ji,jj)   * zhv(ji,jj)   * e1_e2v(ji,jj)               &
189                  &                  * ( zbm(ji,jj+1) - zbm(ji,jj) ) * MIN( 111.e3_wp , e2v(ji,jj) )
190            END DO
191         END DO
192      ENDIF
193      !
194      IF( nn_conv == 1 ) THEN              ! No MLE in case of convection
195         DO jj = 1, jpjm1
196            DO ji = 1, fs_jpim1   ! vector opt.
197               IF( MIN( zn2(ji,jj) , zn2(ji+1,jj) ) < 0._wp )   zpsim_u(ji,jj) = 0._wp
198               IF( MIN( zn2(ji,jj) , zn2(ji,jj+1) ) < 0._wp )   zpsim_v(ji,jj) = 0._wp
199            END DO
200         END DO
201      ENDIF
202      !
203      !                                      !==  structure function value at uw- and vw-points  ==!
204      DO jj = 1, jpjm1
205         DO ji = 1, fs_jpim1   ! vector opt.
206            zhu(ji,jj) = 1._wp / zhu(ji,jj)                   ! hu --> 1/hu
207            zhv(ji,jj) = 1._wp / zhv(ji,jj)
208         END DO
209      END DO
210      !
211      zpsi_uw(:,:,:) = 0._wp
212      zpsi_vw(:,:,:) = 0._wp
213      !
214      DO jk = 2, ikmax                                ! start from 2 : surface value = 0
215         DO jj = 1, jpjm1
216            DO ji = 1, fs_jpim1   ! vector opt.
217               zcuw = 1._wp - ( fsdepw(ji+1,jj,jk) + fsdepw(ji,jj,jk) ) * zhu(ji,jj)
218               zcvw = 1._wp - ( fsdepw(ji,jj+1,jk) + fsdepw(ji,jj,jk) ) * zhv(ji,jj)
219               zcuw = zcuw * zcuw
220               zcvw = zcvw * zcvw
221               zmuw = MAX(  0._wp , ( 1._wp - zcuw ) * ( 1._wp + r5_21 * zcuw )  )
222               zmvw = MAX(  0._wp , ( 1._wp - zcvw ) * ( 1._wp + r5_21 * zcvw )  )
223               !
224               zpsi_uw(ji,jj,jk) = zpsim_u(ji,jj) * zmuw * umask(ji,jj,jk)
225               zpsi_vw(ji,jj,jk) = zpsim_v(ji,jj) * zmvw * vmask(ji,jj,jk)
226            END DO
227         END DO
228      END DO
229      !
230      !                                      !==  transport increased by the MLE induced transport ==!
231      DO jk = 1, ikmax
232         DO jj = 1, jpjm1                          ! CAUTION pu,pv must be defined at row/column i=1 / j=1
233            DO ji = 1, fs_jpim1   ! vector opt.
234               pu(ji,jj,jk) = pu(ji,jj,jk) + ( zpsi_uw(ji,jj,jk) - zpsi_uw(ji,jj,jk+1) )
235               pv(ji,jj,jk) = pv(ji,jj,jk) + ( zpsi_vw(ji,jj,jk) - zpsi_vw(ji,jj,jk+1) )
236            END DO
237         END DO
238         DO jj = 2, jpjm1
239            DO ji = fs_2, fs_jpim1   ! vector opt.
240               pw(ji,jj,jk) = pw(ji,jj,jk) - ( zpsi_uw(ji,jj,jk) - zpsi_uw(ji-1,jj,jk)   &
241                  &                          + zpsi_vw(ji,jj,jk) - zpsi_vw(ji,jj-1,jk) )
242            END DO
243         END DO
244      END DO
245
246      IF( cdtype == 'TRA') THEN              !==  outputs  ==!
247         !
248         zLf_NH(:,:) = SQRT( rb_c * zmld(:,:) ) * r1_ft(:,:)      ! Lf = N H / f
249         CALL iom_put( "Lf_NHpf" , zLf_NH  )    ! Lf = N H / f
250         !
251         ! divide by cross distance to give streamfunction with dimensions m^2/s
252         DO jk = 1, ikmax+1
253            zpsi_uw(:,:,jk) = zpsi_uw(:,:,jk) * r1_e2u(:,:)
254            zpsi_vw(:,:,jk) = zpsi_vw(:,:,jk) * r1_e1v(:,:)
255         END DO
256         CALL iom_put( "psiu_mle", zpsi_uw )    ! i-mle streamfunction
257         CALL iom_put( "psiv_mle", zpsi_vw )    ! j-mle streamfunction
258      ENDIF
259      CALL wrk_dealloc( jpi, jpj, zpsim_u, zpsim_v, zmld, zbm, zhu, zhv, zn2, zLf_NH, zLf_MH)
260      CALL wrk_dealloc( jpi, jpj, jpk, zpsi_uw, zpsi_vw)
261      CALL wrk_dealloc( jpi, jpj, inml_mle)
262
263      IF( nn_timing == 1 )  CALL timing_stop('tra_adv_mle')
264      !
265   END SUBROUTINE tra_adv_mle
266
267
268   SUBROUTINE tra_adv_mle_init
269      !!---------------------------------------------------------------------
270      !!                  ***  ROUTINE tra_adv_mle_init  ***
271      !!
272      !! ** Purpose :   Control the consistency between namelist options for
273      !!              tracer advection schemes and set nadv
274      !!----------------------------------------------------------------------
275      INTEGER  ::   ji, jj, jk   ! dummy loop indices
276      INTEGER  ::   ierr
277      INTEGER ::    ios                 ! Local integer output status for namelist read
278      REAL(wp) ::   z1_t2, zfu, zfv                                !    -         -
279      !
280      NAMELIST/namtra_adv_mle/ ln_mle , nn_mle, rn_ce, rn_lf, rn_time, rn_lat, nn_mld_uv, nn_conv, rn_rho_c_mle
281      !!----------------------------------------------------------------------
282
283      REWIND( numnam_ref )              ! Namelist namtra_adv_mle in reference namelist : Tracer advection scheme
284      READ  ( numnam_ref, namtra_adv_mle, IOSTAT = ios, ERR = 901)
285901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namtra_adv_mle in reference namelist', lwp )
286
287      REWIND( numnam_cfg )              ! Namelist namtra_adv_mle in configuration namelist : Tracer advection scheme
288      READ  ( numnam_cfg, namtra_adv_mle, IOSTAT = ios, ERR = 902 )
289902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namtra_adv_mle in configuration namelist', lwp )
290      IF(lwm) WRITE ( numond, namtra_adv_mle )
291
292      IF(lwp) THEN                     ! Namelist print
293         WRITE(numout,*)
294         WRITE(numout,*) 'tra_adv_mle_init : mixed layer eddy (MLE) advection acting on tracers'
295         WRITE(numout,*) '~~~~~~~~~~~~~~~~'
296         WRITE(numout,*) '   Namelist namtra_adv_mle : mixed layer eddy advection on tracers'
297         WRITE(numout,*) '      use mixed layer eddy (MLE, i.e. Fox-Kemper param) (T/F)      ln_mle    = ', ln_mle
298         WRITE(numout,*) '      MLE type: =0 standard Fox-Kemper ; =1 new formulation        nn_mle    = ', nn_mle
299         WRITE(numout,*) '      magnitude of the MLE (typical value: 0.06 to 0.08)           rn_ce     = ', rn_ce
300         WRITE(numout,*) '      scale of ML front (ML radius of deformation) (rn_mle=0)      rn_lf     = ', rn_lf, 'm'
301         WRITE(numout,*) '      maximum time scale of MLE                    (rn_mle=0)      rn_time   = ', rn_time, 's'
302         WRITE(numout,*) '      reference latitude (degrees) of MLE coef.    (rn_mle=1)      rn_lat    = ', rn_lat, 'deg'
303         WRITE(numout,*) '      space interp. of MLD at u-(v-)pts (0=min,1=averaged,2=max)   nn_mld_uv = ', nn_mld_uv
304         WRITE(numout,*) '      =1 no MLE in case of convection ; =0 always MLE              nn_conv   = ', nn_conv
305         WRITE(numout,*) '      Density difference used to define ML for FK              rn_rho_c_mle  = ', rn_rho_c_mle
306      ENDIF
307      !
308      IF(lwp) THEN
309         WRITE(numout,*)
310         IF( ln_mle ) THEN
311            WRITE(numout,*) '   Mixed Layer Eddy induced transport added to tracer advection'
312            IF( nn_mle == 0 )   WRITE(numout,*) '   Fox-Kemper et al 2010 formulation'
313            IF( nn_mle == 1 )   WRITE(numout,*) '   New formulation'
314         ELSE
315            WRITE(numout,*) '   Mixed Layer Eddy parametrisation NOT used'
316         ENDIF
317      ENDIF
318      !
319      IF( ln_mle ) THEN                ! MLE initialisation
320         !
321         rb_c = grav * rn_rho_c_mle /rau0        ! Mixed Layer buoyancy criteria
322         IF(lwp) WRITE(numout,*)
323         IF(lwp) WRITE(numout,*) '      ML buoyancy criteria = ', rb_c, ' m/s2 '
324         IF(lwp) WRITE(numout,*) '      associated ML density criteria defined in zdfmxl = ', rho_c, 'kg/m3'
325         !
326         IF( nn_mle == 0 ) THEN           ! MLE array allocation & initialisation
327            ALLOCATE( rfu(jpi,jpj) , rfv(jpi,jpj) , STAT= ierr )
328            IF( ierr /= 0 )   CALL ctl_stop( 'tra_adv_mle_init: failed to allocate arrays' )
329            z1_t2 = 1._wp / ( rn_time * rn_time )
330            DO jj = 2, jpj                           ! "coriolis+ time^-1" at u- & v-points
331               DO ji = fs_2, jpi   ! vector opt.
332                  zfu = ( ff(ji,jj) + ff(ji,jj-1) ) * 0.5_wp
333                  zfv = ( ff(ji,jj) + ff(ji-1,jj) ) * 0.5_wp
334                  rfu(ji,jj) = SQRT(  zfu * zfu + z1_t2 )
335                  rfv(ji,jj) = SQRT(  zfv * zfv + z1_t2 )
336               END DO
337            END DO
338            CALL lbc_lnk( rfu, 'U', 1. )   ;   CALL lbc_lnk( rfv, 'V', 1. )
339            !
340         ELSEIF( nn_mle == 1 ) THEN           ! MLE array allocation & initialisation
341            rc_f = rn_ce / (  5.e3_wp * 2._wp * omega * SIN( rad * rn_lat )  )
342            !
343         ENDIF
344         !
345         !                                ! 1/(f^2+tau^2)^1/2 at t-point (needed in both nn_mle case)
346         ALLOCATE( r1_ft(jpi,jpj) , STAT= ierr )
347         IF( ierr /= 0 )   CALL ctl_stop( 'tra_adv_mle_init: failed to allocate r1_ft array' )
348         !
349         z1_t2 = 1._wp / ( rn_time * rn_time )
350         r1_ft(:,:) = 2._wp * omega * SIN( rad * gphit(:,:) )
351         r1_ft(:,:) = 1._wp / SQRT(  r1_ft(:,:) * r1_ft(:,:) + z1_t2 )
352         !
353      ENDIF
354      !
355   END SUBROUTINE tra_adv_mle_init
356
357   !!==============================================================================
358END MODULE traadv_mle
Note: See TracBrowser for help on using the repository browser.