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.
agrif_lim3_interp.F90 in branches/2017/dev_merge_2017/NEMOGCM/NEMO/NST_SRC – NEMO

source: branches/2017/dev_merge_2017/NEMOGCM/NEMO/NST_SRC/agrif_lim3_interp.F90 @ 9454

Last change on this file since 9454 was 9454, checked in by clem, 6 years ago

make sure that agrif is working with sea ice in any conditions

File size: 19.1 KB
Line 
1MODULE agrif_lim3_interp
2   !!=====================================================================================
3   !!                       ***  MODULE agrif_lim3_interp ***
4   !! Nesting module :  interp surface ice boundary condition from a parent grid
5   !! Sea-Ice model  :  LIM 3.6 Sea ice model time-stepping
6   !!=====================================================================================
7   !! History :  2.0   !  04-2008  (F. Dupont)  initial version
8   !!            3.4   !  09-2012  (R. Benshila, C. Herbaut) update and EVP
9   !!            3.6   !  05-2016  (C. Rousset)  Add LIM3 compatibility
10   !!----------------------------------------------------------------------
11#if defined key_agrif && defined key_lim3 
12   !!----------------------------------------------------------------------
13   !!   'key_lim3'  :                                 LIM 3.6 sea-ice model
14   !!   'key_agrif' :                                 AGRIF library
15   !!----------------------------------------------------------------------
16   !!  agrif_interp_lim3    : interpolation of ice at "after" sea-ice time step
17   !!  agrif_interp_u_ice   : atomic routine to interpolate u_ice
18   !!  agrif_interp_v_ice   : atomic routine to interpolate v_ice
19   !!  agrif_interp_tra_ice : atomic routine to interpolate ice properties
20   !!----------------------------------------------------------------------
21   USE par_oce
22   USE dom_oce
23   USE sbc_oce
24   USE ice
25   USE agrif_ice
26   USE phycst , ONLY: rt0
27   
28   IMPLICIT NONE
29   PRIVATE
30
31   PUBLIC   agrif_interp_lim3   ! called by agrif_user.F90
32
33   !!----------------------------------------------------------------------
34   !! NEMO/NST 3.6 , NEMO Consortium (2016)
35   !! $Id: agrif_lim3_interp.F90 6204 2016-01-04 13:47:06Z cetlod $
36   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
37   !!----------------------------------------------------------------------
38
39CONTAINS
40
41   SUBROUTINE agrif_interp_lim3( cd_type, kiter, kitermax )
42      !!-----------------------------------------------------------------------
43      !!                 *** ROUTINE agrif_rhg_lim3  ***
44      !!
45      !!  ** Method  : simple call to atomic routines using stored values to
46      !!  fill the boundaries depending of the position of the point and
47      !!  computing factor for time interpolation
48      !!-----------------------------------------------------------------------
49      CHARACTER(len=1), INTENT(in   )           ::   cd_type
50      INTEGER         , INTENT(in   ), OPTIONAL ::   kiter, kitermax
51      !!
52      REAL(wp) ::   zbeta   ! local scalar
53      !!-----------------------------------------------------------------------
54      !
55      IF( Agrif_Root() .OR. nn_ice==0 )  RETURN   ! do not interpolate if inside Parent domain or if child domain does not have ice
56      !
57      SELECT CASE( cd_type )
58      CASE('U','V')
59         IF( PRESENT( kiter ) ) THEN  ! interpolation at the child sub-time step (only for ice rheology)
60            zbeta = ( REAL(lim_nbstep) - REAL(kitermax - kiter) / REAL(kitermax) ) /  &
61               &    ( Agrif_Rhot() * REAL(Agrif_Parent(nn_fsbc)) / REAL(nn_fsbc) )
62         ELSE                         ! interpolation at the child time step
63            zbeta = REAL(lim_nbstep) / ( Agrif_Rhot() * REAL(Agrif_Parent(nn_fsbc)) / REAL(nn_fsbc) )
64         ENDIF
65      CASE('T')
66            zbeta = REAL(lim_nbstep) / ( Agrif_Rhot() * REAL(Agrif_Parent(nn_fsbc)) / REAL(nn_fsbc) )
67      END SELECT
68      !
69      Agrif_SpecialValue    = -9999.
70      Agrif_UseSpecialValue = .TRUE.
71      SELECT CASE( cd_type )
72      CASE('U')   ;   CALL Agrif_Bc_variable( u_ice_id  , procname=interp_u_ice  , calledweight=zbeta )
73      CASE('V')   ;   CALL Agrif_Bc_variable( v_ice_id  , procname=interp_v_ice  , calledweight=zbeta )
74      CASE('T')   ;   CALL Agrif_Bc_variable( tra_ice_id, procname=interp_tra_ice, calledweight=zbeta )
75      END SELECT
76      Agrif_SpecialValue    = 0._wp
77      Agrif_UseSpecialValue = .FALSE.
78      !
79   END SUBROUTINE agrif_interp_lim3
80
81
82   SUBROUTINE interp_u_ice( ptab, i1, i2, j1, j2, before )
83      !!-----------------------------------------------------------------------
84      !!                     *** ROUTINE interp_u_ice ***
85      !!
86      !! i1 i2 j1 j2 are the index of the boundaries parent(when before) and child (when after)
87      !! To solve issues when parent grid is "land" masked but not all the corresponding child
88      !! grid points, put Agrif_SpecialValue WHERE the parent grid is masked.
89      !! The child solution will be found in the 9(?) points around
90      !!-----------------------------------------------------------------------
91      INTEGER                         , INTENT(in   ) ::   i1, i2, j1, j2
92      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab
93      LOGICAL                         , INTENT(in   ) ::   before
94      !!
95      REAL(wp) ::   zrhoy   ! local scalar
96      !!-----------------------------------------------------------------------
97      !
98      IF( before ) THEN  ! parent grid
99         ptab(:,:) = e2u(i1:i2,j1:j2) * u_ice(i1:i2,j1:j2)
100         WHERE( umask(i1:i2,j1:j2,1) == 0. )   ptab(i1:i2,j1:j2) = Agrif_SpecialValue
101      ELSE               ! child grid
102         zrhoy = Agrif_Rhoy()
103         u_ice(i1:i2,j1:j2) = ptab(i1:i2,j1:j2) / ( e2u(i1:i2,j1:j2) * zrhoy ) * umask(i1:i2,j1:j2,1)
104      ENDIF
105      !
106   END SUBROUTINE interp_u_ice
107
108
109   SUBROUTINE interp_v_ice( ptab, i1, i2, j1, j2, before )
110      !!-----------------------------------------------------------------------
111      !!                    *** ROUTINE interp_v_ice ***
112      !!
113      !! i1 i2 j1 j2 are the index of the boundaries parent(when before) and child (when after)
114      !! To solve issues when parent grid is "land" masked but not all the corresponding child
115      !! grid points, put Agrif_SpecialValue WHERE the parent grid is masked.
116      !! The child solution will be found in the 9(?) points around
117      !!-----------------------------------------------------------------------     
118      INTEGER                         , INTENT(in   ) ::   i1, i2, j1, j2
119      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab
120      LOGICAL                         , INTENT(in   ) ::   before
121      !!
122      REAL(wp) ::   zrhox   ! local scalar
123      !!-----------------------------------------------------------------------
124      !
125      IF( before ) THEN  ! parent grid
126         ptab(:,:) = e1v(i1:i2,j1:j2) * v_ice(i1:i2,j1:j2)
127         WHERE( vmask(i1:i2,j1:j2,1) == 0. )   ptab(i1:i2,j1:j2) = Agrif_SpecialValue
128      ELSE               ! child grid
129         zrhox = Agrif_Rhox()
130         v_ice(i1:i2,j1:j2) = ptab(i1:i2,j1:j2) / ( e1v(i1:i2,j1:j2) * zrhox ) * vmask(i1:i2,j1:j2,1)
131      ENDIF
132      !
133   END SUBROUTINE interp_v_ice
134
135
136   SUBROUTINE interp_tra_ice( ptab, i1, i2, j1, j2, k1, k2, before, nb, ndir )
137      !!-----------------------------------------------------------------------
138      !!                    *** ROUTINE interp_tra_ice ***                           
139      !!
140      !! i1 i2 j1 j2 are the index of the boundaries parent(when before) and child (when after)
141      !! To solve issues when parent grid is "land" masked but not all the corresponding child
142      !! grid points, put Agrif_SpecialValue WHERE the parent grid is masked.
143      !! The child solution will be found in the 9(?) points around
144      !!-----------------------------------------------------------------------
145      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   ptab
146      INTEGER                               , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2
147      LOGICAL                               , INTENT(in   ) ::   before
148      INTEGER                               , INTENT(in   ) ::   nb, ndir
149      !!
150      INTEGER  ::   ji, jj, jk, jl, jm
151      INTEGER  ::   imin, imax, jmin, jmax
152      LOGICAL  ::   western_side, eastern_side, northern_side, southern_side
153      REAL(wp) ::   zrhox, z1, z2, z3, z4, z5, z6, z7
154      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztab
155      !!-----------------------------------------------------------------------
156      ! tracers are not multiplied by grid cell here => before: * e1e2t ; after: * r1_e1e2t / rhox / rhoy
157      ! and it is ok since we conserve tracers (same as in the ocean).
158      ALLOCATE( ztab(SIZE(a_i,1),SIZE(a_i,2),SIZE(ptab,3)) )
159     
160      IF( before ) THEN  ! parent grid
161         jm = 1
162         DO jl = 1, jpl
163            ptab(i1:i2,j1:j2,jm  ) = a_i (i1:i2,j1:j2,jl)
164            ptab(i1:i2,j1:j2,jm+1) = v_i (i1:i2,j1:j2,jl)
165            ptab(i1:i2,j1:j2,jm+2) = v_s (i1:i2,j1:j2,jl)
166            ptab(i1:i2,j1:j2,jm+3) = sv_i(i1:i2,j1:j2,jl)
167            ptab(i1:i2,j1:j2,jm+4) = oa_i(i1:i2,j1:j2,jl)
168            ptab(i1:i2,j1:j2,jm+5) = a_ip(i1:i2,j1:j2,jl)
169            ptab(i1:i2,j1:j2,jm+6) = v_ip(i1:i2,j1:j2,jl)
170            ptab(i1:i2,j1:j2,jm+7) = t_su(i1:i2,j1:j2,jl)
171            jm = jm + 8
172            DO jk = 1, nlay_s
173               ptab(i1:i2,j1:j2,jm) = e_s(i1:i2,j1:j2,jk,jl)   ;   jm = jm + 1
174            END DO
175            DO jk = 1, nlay_i
176               ptab(i1:i2,j1:j2,jm) = e_i(i1:i2,j1:j2,jk,jl)   ;   jm = jm + 1
177            END DO
178         END DO
179         
180         DO jk = k1, k2
181            WHERE( tmask(i1:i2,j1:j2,1) == 0._wp )   ptab(i1:i2,j1:j2,jk) = Agrif_SpecialValue
182         END DO
183         !
184      ELSE               ! child grid
185         !
186!         IF( nbghostcells > 1 ) THEN   ! ==> The easiest interpolation is used
187            !
188            jm = 1
189            DO jl = 1, jpl
190               !
191               DO jj = j1, j2
192                  DO ji = i1, i2
193                     a_i (ji,jj,jl) = ptab(ji,jj,jm  ) * tmask(ji,jj,1)
194                     v_i (ji,jj,jl) = ptab(ji,jj,jm+1) * tmask(ji,jj,1)
195                     v_s (ji,jj,jl) = ptab(ji,jj,jm+2) * tmask(ji,jj,1)
196                     sv_i(ji,jj,jl) = ptab(ji,jj,jm+3) * tmask(ji,jj,1)
197                     oa_i(ji,jj,jl) = ptab(ji,jj,jm+4) * tmask(ji,jj,1)
198                     a_ip(ji,jj,jl) = ptab(ji,jj,jm+5) * tmask(ji,jj,1)
199                     v_ip(ji,jj,jl) = ptab(ji,jj,jm+6) * tmask(ji,jj,1)
200                     t_su(ji,jj,jl) = ptab(ji,jj,jm+7) * tmask(ji,jj,1)
201                  END DO
202               END DO
203               jm = jm + 8
204               !
205               DO jk = 1, nlay_s
206                  e_s(i1:i2,j1:j2,jk,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1)
207                  jm = jm + 1
208               END DO
209               !
210               DO jk = 1, nlay_i
211                  e_i(i1:i2,j1:j2,jk,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1)
212                  jm = jm + 1
213               END DO
214               !
215            END DO
216            !
217!!==> clem: this interpolation does not work because it creates negative values, due
218!           to negative coefficients when mixing points (for ex. z7)
219!!
220!         ELSE                          ! ==> complex interpolation (only one ghost cell available)
221!            !! Use a more complex interpolation since we mix solutions over a couple of grid points
222!            !! it is advised to use it for fields modified by high order schemes (e.g. advection UM5...)
223!            !! clem: for some reason (I don't know why), the following lines do not work
224!            !        I think there is an issue with Agrif_SpecialValue here (not taken into account properly)
225!            ! record ztab
226!            jm = 1
227!            DO jl = 1, jpl
228!               ztab(:,:,jm  ) = a_i (:,:,jl)
229!               ztab(:,:,jm+1) = v_i (:,:,jl)
230!               ztab(:,:,jm+2) = v_s (:,:,jl)
231!               ztab(:,:,jm+3) = sv_i(:,:,jl)
232!               ztab(:,:,jm+4) = oa_i(:,:,jl)
233!               ztab(:,:,jm+5) = a_ip(:,:,jl)
234!               ztab(:,:,jm+6) = v_ip(:,:,jl)
235!               ztab(:,:,jm+7) = t_su(:,:,jl)
236!               jm = jm + 8
237!               DO jk = 1, nlay_s
238!                  ztab(:,:,jm) = e_s(:,:,jk,jl)
239!                  jm = jm + 1
240!               END DO
241!               DO jk = 1, nlay_i
242!                  ztab(:,:,jm) = e_i(:,:,jk,jl)
243!                  jm = jm + 1
244!               END DO
245!               !
246!            END DO
247!            !
248!            ! borders of the domain
249!            western_side  = (nb == 1).AND.(ndir == 1)  ;  eastern_side  = (nb == 1).AND.(ndir == 2)
250!            southern_side = (nb == 2).AND.(ndir == 1)  ;  northern_side = (nb == 2).AND.(ndir == 2)
251!            !
252!            ! spatial smoothing
253!            zrhox = Agrif_Rhox()
254!            z1 =      ( zrhox - 1. ) * 0.5
255!            z3 =      ( zrhox - 1. ) / ( zrhox + 1. )
256!            z6 = 2. * ( zrhox - 1. ) / ( zrhox + 1. )
257!            z7 =    - ( zrhox - 1. ) / ( zrhox + 3. )
258!            z2 = 1. - z1
259!            z4 = 1. - z3
260!            z5 = 1. - z6 - z7
261!            !
262!            ! Remove corners
263!            imin = i1  ;  imax = i2  ;  jmin = j1  ;  jmax = j2
264!            IF( (nbondj == -1) .OR. (nbondj == 2) )   jmin = 3
265!            IF( (nbondj == +1) .OR. (nbondj == 2) )   jmax = nlcj-2
266!            IF( (nbondi == -1) .OR. (nbondi == 2) )   imin = 3
267!            IF( (nbondi == +1) .OR. (nbondi == 2) )   imax = nlci-2
268!
269!            ! smoothed fields
270!            IF( eastern_side ) THEN
271!               ztab(nlci,j1:j2,:) = z1 * ptab(nlci,j1:j2,:) + z2 * ptab(nlci-1,j1:j2,:)
272!               DO jj = jmin, jmax
273!                  rswitch = 0.
274!                  IF( u_ice(nlci-2,jj) > 0._wp ) rswitch = 1.
275!                  ztab(nlci-1,jj,:) = ( 1. - umask(nlci-2,jj,1) ) * ztab(nlci,jj,:)  &
276!                     &                +      umask(nlci-2,jj,1)   *  &
277!                     &                ( ( 1. - rswitch ) * ( z4 * ztab(nlci,jj,:)   + z3 * ztab(nlci-2,jj,:) )  &
278!                     &                  +      rswitch   * ( z6 * ztab(nlci-2,jj,:) + z5 * ztab(nlci,jj,:) + z7 * ztab(nlci-3,jj,:) ) )
279!                  ztab(nlci-1,jj,:) = ztab(nlci-1,jj,:) * tmask(nlci-1,jj,1)
280!               END DO
281!            ENDIF
282!            !
283!            IF( northern_side ) THEN
284!               ztab(i1:i2,nlcj,:) = z1 * ptab(i1:i2,nlcj,:) + z2 * ptab(i1:i2,nlcj-1,:)
285!               DO ji = imin, imax
286!                  rswitch = 0.
287!                  IF( v_ice(ji,nlcj-2) > 0._wp ) rswitch = 1.
288!                  ztab(ji,nlcj-1,:) = ( 1. - vmask(ji,nlcj-2,1) ) * ztab(ji,nlcj,:)  &
289!                     &                +      vmask(ji,nlcj-2,1)   *  &
290!                     &                ( ( 1. - rswitch ) * ( z4 * ztab(ji,nlcj,:)   + z3 * ztab(ji,nlcj-2,:) ) &
291!                     &                  +      rswitch   * ( z6 * ztab(ji,nlcj-2,:) + z5 * ztab(ji,nlcj,:) + z7 * ztab(ji,nlcj-3,:) ) )
292!                  ztab(ji,nlcj-1,:) = ztab(ji,nlcj-1,:) * tmask(ji,nlcj-1,1)
293!               END DO
294!            END IF
295!            !
296!            IF( western_side) THEN
297!               ztab(1,j1:j2,:) = z1 * ptab(1,j1:j2,:) + z2 * ptab(2,j1:j2,:)
298!               DO jj = jmin, jmax
299!                  rswitch = 0.
300!                  IF( u_ice(2,jj) < 0._wp ) rswitch = 1.
301!                  ztab(2,jj,:) = ( 1. - umask(2,jj,1) ) * ztab(1,jj,:)  &
302!                     &           +      umask(2,jj,1)   *   &
303!                     &           ( ( 1. - rswitch ) * ( z4 * ztab(1,jj,:) + z3 * ztab(3,jj,:) ) &
304!                     &             +      rswitch   * ( z6 * ztab(3,jj,:) + z5 * ztab(1,jj,:) + z7 * ztab(4,jj,:) ) )
305!                  ztab(2,jj,:) = ztab(2,jj,:) * tmask(2,jj,1)
306!               END DO
307!            ENDIF
308!            !
309!            IF( southern_side ) THEN
310!               ztab(i1:i2,1,:) = z1 * ptab(i1:i2,1,:) + z2 * ptab(i1:i2,2,:)
311!               DO ji = imin, imax
312!                  rswitch = 0.
313!                  IF( v_ice(ji,2) < 0._wp ) rswitch = 1.
314!                  ztab(ji,2,:) = ( 1. - vmask(ji,2,1) ) * ztab(ji,1,:)  &
315!                     &           +      vmask(ji,2,1)   *  &
316!                     &           ( ( 1. - rswitch ) * ( z4 * ztab(ji,1,:) + z3 * ztab(ji,3,:) ) &
317!                     &             +      rswitch   * ( z6 * ztab(ji,3,:) + z5 * ztab(ji,1,:) + z7 * ztab(ji,4,:) ) )
318!                  ztab(ji,2,:) = ztab(ji,2,:) * tmask(ji,2,1)
319!               END DO
320!            END IF
321!            !
322!            ! Treatment of corners
323!            IF( (eastern_side) .AND. ((nbondj == -1).OR.(nbondj == 2)) )  ztab(nlci-1,2,:)      = ptab(nlci-1,2,:)      ! East south
324!            IF( (eastern_side) .AND. ((nbondj ==  1).OR.(nbondj == 2)) )  ztab(nlci-1,nlcj-1,:) = ptab(nlci-1,nlcj-1,:) ! East north
325!            IF( (western_side) .AND. ((nbondj == -1).OR.(nbondj == 2)) )  ztab(2,2,:)           = ptab(2,2,:)           ! West south
326!            IF( (western_side) .AND. ((nbondj ==  1).OR.(nbondj == 2)) )  ztab(2,nlcj-1,:)      = ptab(2,nlcj-1,:)      ! West north
327!           
328!            ! retrieve ice tracers
329!            jm = 1
330!            DO jl = 1, jpl
331!               !
332!               DO jj = j1, j2
333!                  DO ji = i1, i2
334!                     a_i (ji,jj,jl) = ztab(ji,jj,jm  ) * tmask(ji,jj,1)
335!                     v_i (ji,jj,jl) = ztab(ji,jj,jm+1) * tmask(ji,jj,1)
336!                     v_s (ji,jj,jl) = ztab(ji,jj,jm+2) * tmask(ji,jj,1)
337!                     sv_i(ji,jj,jl) = ztab(ji,jj,jm+3) * tmask(ji,jj,1)
338!                     oa_i(ji,jj,jl) = ztab(ji,jj,jm+4) * tmask(ji,jj,1)
339!                     a_ip(ji,jj,jl) = ztab(ji,jj,jm+5) * tmask(ji,jj,1)
340!                     v_ip(ji,jj,jl) = ztab(ji,jj,jm+6) * tmask(ji,jj,1)
341!                     t_su(ji,jj,jl) = ztab(ji,jj,jm+7) * tmask(ji,jj,1)
342!                  END DO
343!               END DO
344!               jm = jm + 8
345!               !
346!               DO jk = 1, nlay_s
347!                  e_s(i1:i2,j1:j2,jk,jl) = ztab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1)
348!                  jm = jm + 1
349!               END DO
350!               !
351!               DO jk = 1, nlay_i
352!                  e_i(i1:i2,j1:j2,jk,jl) = ztab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1)
353!                  jm = jm + 1
354!               END DO
355!               !
356!            END DO
357!         
358!         ENDIF  ! nbghostcells=1
359         
360         ! integrated values
361         vt_i (i1:i2,j1:j2) = SUM(      v_i(i1:i2,j1:j2,:),            dim=3 )
362         vt_s (i1:i2,j1:j2) = SUM(      v_s(i1:i2,j1:j2,:),            dim=3 )
363         at_i (i1:i2,j1:j2) = SUM(      a_i(i1:i2,j1:j2,:),            dim=3 )
364         et_s(i1:i2,j1:j2)  = SUM( SUM( e_s(i1:i2,j1:j2,:,:), dim=4 ), dim=3 )
365         et_i(i1:i2,j1:j2)  = SUM( SUM( e_i(i1:i2,j1:j2,:,:), dim=4 ), dim=3 )
366
367         at_ip(i1:i2,j1:j2) = SUM( a_ip(i1:i2,j1:j2,:), dim=3 ) ! melt ponds
368         vt_ip(i1:i2,j1:j2) = SUM( v_ip(i1:i2,j1:j2,:), dim=3 )
369         !
370         ato_i(i1:i2,j1:j2) = 1._wp - at_i(i1:i2,j1:j2)         ! open water fraction 
371
372         DO jl = 1, jpl
373            WHERE( tmask(i1:i2,j1:j2,1) == 0._wp )   t_su(i1:i2,j1:j2,jl) = rt0   ! to avoid a division by 0 in sbcblk.F90
374         END DO
375         !
376      ENDIF
377     
378      DEALLOCATE( ztab )
379      !
380   END SUBROUTINE interp_tra_ice
381
382#else
383   !!----------------------------------------------------------------------
384   !!   Empty module                                             no sea-ice
385   !!----------------------------------------------------------------------
386CONTAINS
387   SUBROUTINE agrif_lim3_interp_empty
388      WRITE(*,*)  'agrif_lim3_interp : You should not have seen this print! error?'
389   END SUBROUTINE agrif_lim3_interp_empty
390#endif
391
392   !!======================================================================
393END MODULE agrif_lim3_interp
Note: See TracBrowser for help on using the repository browser.