source: BOL/script_install_amaury/install_lmdz.sh @ 4896

Last change on this file since 4896 was 4896, checked in by abarral, 7 weeks ago

Fix XIOS compile
Fix mpif90 netcdf compile
Fix local netcdf compile
Fix missing rebuild

  • Property svn:executable set to *
File size: 29.8 KB
RevLine 
[4210]1#!/bin/bash
[4849]2set -eu  # error on command failure, and on unset variables
3export LC_ALL=# standardize awk format
[4210]4
5###########################################################################
[4849]6# Author : Laurent Fairhead et Frédéric Hourdin
[4210]7# Usage  : install_lmdz.sh -help
8#
9# bash installation script of the LMDZ model on different computer types :
10# Linux PC, "mesocentre" (IPSL-UPMC, IPSL-X), super-computer (IDRIS)
11#
12# The model is downloaded in the following directory tree
13# $MODEL/modipsl/modeles/...
14# using the "modipsl" infrastructure created by the "IPSL"
15# for coupled (atmosphere/ocean/vegetation/chemistry) climate modeling
16# activities.
17# Here we only download atmospheric (LMDZ) and vegetation (ORCHIDEE)
18# components.
19#
20# The sources of the models can be found in the "modeles" directory.
[4218]21# In the present case, LMDZ, ORCHIDEE, and IOIPSL or XIOS (handling of
22# input-outputs using the NetCDF library).
[4210]23#
24# The script downloads various source files (including a version of NetCDF)
25# and utilities, compiles the model, and runs a test simulation in a
26# minimal configuration.
27#
28# Prerequisites : pgf90/gfortran, bash or ksh, wget , gunzip, tar, ...
29#
30# Modif 18/11/2011
31#    changes for option real 8.
32#      We compile with -r8 (or equivalent) and -DNC_DOUBLE for the GCM
33#      but with -r4 for netcdf. Variable real must be set to
34#      r4 or r8 at the beginning of the script below.
35#
36###########################################################################
37
[4862]38### Functions
[4891]39# TODO add make_j parallel argument -> check what is used for libigcm
[4210]40
[4871]41function myget { # Get a file from LMDZ repository
42  local url=$1
[4210]43
[4871]44  local filename
45  filename=$(basename "$url")
46
47  wget --no-check-certificate -nv "http://lmdz.lmd.jussieu.fr/pub/$url"
48  if [[ $filename =~ .*\.(ba)?sh ]]; then chmod +x "$filename"; fi
[4210]49}
50
[4862]51function set_default_params {
52    # Valeur par défaut des parametres
53    svn=""
54    version="20231022.trunk"
[4210]55
[4891]56    netcdf=1
[4862]57    bench=1
58    pcmac=0 # default: not on a Mac
59    SCM=0
[4890]60    veget="none"
[4891]61    grid_resolution="32x32x39"
[4862]62    physiq=""
[4210]63
[4873]64    xios_branch="2.6"
65    xios_rev="2568"
66
[4891]67    parallel="none"
[4862]68    trusting="testing"
69    MODEL=""
[4210]70
[4891]71    with_xios=0
[4862]72    opt_makelmdz_xios=""
[4210]73
[4862]74    rad="rrtm"
[4210]75
[4862]76    compile_with_fcm=1
[4210]77
[4890]78    cosp="none"
[4862]79    opt_cosp=""
[4210]80
[4893]81    make_j=8
82
[4862]83    # Check if on a Mac
84    if [[ $(uname) = "Darwin" ]]; then
85        pcmac=1
86        export MAKE="make"
87    fi
[4210]88
[4873]89    optim_debug=""
[4862]90    arch="local"
[4210]91
[4862]92    local mpi_file
93    mpi_file=$(readlink -f "$(which mpif90)")
94    path_mpi=$(dirname "$mpi_file")
95    root_mpi=$(dirname "$path_mpi")
[4873]96
97    arch="local-gfortran"
98    arch_dir=""
[4862]99}
[4210]100
[4862]101function read_cmdline_args {
102    while (($# > 0)); do
103        case $1 in
104            "-h") cat <<........fin
105        $0 [ -v version ] [ -r svn_release ]
106               [ -parallel PARA ] [ -d GRID_RESOLUTION ] [ -bench 0/1 ]
107               [-name LOCAL_MODEL_NAME] [-gprof] [-opt_makelmdz] [-rad RADIATIF]
[4210]108
[4873]109        -v       "version" like 20150828.trunk, see http://www.lmd.jussieu.fr/~lmdz/Distrib/LISMOI.trunk (default <$version>)
[4210]110
[4873]111        -r       "svn_release" : either the svn release number or "last" (default <$svn>)
[4210]112
[4873]113        -parallel parallel support: mpi, omp, mpi_omp (mpi with openMP) or none (default: <$parallel>)
[4210]114
[4873]115        -d        "grid resolution": should be among the available benchs if -bench 1 (valid values: 48x36x19, 48x36x39) (default : <$grid_resolution>)
[4210]116
[4873]117        -bench     activating the bench or not (0/1) (default: <$bench>)
[4210]118
[4862]119        -testing/unstable
[4210]120
[4873]121        -name      name of the folder to install to (default <$MODEL>)
[4210]122
[4873]123        -netcdf    0, 1 or PATH. 0: do not download NetCDF, look for it in standard locations (/usr);  1: download and compile NetCDF; PATH: full path to an existing installed NetCDF library (default: <$netcdf>)
[4210]124
[4873]125        -xios      use (download and compile) the XIOS library (will compile the parallel NetCDF4-HDF5 library) (requires to also have -parallel mpi_omp)
[4210]126
[4873]127        -cosp       to run with cospv1 or cospv2 [none/v1/v2] (default <$cosp>)
[4210]128
[4873]129        -rad        radiative code: oldrad, rrtm or ecrad (default <$rad>)
[4210]130
[4873]131        -nofcm      to compile without fcm
[4210]132
[4862]133        -SCM        install 1D version automatically
[4210]134
[4862]135        -debug      compile everything in debug mode
[4210]136
[4873]137        -physiq     to choose which physics package to use (default <$physiq>)
[4210]138
[4873]139        -veget      surface/vegetation scheme treatment controlled by the single variable veget which can have the following values: none: bucket scheme (default); CMIP6: orchidee version used in CMIP exercise, rev 5661; number: orchidee version number (default $veget)
[4210]140
[4873]141        -arch       name of the arch to use (default <$arch>)
[4210]142
[4873]143        -arch_dir   where to find the arch files (default <$arch_dir>)
[4862]144
[4893]145        -make_j     number of processes to parallelize installations (default <$make_j>)
146
[4210]147........fin
[4862]148                  exit 1;;
149            "-v") version=$2; shift; shift;;
150            "-r") svn=$2; shift; shift;;
151            "-d") grid_resolution=$2; shift; shift;;
[4873]152            "-unstable"|"-testing") trusting=$(echo "$1" | cut -c2-); shift;;
[4862]153            "-cosp") cosp=$2
154                     case $cosp in
155                         "none"|"v1"|"v2") cosp=$2; shift; shift;;
156                         *) echo "Only none v1 v2 for cosp option"; exit 1
[4849]157                     esac;;
[4862]158            "-nofcm") compile_with_fcm=0; echo "This option will be reactivated soon (promesse du 8dec2022)"; exit 1;  shift;;
159            "-SCM") SCM=1; shift;;
160            "-rad") rad=$2
161                    case $rad in
162                        "oldrad"|"rrtm"|"ecrad") rad=$2; shift; shift;;
163                        *) echo "Only oldrad rrtm ecrad for rad option"; exit 1
164                    esac;;
165            "-parallel") parallel=$2
166                         case $parallel in
167                             "none"|"mpi"|"omp"|"mpi_omp") parallel=$2; shift; shift;;
168                             *) echo "Only none mpi omp mpi_omp for the parallel option"; exit 1
169                         esac;;
170            "-bench") bench=$2; shift; shift;;
[4873]171            "-debug") optim_debug=-debug; shift;;
[4862]172            "-name") MODEL=$2; shift; shift;;
173            "-netcdf") netcdf=$2; shift; shift;;
174            "-physiq") physiq=$2; shift; shift;;
[4891]175            "-xios") with_xios=1; shift;;
[4873]176            "-arch") arch=$2; shift; shift;;
177            "-arch_dir") arch_dir=$2; shift; shift;;
[4862]178            "-veget") veget=$2; shift; shift;;
[4893]179            "-make_j") make_j=$2; shift; shift;;
[4862]180            *)  bash install_lmdz.sh -h; exit 1
181        esac
182    done
183
184    # Option de compilation pour Cosp
185    case $cosp in
186        v1) opt_cosp="-cosp true";;
187        v2) opt_cosp="-cospv2 true";;
188        *) opt_cosp=""
[4215]189    esac
[4210]190
[4862]191    # Check on veget version
[4890]192    if [[ $veget != 'none' && $veget != "CMIP6" ]]; then
[4862]193        re='^[0-9]+$'
194        if ! [[ $veget =~ $re ]]; then
195            echo 'Valeur de l option veget non valable'; exit 1
196        fi
197    fi
[4218]198
[4862]199    #Define veget-related suffix for gcm name
[4890]200    if [[ $veget = 'none' ]]; then
[4862]201        suff_orc=''
202        #For use with tutorial, orchidee_rev is also defined (will be
203        #written in surface_env at the end of the script)
204        orchidee_rev=''
205    else
206        suff_orc='_orch'
207    fi
[4210]208
[4807]209
[4862]210    if [[ $parallel = "none" ]]; then
[4891]211        suff_exe='_seq'
[4862]212    else
[4891]213        suff_exe='_para_mem'
[4210]214    fi
215
[4862]216    #Chemin pour placer le modele
[4873]217    if [[ $MODEL = "" ]]; then MODEL="./LMDZ$version$svn$optim_debug"; fi
[4210]218
[4862]219    ## if also compiling XIOS, parallel must be mpi_omp
[4891]220    if [[ $with_xios = 1 && $parallel != "mpi_omp" ]]; then
[4862]221        echo "Error, you must set -parallel mpi_omp if you want XIOS"; exit 1
222    fi
[4210]223
[4891]224    if [[ $with_xios = 1 ]]; then
[4862]225        opt_makelmdz_xios="-io xios"
226    fi
[4210]227
[4891]228    if [[ $cosp = "v2" && $with_xios = 0 ]]; then
[4862]229        echo "Error, Cospv2 cannot run without Xios"; exit 1
[4215]230    fi
[4873]231
232    if [[ $arch_dir = "" ]]; then
233        arch_dir="$MODEL/modipsl/config/IPSLCM7/ARCH/"
234    fi
235    arch_dir=$(readlink -f "$arch_dir")  # full path
[4862]236}
[4210]237
[4862]238function check_available_software {
[4873]239    echo "################################################################"
240    echo "Check if required software is available"
241    echo "################################################################"
242    for logiciel in wget tar gzip make gcc cmake m4 c++; do
243        if [[ $(which "$logiciel") = "" ]]; then
244            echo "You must first install $logiciel on your system"; exit 1
245        fi
246    done
[4210]247
[4873]248    cat <<eod > tt.f90
249print*,'coucou'
250end
[4862]251eod
[4873]252    $compiler tt.f90 || a.out
253    ./a.out >| tt
254    if [[ $(< tt sed -e 's/ //g' ) != "coucou" ]]; then
255        echo "problem installing with compiler $compiler"; exit 1
[4218]256    fi
[4873]257    \rm tt a.out tt.f90
[4862]258}
[4210]259
[4862]260function download_model {
261    mkdir -p "$MODEL"
262    MODEL=$(readlink -f "$MODEL"); echo "$MODEL"  # absolute path
[4210]263
[4873]264    rm -rf "$MODEL/modipsl"
265
266    echo "##########################################################"
267    echo "Download a slightly modified version of  LMDZ"
268    echo "##########################################################"
269    cd "$MODEL"
270    getlog="$(pwd)/get.log"
271    echo "logfile : $getlog"
272    myget "src_archives/$trusting/modipsl.$version.tar.gz" >> get.log 2>&1
273    echo "install_lmdz.sh wget_OK $(date)"
274    gunzip "modipsl.$version.tar.gz" >> get.log 2>&1
275    tar xf "modipsl.$version.tar" >> get.log 2>&1
276    \rm "modipsl.$version.tar"
277
278    if [[ $svn != "" ]]; then
279        mysvn=$svn
280    else
281        mysvn="$(grep 'Revision: [0-9]' "$MODEL"/Read*.md | awk ' { print $2 } ' 2>/dev/null)"
[4218]282    fi
[4873]283    echo "SVN revision used: $mysvn"
284}
[4871]285
[4890]286function download_model_AMAURY {  # TODO
[4873]287    MODEL=$(readlink -f "$MODEL"); echo "$MODEL"  # absolute path
288
[4871]289    if [[ $svn != "" ]]; then
290        mysvn=$svn
291    else
292        mysvn="$(grep 'Revision: [0-9]' "$MODEL"/Read*.md | awk ' { print $2 } ' 2>/dev/null)"
293    fi
294    echo "SVN revision used: $mysvn"
[4862]295}
[4210]296
[4890]297function install_arch {
[4873]298    if [[ ! -d $arch_dir ]]; then
299        echo "Error: no arch dir $arch_dir"; exit 1
300    elif [[ ! -f $arch_dir/arch-$arch.path ]]; then
301        echo "Error: no arch-$arch.path in $arch_dir"; exit 1
302    fi
[4871]303
[4873]304    local fcm_path
305    if [[ -f $arch_dir/arch-$arch.fcm ]]; then
306        fcm_path="$arch_dir/arch-$arch.fcm"
307    else
308        fcm_path="$MODEL/modipsl/modeles/LMDZ/arch/arch-$arch.fcm"
309        if [[ ! -f $fcm_path ]]; then
310            echo "Error: no $fcm_path"; exit 1
311        fi
312    fi
313
314    # check compiler
315    compiler=$(< "$fcm_path" grep "%COMPILER" | sed -e "s/%COMPILER\s*//")
[4890]316
317    # Copy arch to different components
318    # TODO check that this doesn't error if the source and destination are the same
[4893]319    for dir in "IOIPSL" "ORCHIDEE" "LMDZ" "XIOS"; do
[4891]320        \cp -f "$arch_dir/arch-$arch.fcm" "$MODEL/modipsl/modeles/$dir/arch"
321        \cp -f "$arch_dir/arch-$arch.path" "$MODEL/modipsl/modeles/$dir/arch"
322    done
[4890]323
324    # TODO TEMP compat w/ old orch version - make a proper case later
325    sed -i'' -e "s/-I//" -e "s/-L//" "$MODEL/modipsl/modeles/ORCHIDEE/arch/arch-$arch.path"  # /!\ we only replace first occurence on purpose
[4893]326
327    # Adapt for XIOS, which uses different naming conventions
328    sed -i'' -e "s/%COMPILER/%FCOMPILER/" -e "s/%LINK/%LINKER/" -e "s/-fdefault-real-8//" "$MODEL/modipsl/modeles/XIOS/arch/arch-$arch.fcm"
[4871]329}
330
[4862]331function install_netcdf {
332    echo "Installing Netcdf"
[4210]333
[4862]334    if [[ $netcdf = 0 ]]; then
335        ncdfdir=$(nc-config --prefix)
336    else
337        cd "$MODEL"
[4210]338
[4896]339        # Convert non-basic compiler
340        local ncdf_compiler="$compiler"
341        case $compiler in  # TODO check if it works with other base compilers
342            mpif90) ncdf_compiler=$($compiler --help | head -n 1 | cut -f 2 -d " ")
[4862]343        esac
[4210]344
[4896]345        case $ncdf_compiler in
346            gfortran) opt1="-compiler gnu"; opt2="-CC gcc -FC gfortran -CXX g++";;
347            ifort)  opt1="-compiler intel"; opt2="-CC icc -FC ifort -CXX icpc";;
348            pgf90)  opt1="-compiler pgf90"; opt2="-CC pgcc -FC pgf90 -CXX pgCC";;
349            *)      echo "unexpected compiler $ncdf_compiler for netcdf"; exit 1
350        esac
351
[4862]352        case $with_xios in
[4891]353            0) script_install_netcdf="install_netcdf4_hdf5_seq.bash"
[4862]354               ncdfdir="netcdf4_hdf5_seq"
355               opt_="$opt1";;
[4891]356            1) script_install_netcdf="install_netcdf4_hdf5.bash"
[4862]357               ncdfdir="netcdf4_hdf5"
358               opt_="$opt2 -MPI $root_mpi";;
[4891]359            *) echo "with_xios=$with_xios, should be 0 or 1"; exit 1
[4862]360        esac
361        if [[ $netcdf = 1 ]]; then
362           ncdfdir="$MODEL/$ncdfdir"
363        else
364           mkdir -p "$netcdf"; ncdfdir="$netcdf/$ncdfdir"
365        fi
[4210]366
[4896]367
[4862]368        echo "Repertoire netcdf $ncdfdir"
369        if [[ ! -d $ncdfdir ]]; then
370            netcdflog=$(pwd)/netcdf.log
371            echo "----------------------------------------------------------"
372            echo "Compiling the Netcdf library"
373            echo "----------------------------------------------------------"
374            echo "log file : $netcdflog"
375            myget script_install/$script_install_netcdf >> "$netcdflog" 2>&1
376            chmod u=rwx $script_install_netcdf
377            # shellcheck disable=SC2086
378            ./$script_install_netcdf -prefix "$ncdfdir" $opt_ >> "$netcdflog" 2>&1
[4405]379        fi
[4210]380
[4896]381        # Add to path
382        export PATH="$ncdfdir/bin:$PATH"
383
[4862]384        #----------------------------------------------------------------------------
385        # LF rajout d'une verrue, pour une raison non encore expliquee,
386        # la librairie est parfois rangée dans lib64 et non dans lib
387        # par certains compilateurs
388        if [[ ! -e lib && -d lib64 ]]; then ln -s lib64 lib; fi
389        #----------------------------------------------------------------------------
[4210]390
[4862]391        echo "install_lmdz.sh netcdf_OK $(date)"
392    fi
[4210]393
[4862]394    cat >test_netcdf90.f90 <<EOF
395    use netcdf
396    print *, "NetCDF library version: ", nf90_inq_libvers()
397    end
398EOF
[4546]399
[4896]400    if $ncdf_compiler -I"$ncdfdir"/include test_netcdf90.f90 -L"$ncdfdir"/lib -lnetcdff \
[4862]401              -lnetcdf -Wl,-rpath="$ncdfdir"/lib && ./a.out
402    then
403        \rm test_netcdf90.f90 a.out
[4546]404    else
[4862]405        cat <<EOF
406Failed test program using NetCDF-Fortran. You can:
407- check that you have NetCDF-Fortran installed in your system
408- or specify an installation directory with option -netcdf of install_lmdz.sh
409- or download and compile NetCDF-Fortran with option -netcdf 1 of nstall_lmdz.sh
410EOF
411        exit 1
[4546]412    fi
[4891]413
414    # Compile NetCDF95
415    cd "$MODEL/modipsl/modeles/LMD"*
416    echo "Installing NetCDF95"
417    cd "$MODEL"
418    myget src_archives/netcdf/NetCDF95-0.3.tar.gz
419    tar -xf NetCDF95-0.3.tar.gz
420    \rm NetCDF95-0.3.tar.gz
421    cd NetCDF95-0.3
422    mkdir -p build && cd build
423    netCDF_INCLUDE_DIR=$(nc-config --includedir) netCDF_LIBRARY=$(nc-config --libdir) cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="$ncdfdir" -DCMAKE_INSTALL_PREFIX="$MODEL/modipsl"
424    make install
[4862]425}
[4405]426
[4896]427function install_IOIPSL {
[4862]428    cd "$MODEL/modipsl/modeles/IOIPSL"
429    ioipsllog="$(pwd)/ioipsl.log"
430    echo "Compiling IOIPSL, the interface library with Netcdf $(date) (log: $ioipsllog)"
[4405]431
[4890]432    if ! ./makeioipsl_fcm -arch "$arch" -job 8 > "$ioipsllog" 2>&1; then
433        echo "IOIPSL compile failed, exiting"; exit 1
[4862]434    fi
[4896]435
436    # Link to modipsl/bin
437    cp -f bin/* ../../bin
438
[4862]439    echo "IOIPSL compiled $(date)"
[4873]440
[4891]441    IOIPSL_LIBDIR_="$MODEL/modipsl/modeles/IOIPSL/lib"
442    IOIPSL_INCDIR_="$MODEL/modipsl/modeles/IOIPSL/inc"
[4862]443}
[4210]444
[4871]445function install_XIOS {
[4891]446    if [[ $with_xios = 1 ]]; then
[4871]447        cd "$MODEL/modipsl/modeles"
[4893]448        xioslog="$(pwd)/XIOS/xios.log"
[4871]449        echo "##########################################################"
450        echo "Compiling XIOS (log $xioslog) $(date)"
451        echo "##########################################################"
452
[4873]453        # Download XIOS
454        case $xios_branch in
455            "trunk")
456            xios_http="http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/trunk";;
457            "2.5")
458            xios_http="http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-2.5";;
459            "2.6")
460            xios_http="http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS2/branches/xios-2.6";;
461            *) echo "XIOS: Error, bad argument for -branch ! Did not expect $xios_branch"; exit;;
462        esac
463       
464        cd "$MODEL/modipsl/modeles"
465        set +e; svn co --revision $xios_rev $xios_http XIOS; set -e
466
467        cd XIOS
[4893]468        if ! ./make_xios --arch "$arch" --job 8 > "$xioslog" 2>&1; then
[4871]469            echo "XIOS compilation failed, exiting"; exit 1
470        fi
471
472        echo "Compiled XIOS $(date)"
473    fi
[4893]474
475    XIOS_LIBDIR_="$MODEL/modipsl/modeles/XIOS/lib"
476    XIOS_INCDIR_="$MODEL/modipsl/modeles/XIOS/inc"
[4871]477}
478
[4873]479function get_orchidee_version {  # Set / Check ORCHIDEE version
[4891]480    if [[ $veget = "none" ]]; then
481        veget_version="false"
482    elif [[ $veget = "CMIP6" ]]; then
483        veget_version=orchidee2.0
484    else # specific orchidee revision newer than CMIP6, on 2_1 or 2_2 branches
485        veget_version=orchidee2.1
486        if [[ $veget -lt 4465 ]]; then
487            echo 'ORCHIDEE version must be >=4465, exiting'
488            exit 1
489        fi
[4873]490
[4891]491        set +e
492        svn upgrade
493        local orcbranch
494        orcbranch=$(svn log -v -q svn://forge.ipsl.jussieu.fr/orchidee/ -r "$veget" |grep ORCHIDEE |head -1| sed -e 's:ORCHIDEE/.*$:ORCHIDEE:' | awk '{print $2}')
495        echo "IF YOU INSTALL ORCHIDEE THE VERY FIRST TIME, ASK for PASSWORD at orchidee-help@listes.ipsl.fr"
496        svn switch -r "$veget" --accept theirs-full "svn://forge.ipsl.jussieu.fr/orchidee/$orcbranch"
497        svn log -r "$veget" | grep "$veget"
498        if ! svn log -r "$veget" | grep "$veget"; then
499            echo 'Cannot update ORCHIDEE as not on the right branch for ORCHIDEE'
500            exit 1
501        fi
502        svn update -r "$veget"
503        set -e
[4873]504    fi
505}
506
[4891]507function compile_orchidee {
508    get_orchidee_version
509    ORCHPATH=""
[4873]510
511
[4891]512    if [[ $veget != "none" ]]; then
513        cd "$MODEL/modipsl/modeles/ORCHIDEE"
514        ORCHPATH=$(pwd)
[4873]515
[4891]516        orchideelog="$(pwd)/orchidee.log"
517        echo "Compiling ORCHIDEE, the continental surface model (log $orchideelog) $(date)"
[4873]518
[4891]519        local xios_orchid opt_orc
520        if [[ $with_xios = 1 ]]; then
521            xios_orchid="-xios";
522        else
523            xios_orchid="-noxios"
[4405]524        fi
[4891]525        if [[ $optim_debug = "-debug" ]]; then
526            opt_orc="-debug";
527        else
528            opt_orc="-prod"
529        fi
[4210]530
[4891]531        # TODO check that this works with old orchidee versions (cf. -d tools)
532        local varenv="IOIPSL_LIBDIR_=$IOIPSL_LIBDIR_ IOIPSL_INCDIR_=$IOIPSL_INCDIR_ ORCHPATH=$ORCHPATH"
533        if [[ $parallel = "none" ]]; then
[4893]534            echo "$varenv ./makeorchidee_fcm $xios_orchid $opt_orc -parallel none -arch $arch -j $make_j" > compile.sh
[4891]535        else
536            if [[ ! -d src_parallel ]]; then
537               echo "Orchidee version too old for parallel support"; exit 1
[4405]538            fi
[4891]539            {
[4893]540                echo "$varenv ./makeorchidee_fcm -j $make_j -clean $xios_orchid $opt_orc -parallel $parallel -arch $arch"
541                echo "$varenv ./makeorchidee_fcm -j $make_j $xios_orchid $opt_orc -parallel $parallel -arch $arch"
[4891]542            } > compile.sh
[4405]543        fi
[4891]544        chmod +x compile.sh
545        echo "Compiling ORCHIDEE using $(\cat compile.sh)"
546        if ! ./compile.sh > "$orchideelog" 2>&1; then
547            echo "ORCHIDEE compilation failed, exiting"; exit 1
548        fi
549        echo "Compiled ORCHIDEE $(date)"
[4210]550    fi
551
[4891]552    ORCH_LIBDIR_="$MODEL/modipsl/modeles/ORCHIDEE/lib"
553}
[4210]554
[4891]555function get_lmdz_version {
556    LMDZPATH=$(readlink -f "$MODEL/modipsl/modeles/LMD"*)
557    cd "$LMDZPATH"
558    lmdzlog="$(pwd)/lmdz.log"
[4372]559
[4891]560    set +e
561    svn upgrade
562    if [[ $svn = "last" ]]; then
563        svnopt=""
[4427]564    else
[4891]565        svnopt="-r $svn"
[4427]566    fi
[4891]567    if [[ $svn != "" ]]; then
568        if svn info | grep -q 'https:'; then svn switch --relocate https://svn.lmd.jussieu.fr/LMDZ http://svn.lmd.jussieu.fr/LMDZ; fi
569        svn update "$svnopt"
570    fi
571    mysvn=$(svnversion . | grep -E -o "[0-9]+" 2>/dev/null)
572    set -e
[4427]573
[4891]574    if [[ $mysvn = "" ]]; then mysvn=$(grep 'Revision: [0-9]' "$MODEL"/Read*.md | awk ' { print $2 } ' 2>/dev/null); fi
575    if [[ $mysvn = "" ]]; then mysvn=4190; fi
576}
[4427]577
[4891]578function compile_lmdz {
579    get_lmdz_version
[4427]580
[4891]581    exe_name="bin/gcm_${grid_resolution}_phylmd_${rad}${suff_exe}${suff_orc}.e"
[4210]582
[4891]583    local opt_rad
584    case $rad in
585        oldrad) iflag_rrtm=0; NSW=2; opt_rad="";;
586        rrtm)   iflag_rrtm=1; NSW=6
[4849]587            if [[ $mysvn -le 4185 ]]; then
[4405]588                opt_rad="-rrtm true"
589            else
590                opt_rad="-rad rrtm"
[4849]591            fi;;
[4891]592        ecrad)  iflag_rrtm=2; NSW=6; opt_rad="-rad ecrad";;
593        *) echo "Only oldrad rrtm ecrad for rad option"; exit 1
594    esac
595    if [[ $mysvn -le 4185 && $rad = "ecrad" ]]; then
596        echo "ecrad only available for LMDZ rev starting with 4186 "; exit 1
[4215]597    fi
[4210]598
[4891]599    # Compile
[4893]600    local varenv="IOIPSL_LIBDIR_=$IOIPSL_LIBDIR_ IOIPSL_INCDIR_=$IOIPSL_INCDIR_ ORCH_LIBDIR_=$ORCH_LIBDIR_ ORCHPATH=$ORCHPATH XIOS_INCDIR_=$XIOS_INCDIR_ XIOS_LIBDIR_=$XIOS_LIBDIR_"
601    makelmdz="makelmdz_fcm $optim_debug -arch $arch -j $make_j"
[4891]602    if [[ $parallel = "none" ]]; then
603        echo "$varenv ./$makelmdz $opt_rad $opt_cosp -d ${grid_resolution} -v $veget_version gcm " > compile.sh
[4215]604    else
[4891]605        echo "$varenv ./$makelmdz $opt_rad $opt_cosp $opt_makelmdz_xios -d ${grid_resolution} -v $veget_version -mem -parallel $parallel gcm" > compile.sh
[4215]606    fi
[4891]607    echo "Compiling lmdz using $(\cat compile.sh) (log: $lmdzlog) $(date)"
[4215]608    chmod +x ./compile.sh
[4891]609    if ! ./compile.sh > "$lmdzlog" 2>&1; then
610        echo "LMDZ compilation failed, exiting"; exit 1
[4215]611    fi
[4891]612    echo "Finished LMDZ compilation $(date)"
[4215]613
[4891]614    # Check executable
615    # TODO $mysev -ge 4186 => other name convention ! check original install
616    if [[ ! -f $exe_name ]]; then
617        echo "Compilation failed, can't find the executable"; exit 1
[4215]618    else
[4891]619        echo "Compilation successfull, the executable is $exe_name $(date)"
[4215]620    fi
[4891]621}
[4210]622
[4891]623function run_bench {
624    cd "$MODEL/modipsl/modeles/LMDZ"*
[4210]625
[4891]626    if [[ $bench = "tuto" ]]; then
[4893]627        myget "Training/tutorial.tar"; tar xf tutorial.tar; cd TUTORIAL
[4891]628        ./init.sh
629    elif [[ $bench = 1 ]]; then
630        \rm -rf "BENCH${grid_resolution}"
631        local bench=bench_lmdz_${grid_resolution}
632        myget "3DBenchs/$bench.tar.gz"
633        tar xf "$bench.tar.gz"
[4210]634
[4891]635        if [[ $cosp = "v1" || $cosp = "v2" ]]; then
636            cd "BENCH${grid_resolution}"
637            # copier les fichiers namelist input et output our COSP
638            cp ../DefLists/cosp*_input_nl.txt .
639            cp ../DefLists/cosp*_output_nl.txt .
640            # Activer la cles ok_cosp pour tourner avec COSP
641            sed -e 's@ok_cosp=n@ok_cosp=y@' config.def > tmp
642            \mv -f tmp config.def
643            cd ..
644        fi
[4210]645
[4891]646        if [[ -n "$physiq" ]]; then
647            cd "BENCH${grid_resolution}"
648            if [[ -f "physiq.def_${physiq}" ]]; then
649                cp "physiq.def_${physiq}" physiq.def
650                echo "using physiq.def_${physiq}"
651            else
652                echo "using standard physiq.def"
653            fi
654            cd ..
[4405]655        else
[4891]656            echo "using standard physiq.def"
[4405]657        fi
[4210]658
[4891]659        if [[ $with_xios = 1 ]]; then
660            cd "BENCH${grid_resolution}"
661            cp ../DefLists/iodef.xml .
662            cp ../DefLists/context_lmdz.xml .
663            cp ../DefLists/field_def_lmdz.xml .
664            # A raffiner par la suite
665            echo "A FAIRE : Copier les *xml en fonction de l option cosp"
666            cp ../DefLists/field_def_cosp*.xml .
667            cp ../DefLists/file_def_hist*xml .
668            # adapt iodef.xml to use attached mode
669            sed -e 's@"using_server" type="bool">true@"using_server" type="bool">false@' \
670                iodef.xml > tmp
671            \mv -f tmp iodef.xml
[4210]672
[4891]673            # and convert all the enabled="_AUTO_" (for libIGCM) to enabled=.FALSE.
674            # except for histday
675            for histfile in file_def_hist*xml
676            do
677                if [[ "$histfile" = "file_def_histday_lmdz.xml" ]]; then
678                    sed -e 's@enabled="_AUTO_"@type="one_file" enabled=".TRUE."@' \
679                        "$histfile" > tmp
680                    \mv -f tmp "$histfile"
681                    sed -e 's@output_level="_AUTO_"@output_level="5"@' "$histfile" \
682                        > tmp
683                    \mv -f tmp "$histfile"
684                    sed -e 's@compression_level="2"@compression_level="0"@' \
685                        "$histfile" > tmp
686                    \mv -f tmp "$histfile"
687                else
688                    sed -e 's@enabled="_AUTO_"@type="one_file" enabled=".FALSE."@' \
689                        "$histfile" > tmp
690                    \mv -f tmp "$histfile"
691                fi
692            done
693            # and add option "ok_all_xml=y" in config.def
694            echo "### XIOS outputs" >> config.def
695            echo 'ok_all_xml=.true.' >> config.def
696
697            #activer les sorties pour Cosp
698            if [[ "$cosp" = "v1" ]]; then
699                sed -i'' -e 's@enabled=".FALSE."@enabled=".TRUE."@' \
700                         -e 's@output_level="_AUTO_"@output_level="5"@' \
701                         -e 's@compression_level="2"@compression_level="0"@' \
702                         file_def_histdayCOSP_lmdz.xml
[4405]703            fi
[4891]704            if [[ "$cosp" = "v2" ]]; then
705                sed -e 's@compression_level="2"@compression_level="0"@' file_def_histdayCOSPv2_lmdz.xml
706                for type_ in hf day mth; do
707                    file=file_def_hist${type_}COSP
708                    sed -i'' -e 's@src="./'${file}'_lmdz.xml"@src="./'${file}'v2_lmdz.xml"@' context_lmdz.xml
709                done
710                sed -i '' -e 's@field_def_cosp1.xml@field_def_cospv2.xml@' field_def_lmdz.xml
711            fi
[4210]712
[4891]713            cd ..
[4405]714        fi
[4891]715
716        # Cas Bench avec ecrad
717        if [[ $rad = "ecrad" ]]; then
718            cd "BENCH${grid_resolution}"
719            cp  ../DefLists/namelist_ecrad .
720            cp -r ../libf/phylmd/ecrad/data .
721            cd ..
[4405]722        fi
[4210]723
[4891]724        # Adjusting bench physiq.def to radiative code chosen
725        cd "BENCH${grid_resolution}"
726        sed -e 's/iflag_rrtm=.*.$/iflag_rrtm='$iflag_rrtm'/' \
727            -e 's/NSW=.*.$/NSW='$NSW'/' physiq.def > tmpdef
728        \mv tmpdef physiq.def
[4405]729        cd ..
[4210]730
[4891]731        cp "$exe_name" "BENCH${grid_resolution}/gcm.e"
[4849]732        cd "BENCH${grid_resolution}"
[4210]733
[4891]734        if [[ ${parallel:0:3} = "mpi" ]]; then
735            # Lancement avec deux procs mpi et 2 openMP
736            echo "export OMP_STACKSIZE=800M" > bench.sh
737            if [[ "${parallel:4:3}" = "omp" ]]; then
738                echo "export OMP_NUM_THREADS=2" >> bench.sh
739            fi
740            if [[ "$cosp" = "v1" || "$cosp" = "v2" ]]; then
741                echo "ulimit -s 200000" >> bench.sh
[4215]742            else
[4891]743                echo "ulimit -s unlimited" >> bench.sh
744            fi
745            echo "mpirun -np 2 gcm.e > listing  2>&1" >> bench.sh
746            # Add rebuild, using reb.sh if it is there
747            cat <<EOF >> bench.sh
748    if [[ -f reb.sh ]]; then
749      ./reb.sh histday; ./reb.sh histmth; ./reb.sh histhf;
750      ./reb.sh histins; ./reb.sh stomate_history;
751      ./reb.sh sechiba_history; ./reb.sh sechiba_out_2
752    fi
753EOF
[4405]754        else
[4891]755            echo "./gcm.e > listing  2>&1" > bench.sh
[4405]756        fi
[4891]757        # Getting orchidee stuff
758        if [[ $veget = 'CMIP6' ]]; then
759            echo 'myget 3DBenchs/BENCHCMIP6.tar.gz'
760            myget 3DBenchs/BENCHCMIP6.tar.gz
761            tar xvzf BENCHCMIP6.tar.gz
762            sed -e "s:VEGET=n:VEGET=y:" config.def > tmp
763            mv -f tmp config.def
764            if [[ $with_xios = 1 ]]; then
765                cp ../../ORCHIDEE/src_xml/context_orchidee.xml .
766                echo '<context id="orchidee" src="./context_orchidee.xml"/>' > add.tmp
767                cp ../../ORCHIDEE/src_xml/field_def_orchidee.xml .
768                cp ../../ORCHIDEE/src_xml/file_def_orchidee.xml .
769                cp ../../ORCHIDEE/src_xml/file_def_input_orchidee.xml .
770                if [[ -f ../../ORCHIDEE/src_xml/context_input_orchidee.xml ]]; then
771                       cp ../../ORCHIDEE/src_xml/context_input_orchidee.xml .
772                       echo '<context id="orchidee" src="./context_input_orchidee.xml"/>' >> add.tmp
773                fi
774                sed -e '/id="LMDZ"/r add.tmp' iodef.xml > tmp
775                mv tmp iodef.xml
776                sed -e'{/sechiba1/ s/enabled="_AUTO_"/type="one_file" enabled=".TRUE."/}' \
777                    file_def_orchidee.xml > tmp
778                \mv -f tmp file_def_orchidee.xml
779                sed -e 's@enabled="_AUTO_"@type="one_file" enabled=".FALSE."@' \
780                    file_def_orchidee.xml > tmp
781                \mv -f tmp file_def_orchidee.xml
782                sed -e 's@output_level="_AUTO_"@output_level="1"@' \
783                    file_def_orchidee.xml > tmp
784                \mv -f tmp file_def_orchidee.xml
785                sed -e 's@output_freq="_AUTO_"@output_freq="1d"@' \
786                    file_def_orchidee.xml > tmp
787                \mv -f tmp file_def_orchidee.xml
788                sed -e 's@compression_level="4"@compression_level="0"@' \
789                    file_def_orchidee.xml > tmp
790                \mv -f tmp file_def_orchidee.xml
791                sed -e 's@XIOS_ORCHIDEE_OK = n@XIOS_ORCHIDEE_OK = y@' \
792                    orchidee.def > tmp
793                \mv -f tmp orchidee.def
[4215]794            fi
[4405]795        fi
[4220]796
[4891]797        if [[ -f ../arch.env ]]; then source ../arch.env; fi
[4220]798
[4891]799        echo "EXECUTION DU BENCH"
800        date
801        if (! ./bench.sh > out.bench 2>&1) || ! (tail -n 1 listing | grep "Everything is cool"); then
802            tail listing
803            echo "Bench FAILED, exiting"; exit 1
804        fi
805        date
806        tail listing
[4215]807    fi
[4210]808
[4891]809    # 1D case
810    if [[ $SCM = 1 ]]; then
811        cd "$MODEL"
812        myget 1D/1D.tar.gz
813        tar xf 1D.tar.gz
814        cd 1D
815        if [[ $rad = "oldrad" ]]; then
816            sed -i'' -e 's/^rad=.*$/rad=oldrad/' run.sh
817            sed -i'' -e 's/^rad=.*$/rad=oldrad/' bin/compile
818        fi
819        echo "Running 1D/run.sh, log in $(pwd)/run1d.log"
820        ./run.sh > "$(pwd)/run1d.log" 2>&1
[4422]821    fi
[4891]822}
[4210]823
[4891]824echo "install_lmdz.sh DEBUT $(date)"
[4409]825
[4891]826set_default_params
827read_cmdline_args "$@"
828#download_model
829download_model_AMAURY
830install_arch
831check_available_software
832install_netcdf
833install_IOIPSL
[4893]834install_XIOS
[4891]835compile_orchidee
836compile_lmdz
837run_bench
Note: See TracBrowser for help on using the repository browser.