source: branches/ORCHIDEE_2_2/ORCHIDEE/makeorchidee_fcm @ 8377

Last change on this file since 8377 was 8377, checked in by jan.polcher, 6 months ago

The modifications performed on the trunk for the coupling to WRF and the interpolation by XIOS on curviliean grids has been backported.

File size: 19.0 KB
Line 
1#!/bin/bash
2
3#==============================================================================================================================\n
4#  MODULE       : makeorchidee_fcm
5#
6#  CONTACT      : orchidee-help _at_ listes.ipsl.fr
7#
8#  LICENCE      : IPSL (2006)
9#  This software is governed by the CeCILL licence see ORCHIDEE/ORCHIDEE_CeCILL.LIC
10#
11# SVN     :
12# $HeadURL: svn://forge.ipsl.jussieu.fr/orchidee/trunk/ORCHIDEE/makeorchidee_fcm $
13# $Date: $
14# $Revision: $
15# \n
16####################################################################################################
17#
18# This script has several possible functions :
19#   1. Compiling ORCHIDEE
20#   2. Building of the documentation
21#
22#***************************************************************************************************
23#
24# Command lines :
25#
26#   1) makeorchidee_fcm   [ -parallel  PARALLEL_TYPE ]
27#                         [ -driver ]
28#                         [ -arch XXX ]
29#                         [ -prod | -dev | -debug ]
30#
31#   2) makeorchidee_fcm   [ -clean ]
32#
33#   3) makeorchidee_fcm   [ -doc | -doc_para ] ## actually doc_para is commented
34#                         [ -rmdoc ]
35#                         [ -doc_tree ]
36#
37
38########################################################################
39#
40# 1) Set default values. Some of them can be specified using environnement variables.
41#
42
43is_driver_opt=FALSE
44is_oasisdriver_opt=FALSE
45is_other_opt=FALSE
46clean=FALSE
47compile_flags="%PROD_FFLAGS"
48xios=FALSE
49full=""
50ext_src=""
51export P_P=""
52export SECTIONS_PARA=""
53ORCHDIR=`/bin/pwd`
54fcm_path=$ORCHDIR/tools/FCM_V1.2/bin
55compile_doc=FALSE
56
57arch_default_path="arch"
58arch_path="arch"
59
60# Path to store files produced during compilation
61# Note: config_path was previously named .config
62rel_config_path=build
63config_path=$ORCHDIR/${rel_config_path}
64
65# Following variables can be set as environement variables if wanted
66if [ -n "$FCM_ARCH" ]; then
67    arch="$FCM_ARCH"
68else
69    arch=NONE
70fi
71if [ -n "$FCM_PARA" ]; then
72    parallel_mode="$FCM_PARA"
73else
74    parallel_mode=seq
75fi
76if [ -n "$FCM_JOBS" ]; then
77    job="$FCM_JOBS"
78else
79    job=1
80fi
81
82
83#########################################################################
84# 2. Read arguments
85#
86while (($# > 0)) ; do
87
88  case $1 in
89    "-h")
90        print_help=TRUE ; shift ;;
91
92    "-parallel")
93        parallel_mode=$2 ; shift ; shift ;;
94
95    "-p")
96        parallel_mode=$2 ; shift ; shift ;;
97                       
98    "-driver")
99        is_driver_opt=TRUE ; shift ;;
100
101    "-oasisdriver")
102        is_oasisdriver_opt=TRUE ; shift ;;
103
104    "-otherexec")
105        is_other_opt=TRUE
106        is_driver_opt=TRUE ; shift ;;
107
108    "-arch")
109        arch="$2" ; shift ; shift ;;
110
111    "-arch_path")
112        arch_path=$2 ; shift ; shift ;;
113
114    "-xios")
115        xios=TRUE
116        shift ;;
117
118    "-xios2")
119        xios=TRUE
120        shift ;;
121
122    "-noxios")
123        xios=FALSE
124        shift ;;
125
126    "-prod")
127        compile_flags="%PROD_FFLAGS" ; shift ;;
128
129    "-dev")
130        compile_flags="%DEV_FFLAGS" ; shift ;;
131
132    "-debug")
133        compile_flags="%DEBUG_FFLAGS" ; shift ;;
134
135     "-j")
136        job="$2" ; shift ; shift ;;
137     
138     "-full")
139        full='-full' ; shift ;;
140
141     "-clean")
142        clean=TRUE ; shift ;;
143
144     "-ext_src")
145        ext_src=$2 ; shift ; shift ;;
146
147#    "-doc_para")
148#        setenv P_P -DCPP_PARA
149#       setenv SECTIONS_PARA "-e s&ENABLED_SECTIONS\ *= &ENABLED_SECTIONS       = CPP_PARA&g"
150#       goto doc
151
152     "-doc")
153          compile_doc=TRUE ; shift ;;
154
155     "-rmdoc")
156          \rm -rf docs
157          shift ;;
158
159     "-doc_tree") 
160          cd ..
161        find ORCHIDEE \( -not -path '*.svn*' \
162                        -a \( -name '*.f90' -o -name "*.F90" -o -name "*.h" \) \) \
163                    -exec bash -c 'mkdir -p ORCHIDEE/DOC/$( dirname {} )/$( echo $( basename {} ) | sed -e "s/\..*//" )' \;
164        cd ORCHIDEE
165        shift ;;
166
167    *)
168        echo "unknown option "$1" , exiting..."
169        exit
170   esac
171done
172
173#########################################################################
174# 3. Print help documentation and exit
175#
176if [[ "$print_help" == "TRUE" ]] ; then
177  cat <<fin
178
179########################################################################
180# Usage of the script makeorchidee_fcm
181#
182# makeorchidee_fcm compiles ORCHIDEE using the Fcm software developed
183# by the Hadley Centre. Fcm is stored in tools directory.
184# Platform specific compile options are found in the arch directory.
185########################################################################
186
187./makeorchidee_fcm [Options]
188
189Main options
190[ -h ]        : show this help
191
192[ -arch XXX ] : name of the architecture file containing platform dependent compile options.
193                The files arch/arch-XXX.fcm and arch/arch-XXX.path must exist. If the
194                file arch/arch-XXX.env exist, it'll be sourced before compilation starts.
195
196[ -arch_path XXX ] : directory of the archicture file containg platform dependent compile options.
197                     Default is ./arch directory. If the files are not found in the folder given by arch_path,
198                     the default ./arch folder will be used.
199
200[ -parallel|-p PARALLEL_TYPE ] : choose parallelization mode for ORCHIDEE :
201    PARALLEL_TYPE =
202    ( mpi | MPI )              : only MPI (Message Passing Interface)
203    ( omp | OMP )              : only OpenMP
204    ( mpi_omp | MPI_OMP )      : hybrid MPI/OpenMP mode
205    ( none | NONE | seq )      : sequential mode (default)
206
207[ -driver ]      : compilation of ORCHIDEE offline standard driver
208[ -otherexec ]   : compilation of other programs: forcesoil, testrouting.
209                   Warning! All these programs are not fully validated or maintained.
210
211Options related to cleaning
212| -clean ]       : delete all files produced during previous compilation
213| -full ]        : activate full recompiling
214
215Options for XIOS, only choose one of the following
216[ -xios | -xios2 ] : linking with XIOS 2.0 (it is not longer possible to use XIOS1)
217[ -noxios ]        : compilation without XIOS (default)
218
219Options for optimization, choose only one of the following
220[ -prod ]        : compilation for production (all optimization)
221[ -dev ]         : compilation for development (low optimization and -g)
222[ -debug ]       : compilation for debugging (no optimization and all debug options)
223
224Option to optimize the compilation time
225[ -j x ]         : activate parallel compiling on x task, default 1 task
226
227Option to add extra source to compile
228[ -ext_src path] : path to an additional directory with fortran routines to compile with the model
229
230Options for compiling the Doxygen documentation
231[ -doc ]         : generate documentation with Doxygen (exit after doc computation)
232[ -doc_para ]    : generate documentation with Doxygen with parallelization calls
233[ -rmdoc ]       : remove documentation directory (before generate new documentation with Doxygen ?)
234[ -doc_tree ]    : generate tree of ORCHIDEE directories for each file
235
236
237Example 1 : compile at curie(TGCC) for MPI parallel run mode
238   ./makeorchidee_fcm -parallel mpi -arch X64_CURIE -driver
239
240Example 2 : compile at ada(IDRIS) for MPI-OpenMP parallel run mode
241   ./makeorchidee_fcm -parallel mpi_omp -arch X64_ADA -driver
242
243Example 3 : compile at obelix(LSCE)
244   ./makeorchidee_fcm -arch ifort_LSCE -driver
245
246Example 4 : compile using gfortran compiler for sequential run mode
247First make sure that the files arch/gfortran.fcm and arch/gfortran.path are suitable for
248your environement especially the path to netcdf library.
249   ./makeorchidee_fcm -parallel seq -arch gfortran -driver
250
251Example 5 : clean files created during previous compilation
252   ./makeorchidee_fcm -clean
253
254fin
255
256  exit
257fi
258#
259#
260#####################################################################################################
261# 4. Building the documentation:
262# ------------------------------
263# We assume to start in the ORCHIDEE directory
264#
265#****  Directory structure:
266#
267# ..                       : parent of the start dir.
268#   -- ORCHIDEE            : ($MODELPATH), start directory
269#       - src_sechiba
270#       - src_stomate
271#       + DOC
272#       + webdoc
273#   -- IOIPSL
274#       - src
275#   ++ modeles_doc         : ($SRCPATH), source files for the documentation, emptied at start, temporary
276#
277#****  gawk scripts called :
278#
279# codeinc.awk              : encaspulates code parts in Doxygen documentation
280# codedox.awk              : transforms almost all comments in Doxygen comments for documentation
281# codealgo.awk             : emphasizes main algorithm description of each routine in their Doxygen documentation
282#
283#****
284if [[ "$comple_doc" == "TRUE" ]] ; then
285
286    unalias cd
287
288    export REV=`svn info | grep vision | sed -e 's&.*vision.*: \([0-9]*\)&\1&' | head -n 1`
289    export TAG=`svn info | grep URL | sed -e 's&.*URL.*: svn://forge.ipsl.jussieu.fr/orchidee/\(.*\)&\1&' | head -n 1 | xargs dirname`
290    cd ..
291   
292    \rm -rf modeles_doc
293    export MODELPATH=${PWD}
294    \mkdir modeles_doc
295    export SRCPATH=${MODELPATH}/modeles_doc
296   
297    find IOIPSL/src \( -not -path '*.svn*' \
298        -a \( -name '*.f90' -o -name "*.F90" -o -name "*.h" \) \) \
299        -exec bash -c 'mkdir -p '${SRCPATH}'/$( dirname {} ); cp -p {} '${SRCPATH}'/$( dirname {} )' \;
300           
301    find ORCHIDEE \( -not -path '*.svn*' \
302        -a \( -name '*.f90' -o -name "*.F90" -o -name "*.h" \) \) \
303        -exec bash -c 'mkdir -p '${SRCPATH}'/$( dirname {} ); cp -p {} '${SRCPATH}'/$( dirname {} )' \;
304    cd ${SRCPATH}
305    # Use standard preprocessor to suppress all preproc directives
306    \find . -name "*.f90" -exec cpp -P -C -traditional -x assembler-with-cpp ${P_P} '{}' '{}'_ \;
307    \find . -name "*.f90" -print -exec mv -f '{}'_ '{}' \;
308
309    # use codeinc script to encaspulate code parts in Doxygen documentation
310    \find . -name "*.f90" -exec gawk -f ${MODELPATH}/ORCHIDEE/DOC/TOOLS/codeinc.awk '{}' \; > /dev/null
311    \find . -name "*.f90" -print -exec mv -f '{}'_preproc_codeinc '{}' \;
312    # use codedox script to transform almost all comments in Doxygen comments for documentation (use with care !)
313    \find . -name "*.f90" -exec gawk -f ${MODELPATH}/ORCHIDEE/DOC/TOOLS/codedox.awk '{}' \; > /dev/null
314    \find . -name "*.f90" -print -exec mv -f '{}'_preproc_codedox '{}' \;
315   
316    # use codealgo script to emphasize main algorithm description of each routine in their Doxygen documentation
317    \find . -name "*.f90" -exec gawk -f ${MODELPATH}/ORCHIDEE/DOC/TOOLS/codealgo.awk '{}' \; > /dev/null
318    \find . -name "*.f90" -print -exec mv -f '{}'_preproc_codealgo '{}' \;
319    cd ../ORCHIDEE
320    \rm -f ${MODELPATH}/ORCHIDEE/Doxyfile_ORCHIDEE
321    sed -e 's&MYPATH&'${MODELPATH}'&g' -e 's&SRCPATH&'${SRCPATH}'&g' \
322        -e 's&MYTAG&'${TAG}'&' -e 's&MYREV&'${REV}'&' ${SECTIONS_PARA} \
323        ${MODELPATH}/ORCHIDEE/Doxyfile_ORCHIDEE.init > ${MODELPATH}/ORCHIDEE/Doxyfile_ORCHIDEE
324    \rm -f ${MODELPATH}/ORCHIDEE/DOC/header.tex
325    sed -e "s&MYTAG&${TAG}&" -e "s&MYREV&${REV}&" \
326        ${MODELPATH}/ORCHIDEE/DOC/header.tex.init > ${MODELPATH}/ORCHIDEE/DOC/header.tex
327    ln -s /home/orchidee01/maignan/ORCHIDEE/DOC/IMAGES ${MODELPATH}/ORCHIDEE/DOC/IMAGES
328    gmake doc
329    gmake bib
330    gmake toc
331    \rm -rf ${MODELPATH}/ORCHIDEE/webdoc
332    \mv ${MODELPATH}/ORCHIDEE/docs/html ${MODELPATH}/ORCHIDEE/webdoc
333    gmake index
334    gmake toc
335    \rm -rf ${SRCPATH}
336    cp ${MODELPATH}/ORCHIDEE/docs/latex/refman.pdf ${MODELPATH}/ORCHIDEE/documentation.pdf
337    exit
338fi
339
340#####################################################################################################
341# 5. Clean directory from files produced during previous compilation
342# --------------------------------------
343if [[ "$clean" == "TRUE" ]] ; then
344    # Remove the whole directory created during previous compilation
345    rm -fr ${config_path}
346
347    # Clean ORCHIDEE modules in modipsl/lib folder
348    rm -f ../../lib/intersurf.mod
349    rm -f ../../lib/sechiba.mod
350    rm -f ../../lib/chemistry.mod
351    rm -f ../../lib/liborglob.a
352    rm -f ../../lib/libparallel.a
353    rm -f ../../lib/libsechiba.a
354    rm -f ../../lib/libstomate.a
355    rm -f ../../lib/libparameters.a
356    rm -f ../../lib/liborchidee_ol.a
357    rm -f ../../lib/liborchidee.a
358
359    echo Clean files created during previous compilation of ORCHIDEE done
360
361    exit
362fi
363
364#########################################################################
365# 6. Prepare compilation
366#
367# Add fcm in environement path
368export PATH=${fcm_path}:${PATH}
369
370# Define architecture files
371if [[ "$arch" != "NONE" ]] ; then
372  # First search for file in arch_path folder, if they are not there, search in arch_default_path
373  if [[ -e $arch_path/arch-${arch}.path ]] ; then
374    rm -f arch.path
375    ln -s $arch_path/arch-${arch}.path arch.path
376  elif [[ -e $arch_default_path/arch-${arch}.path ]] ; then
377    rm -f arch.path
378    ln -s $arch_default_path/arch-${arch}.path arch.path
379  fi
380       
381  if [[ -e $arch_path/arch-${arch}.fcm ]] ; then
382    rm -f arch.fcm
383    ln -s $arch_path/arch-${arch}.fcm arch.fcm
384  elif [[ -e $arch_default_path/arch-${arch}.fcm ]] ; then
385    rm -f arch.fcm
386    ln -s $arch_default_path/arch-${arch}.fcm arch.fcm
387  fi
388
389  if [[ -e $arch_path/arch-${arch}.env ]] ; then
390    rm -f arch.env
391    ln -s $arch_path/arch-${arch}.env arch.env
392  elif [[ -e $arch_default_path/arch-${arch}.env ]] ; then
393    rm -f arch.env
394    ln -s $arch_default_path/arch-${arch}.env arch.env
395  else
396    ln -s .void_file arch.env
397  fi
398  source arch.env
399  source arch.path
400else
401  echo "Warning : architecture not specified, taking default file <<arch.fcm>> and <<arch.path>>" 
402  if [[ ! -e arch.fcm ]] ; then
403    echo "architecture file : << arch.fcm >> is missing, exit now...."
404    exit
405  fi
406
407  if [[ -e arch.path ]] ; then
408    source arch.path
409  else
410    echo "architecture file : << arch.path >> is missing, exit now...."
411    exit
412  fi
413
414  if [[ -e arch.env ]] ; then
415    source arch.env
416  fi
417fi
418
419# set compiler flags
420FFLAGS="%BASE_FFLAGS"
421LD_FFLAGS="%BASE_LD"
422CPP_KEY="%FPP_DEF"
423
424# set compiler flags for optimisation
425FFLAGS=${FFLAGS}" "$compile_flags
426LD_FFLAGS=${LD_FFLAGS}" "$compile_flags
427
428# set compiler flags for parallelism
429echo "parallel_mode = "${parallel_mode}
430
431if [[ "$parallel_mode" == "mpi" ]] || [[ "$parallel_mode" == "MPI" ]] ; then
432    FFLAGS="${FFLAGS} %MPI_FFLAGS"
433    LD_FFLAGS="%MPI_LD ${LD_FFLAGS}"
434    CPP_KEY="CPP_PARA ${CPP_KEY}"
435elif [[ "$parallel_mode" == "omp" ]] || [[ "$parallel_mode" == "OMP" ]] ; then
436    FFLAGS="${FFLAGS} %OMP_FFLAGS"
437    LD_FFLAGS="%OMP_LD ${LD_FFLAGS}"
438    CPP_KEY="CPP_OMP CPP_PARA ${CPP_KEY}"
439elif [[ "$parallel_mode" == "mpi_omp" ]] || [[ "$parallel_mode" == "MPI_OMP" ]] ; then
440    FFLAGS="${FFLAGS} %MPI_FFLAGS %OMP_FFLAGS"
441    LD_FFLAGS="%MPI_LD %OMP_LD ${LD_FFLAGS}"
442    CPP_KEY="CPP_OMP CPP_PARA ${CPP_KEY}"
443elif [[ "$parallel_mode" == "none" ]] || [[ "$parallel_mode" == "NONE" ]] || [[ "$parallel_mode" == "seq" ]] ; then
444    echo "Compiling for sequential mode"
445else
446    echo "This option for parallel_mode is not implemeted. Choose between mpi, omp, mpi_omp and none."
447    exit
448fi
449
450#
451# Create some temporary variable to which we add as needed
452#
453INCDIR="$NETCDF_INCDIR $IOIPSL_INCDIR"
454LIBDIR="$NETCDF_LIBDIR $NETCDF_LIB $IOIPSL_LIBDIR $IOIPSL_LIB"
455
456# Do we need to link with XIOS
457#
458if [[ "$xios" == "TRUE" ]] ; then
459    CPP_KEY="XIOS ${CPP_KEY}"
460    INCDIR="${INCDIR} $XIOS_INCDIR"
461    LIBDIR="${LIBDIR} $XIOS_LIBDIR $XIOS_LIB"
462fi
463
464# Check that OASIS has been installed for option to compile the oasis driver in ORCHIDEE
465if [[ "${is_oasisdriver_opt}" == "TRUE" ]] ; then
466    if [ "X"${OASIS_LIBDIR} != "X" ] ; then
467        # Check also if the provided path also exist. If not, delete the option.
468        testdir=$(echo ${OASIS_LIBDIR} | sed -e"s/\-L//")
469        if [ ! -d ${testdir} ]; then
470            echo "OASIS is not existing on the path : $OASIS_LIBDIR"
471            echo "OASIS needs to be installed before compiling the orchideeoasisdriver. Exit now"
472            exit
473        fi
474    else
475        echo "OASIS must be compiled before compiling the oasis driver in ORCHIDEE"
476        echo "OASIS_LIBDIR and OASIS_INCDIR must be set in the arch.path file."
477        echo "Exit now."
478        exit
479    fi
480fi
481
482
483# set target
484TARGET="liborchidee.a"
485if [[ "$is_driver_opt" == "TRUE" ]] ; then
486    TARGET="${TARGET} liborchidee_ol.a dim2_driver.exe orchideedriver.exe"
487fi
488if [[ "$is_other_opt" == "TRUE" ]] ; then
489    TARGET="${TARGET} forcesoil.exe testrouting.exe"
490fi
491
492echo "XXXXXX $is_oasisdriver_opt"
493
494if [[ "$is_oasisdriver_opt" == "TRUE" ]] ; then
495    CPP_KEY="OASIS ${CPP_KEY}"
496    TARGET="${TARGET} driver2oasis.exe orchideeoasis.exe"
497    INCDIR="${INCDIR} ${OASIS_INCDIR}/psmile.MPI1 ${OASIS_INCDIR}/scrip  ${OASIS_INCDIR}/mct"
498    LIBDIR="${LIBDIR} ${OASIS_LIBDIR} -lpsmile.MPI1 -lmct -lmpeu -lscrip"
499    echo "OASIS : ${INCDIR}"
500fi
501
502# build config file
503config_fcm="config.fcm"
504rm -f $config_fcm
505touch $config_fcm
506
507echo "%CONFIG_PATH   $config_path"                      >> $config_fcm 
508echo "%ARCH          $arch"                             >> $config_fcm 
509echo "%FFLAGS        $FFLAGS"                           >> $config_fcm 
510echo "%CPP_KEY       $CPP_KEY"                          >> $config_fcm
511echo "%EXEC          $TARGET"                           >> $config_fcm
512echo "%LD_FFLAGS     $LD_FFLAGS"                        >> $config_fcm
513echo "%INCDIR        ${INCDIR}"                         >> $config_fcm
514echo "%LIBDIR        ${LIBDIR}"                         >> $config_fcm
515echo "%EXT_SRC       $ext_src"                          >> $config_fcm
516
517
518# Delete interface module from modipsl/lib directory
519rm -f ../../lib/intersurf.mod
520rm -f ../../lib/sechiba.mod
521
522# Check if compiling is locked
523if [ -f ${config_path}/fcm.bld.lock ] ; then
524    echo "WARNING : build lock file exists"
525    echo "This means that either someone else is compiling this directory right now "
526    echo "or the previous compiling was interrupt abnormally."
527    echo ""
528    echo "Do you whant to remove this file and start compiling? [answer yes/no]" 
529    read answer
530    if [ $answer = "yes" ] || [ $answer = "y" ] ; then
531        rm -f ${config_path}/fcm.bld.lock
532    else
533        echo "Exit now!!!"
534        exit 1
535    fi
536fi
537
538#########################################################################
539# 7. Do the compiling
540fcm build -j $job $full
541err=$?
542
543# Check error message from fcm build
544if [ $err != 0 ] ; then 
545  # ERROR IN COMPILING
546  echo ERROR IN COMPILING ORCHIDEE : $err 
547  exit 1
548fi 
549
550# Create link to bin, lib and inc folders directly in ORCHIDEE folder
551# Use rel_config_path to create link with the relative path
552rm -f bin ; rm -f lib; rm -f inc
553ln -s ${rel_config_path}/bin bin
554ln -s ${rel_config_path}/lib lib
555ln -s ${rel_config_path}/inc inc
556 
557# Copy into modipsl/lib directory libraries and interface module needed by LMDZ
558cp ${config_path}/lib/lib*a          ../../lib/.
559cp ${config_path}/inc/intersurf.mod  ../../lib/.
560cp ${config_path}/inc/sechiba.mod    ../../lib/.
561
562# Move created executables to modipsl/bin directory
563if [ -f ${config_path}/bin/dim2_driver.exe ]    ; then cp -f ${config_path}/bin/dim2_driver.exe ../../bin/orchidee_ol ; fi
564if [ -f ${config_path}/bin/forcesoil.exe ]      ; then cp -f ${config_path}/bin/forcesoil.exe ../../bin/forcesoil ; fi
565if [ -f ${config_path}/bin/orchideedriver.exe ] ; then cp -f ${config_path}/bin/orchideedriver.exe ../../bin/orchideedriver ; fi
566if [ -f ${config_path}/bin/testrouting.exe ]    ; then cp -f ${config_path}/bin/testrouting.exe ../../bin/testrouting ; fi
567if [ -f ${config_path}/bin/driver2oasis.exe ]   ; then cp -f ${config_path}/bin/driver2oasis.exe ../../bin/driver2oasis ; fi
568if [ -f ${config_path}/bin/orchideeoasis.exe ]  ; then cp -f ${config_path}/bin/orchideeoasis.exe ../../bin/orchideeoasis ; fi
569
570
Note: See TracBrowser for help on using the repository browser.