source: BOL/script_install/install_lmdz.sh @ 5447

Last change on this file since 5447 was 5407, checked in by abarral, 10 days ago

Better preservation of install path

  • Property svn:executable set to *
File size: 41.8 KB
RevLine 
[4210]1#!/bin/bash
[5361]2set -eu  # error on command failure, and on unset variables
3export LC_ALL=# standardize awk format
[4210]4
5###########################################################################
[5361]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#
[5361]28# Prerequisites : gfortran, bash or ksh, wget, gunzip, tar, ...
[4210]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
[5361]38### Functions
[4210]39
[5361]40function myget {
41  # Get a file from LMDZ repository, make it executable if .(ba)sh
42  local url=$1
[4210]43
[5361]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
[5361]51function do_compile_sh {
52  local component=$1
53  local command=$2
54  local log
[4210]55
[5361]56  log="$(pwd)/$component.log"
[5385]57  printf "#!/bin/bash\n%s\n" "$command" > compile.sh
58  echo "Compiling $component using $command (log: $log) $(date)"
[5361]59    chmod +x ./compile.sh
60    if ! ./compile.sh &> "$log"; then
61        echo "STOP: $component compilation failed, exiting"; exit 1
62    fi
63    echo "Finished $component compilation $(date)"
64}
[4210]65
[5361]66function get_svn_branch {
67  local url=$1
68  local rev=$2
69  local res
[4210]70
[5361]71  res=$(svn log -v -q "$url" -r "$rev" -l 1 | cut -d "/" -f -4)
72  if echo "$res" | grep -q "/trunk/"; then
73    res=$(echo "$res" | grep "/trunk/" | head -1 | cut -d "/" -f 2-3)
74  elif echo "$res" | grep -q "/branches/"; then
75    res=$(echo "$res" | grep "/branches/" | head -1 | cut -d "/" -f 2-4)
76  else
77    echo "Could not determine svn branch for $url, r=$rev"
78  fi
79  echo "$res"
80}
[4210]81
[5361]82function set_default_params {
83    # Valeur par défaut des parametres
84    svn_lmdz=""
85    version="20241018.trunk"
[4210]86
[5361]87    netcdf=1
88    bench=1
89    SCM=0
90    veget="none"
91    grid_resolution="32x32x39"
92    benchphysiq=""
93    compphysiq="lmd"
94    is_1D="n"
95    fortran_file="gcm"
[4210]96
[5361]97    parallel="none"
98    trusting="testing"
99    MODEL=""
[4210]100
[5361]101    with_xios=0
102    opt_makelmdz_xios=""
[4210]103
[5361]104    icolmdz=0
105    dynamico_commit="11001689"
[4210]106
[5361]107    rad="rrtm"
[4210]108
[5361]109    compile_with_fcm=1
[4210]110
[5361]111    cosp="none"
112    aerosols=0
113    strataer=0
114    inlandsis=0
[4210]115
[5361]116    make_j=8
117    clean_install=1
118    local="$(pwd)"
[4210]119
[5361]120    # Check if on a Mac /!\ Probably doesn't work anymore, to fix one day...
121    if [[ $(uname) = "Darwin" ]]; then
122        export MAKE="make"
123    fi
[4210]124
[5361]125    optim_flag="-prod"
126    arch="local"
[4210]127
[5361]128    arch="local-gfortran"
129    arch_dir=""
[4210]130
[5361]131    jobcmd=""
[5386]132    verbose=0
[5361]133}
[4210]134
[5361]135function read_cmdline_args {
136    while (($# > 0)); do
137        case $1 in
[5386]138            "-v") version=$2; shift; shift;;
139            "-r") svn_lmdz=$2; shift; shift;;
140            "-d") grid_resolution=$2; shift; shift;;
141            "-unstable") trusting="unstable"; shift;;
142            "-cosp") cosp=$2
143                     case $cosp in
144                         "none"|"v1"|"v2") cosp=$2; shift; shift;;
145                         *) echo "Only none v1 v2 for cosp option"; exit 1
146                     esac;;
147            "-nofcm") compile_with_fcm=0; echo "This option will be reactivated soon (promesse du 8dec2022)"; exit 1;  shift;;
148            "-SCM") SCM=1; shift;;
149            "-rad") rad=$2
150                    case $rad in
151                        "oldrad"|"rrtm"|"ecrad") rad=$2; shift; shift;;
152                        *) echo "Only oldrad rrtm ecrad for rad option"; exit 1
153                    esac;;
154            "-parallel") parallel=$2
155                         case $parallel in
156                             "none"|"mpi"|"omp"|"mpi_omp") parallel=$2; shift; shift;;
157                             *) echo "Only none mpi omp mpi_omp for the parallel option"; exit 1
158                         esac;;
159            "-bench") bench=$2; shift; shift;;
160            "-debug") optim_flag="-debug"; shift;;
161            "-name") MODEL=$2; shift; shift;;
162            "-netcdf") netcdf=$2; shift; shift;;
163            "-benchphysiq") benchphysiq=$2; shift; shift;;
164            "-compilephysiq") compphysiq=$2; shift; shift;;
165            "-xios") with_xios=1; shift;;
166            "-arch") arch=$2; shift; shift;;
167            "-arch_dir") arch_dir=$2; shift; shift;;
168            "-veget") veget=$2; shift; shift;;
169            "-spla") aerosols=1; shift;;
170            "-strataer") strataer=1; shift;;
171            "-inlandsis") inlandsis=1; shift;;
172            "-make_j") make_j=$2; shift; shift;;
173            "-jobcmd") jobcmd=$2; shift; shift;;
174            "-noclean") clean_install=0; shift;;
175            "-icolmdz") icolmdz=1; shift;;
176            "-verbose") verbose=1; shift;;
177            "-h" | *) cat <<........fin
[5361]178        $0 [ -v version ] [ -r svn_release ]
179               [ -parallel PARA ] [ -d GRID_RESOLUTION ] [ -bench 0/1 ]
180               [-name LOCAL_MODEL_NAME] [-rad RADIATIF]
[4210]181
[5361]182        -v       "version" like 20150828.trunk, see http://www.lmd.jussieu.fr/~lmdz/Distrib/LISMOI.trunk (default <$version>)
[4417]183
[5361]184        -r       "svn_release" : either the svn release number or "last" (default <$svn_lmdz>)
[4210]185
[5361]186        -parallel parallel support: mpi, omp, mpi_omp (mpi with openMP) or none (default: <$parallel>)
[4210]187
[5361]188        -d        "grid resolution": should be among the available benchs if -bench 1 (valid values: 48x36x19, 48x36x39) (default : <$grid_resolution>)
[4210]189
[5361]190        -bench     activating the bench or not (0/1) (default: <$bench>)
[4210]191
[5361]192        -unstable  use unstable tar instead of testing
[4210]193
[5361]194        -name      name of the folder to install to (default <$MODEL>)
[4210]195
[5361]196        -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]197
[5361]198        -xios      use (download and compile) the XIOS library (will compile the parallel NetCDF4-HDF5 library) (requires to also have -parallel mpi_omp)
[4210]199
[5361]200        -cosp       to run with cospv1 or cospv2 [none/v1/v2] (default <$cosp>)
[4210]201
[5361]202        -rad        radiative code: oldrad, rrtm or ecrad (default <$rad>)
[4210]203
[5361]204        -nofcm      to compile without fcm
[4210]205
[5361]206        -SCM        install 1D version automatically
[4210]207
[5361]208        -debug      compile everything in debug mode
[4210]209
[5361]210        -benchphysiq   to choose which physics.def package to use in the bench (default <$benchphysiq>)
[4210]211
[5361]212        -compilephysiq   physics to compile the model with (default <$compphysiq>)
[4218]213
[5361]214        -veget      surface/vegetation scheme treatment controlled by the single variable veget which can have the following values: none: bucket scheme (default); CMIP6 | veget2.0: orchidee version used in CMIP exercise, rev 5661; veget2.2: orchidee branch 2.2, rev 8529 (bundled); number: orchidee version number  [only orch>2.0] (default $veget)
[4210]215
[5361]216        -spla       activate interactive aerosols
[4807]217
[5361]218        -inlandsis  activate new snow scheme
[4210]219
[5361]220        -arch       name of the arch to use (default <$arch>)
[4210]221
[5361]222        -arch_dir   where to find the arch files (default <$arch_dir>)
[4210]223
[5361]224        -make_j     number of processes to parallelize installations (default <$make_j>)
[4210]225
[5361]226        -jobcmd     command prepended to fcm compile jobs, e.g. "srun" (default <$jobcmd>)
[4210]227
[5361]228        -noclean    will only download necessary files (but no thorough check is made on the integrity of existing files), and will recompile everything (very quick if it's already been compiled before)
[4210]229
[5361]230        -icolmdz    to compile the icolmdz executable as well as the lonlat one
[4210]231
[5386]232        -verbose    to print every executed command
233
[5361]234........fin
[5386]235                  exit 0;;
[5361]236        esac
237    done
[4210]238
[5361]239    # Isotopes : Compile and run with isotopes if lmdz_phys="lmdiso" in main.sh
240    if [[ $compphysiq = "lmdiso" ]]; then isotopes=1; else isotopes=0; fi
[4210]241
[5361]242    # Option de compilation pour Cosp
243    case $cosp in
244        v1) opt_cosp="-cosp true";;
245        v2) opt_cosp="-cospv2 true";;
246        *) opt_cosp=""
247    esac
[4210]248
[5361]249    #Define veget-related suffix for gcm name
250    if [[ $veget = 'none' ]]; then
251        suff_orc=''
252    else
253        suff_orc='_orch'
254    fi
[4210]255
256
[5361]257    if [[ $parallel = "none" ]]; then
258        suff_para='_seq'
259    else
260        suff_para='_para_mem'
261    fi
[4210]262
[5361]263    if [[ $with_xios = 1 ]]; then opt_makelmdz_xios="-io xios"; fi
[4210]264
[5361]265    if [[ $aerosols = 1 ]]; then
266      opt_aer="-dust true"; suff_aer="_spla"
267    else
268      opt_aer=""; suff_aer=""
269    fi
[4211]270
[5361]271    if [[ $strataer = 1 ]]; then
272      opt_strataer="-strataer true"
273    else
274      opt_strataer=""
275    fi
[4210]276
[5361]277    if [[ $inlandsis = 1 ]]; then
278       opt_inlandsis="-inlandsis true"
279    else
280       opt_inlandsis=""
281    fi
[4210]282
[5361]283    if [[ $isotopes = 1 ]]; then
284      opt_isotopes="-isotopes true"; suff_iso="_iso"
285    else
286      opt_isotopes="" ; suff_iso=""
[4215]287    fi
[4210]288
[5361]289    # set default arch if parallel
290    if [[ $arch = "local-gfortran" && $parallel != "none" ]]; then
291      arch="local-gfortran-parallel"
292      echo "Switching default arch to $arch"
[4215]293    fi
[4210]294
[5361]295    # Name of the model's folder. The convention taken here is that models that requires different compilation sources should have a different names.
296    local xios_name=""
297    if [[ $with_xios = 1 ]]; then xios_name="XIOS"; fi
298    if [[ $MODEL = "" ]]; then MODEL="./LMDZ$version${svn_lmdz}OR$veget$xios_name"; fi
[4210]299
[5361]300    if [[ $arch_dir = "" ]]; then
301      arch_dir="$MODEL/modipsl/config/IPSLCM7/ARCH/";
302    elif ! readlink -fe "$arch_dir" >/dev/null; then
303      echo "STOP: no arch dir <$arch_dir>"; exit 1
304    fi
[4210]305
[5361]306    if ! (echo "$grid_resolution" | grep -q "x"); then
307      is_1D="y"
308      fortran_file="lmdz1d"
309    fi
[5386]310
311    if [[ $verbose = 1 ]]; then set -vx; fi
[5361]312}
[4210]313
[5361]314function ensure_correct_option_combinations {
315    # Check on veget version
316    if [[ $veget != 'none' && $veget != "CMIP6" && $veget != "orch2.0" && $veget != "orch2.2" ]]; then
317        re='^[0-9]+$'
318        if ! [[ $veget =~ $re ]]; then
319            echo 'Valeur de l option veget non valable'; exit 1
320        fi
321    fi
[4210]322
[5361]323    ## if compiling icolmdz, XIOS must be set
324    if [[ $icolmdz = 1 && $with_xios = 0 ]]; then
325      echo "Error, you must set -xios to compile the icolmdz executable"; exit 1
[4218]326    fi
[5361]327    ## if also compiling XIOS, parallel must be mpi_omp
328    if [[ $with_xios = 1 && $parallel != "mpi_omp" ]]; then
329        echo "Error, you must set -parallel mpi_omp if you want XIOS"; exit 1
330    fi
[4210]331
[5361]332    if [[ $cosp = "v2" && $with_xios = 0 ]]; then
333        echo "Error, Cospv2 cannot run without Xios"; exit 1
334    fi
[4210]335
[5361]336    # STOP if trying to use both ORCHIDEE and Isotopes :
337    if [[ $isotopes = 1 && $veget != "none" ]]; then
338      echo "STOP: You cannot run LMDZ with ORCHIDEE and ISOtopes at the same time"; exit 1
[4218]339    fi
[4210]340
[5361]341    # STOP if trying to use both SPLA and Isotopes :
342    if [[ $isotopes = 1 && $aerosols = 1 ]]; then
343      echo "STOP: You cannot run LMDZ with Isotopes and aerosols=spla at the same time"; exit 1
344    fi
[4210]345
[5361]346    # (Temporary) STOP if trying to use Isotopes with XIOS :
347    if [[ $isotopes = 1 && $with_xios = 1 ]]; then
348      echo "STOP: Isotopes cannont yet be run with XIOS"; exit 1
349    fi
[4210]350
[5361]351    if [[ $aerosols = 1 && $rad != "rrtm" ]]; then
352      echo "STOP: For the time being, <aerosols=spla> requires <rad=rrtm>"; exit 1
[4215]353    fi
[5361]354}
[4210]355
[5361]356function check_available_software {
357    local required_soft=("wget" "tar" "gzip" "make" "gcc" "cmake" "m4" "c++")
358    echo "Checking if required software is available (${required_soft[*]})"
359    for logiciel in "${required_soft[@]}"; do
360        if [[ $(which "$logiciel") = "" ]]; then
361            echo "You must first install $logiciel on your system"; exit 1
[4405]362        fi
[4215]363    done
[5361]364}
[4210]365
[5361]366function download_modipsl_tar {
[5399]367    if [[ $clean_install = 1 && -d $MODEL ]]; then
[5398]368      local ans
369      echo "$MODEL already exists. Do you want to erase it and proceed (Y/n) ? You can also rerun with \`-noclean\` to only recompile the necessary components."
370      read -r ans
371      ans="${ans,,}"  # to lowercase
372      if [[ $ans != "y" ]]; then exit 0; fi
373      rm -rf "$MODEL"
374    fi
[4210]375
[5361]376    mkdir -p "$MODEL"
377    MODEL=$(readlink -e -f "$MODEL"); echo "MODEL: $MODEL"  # absolute path
378    if [[ ! -d "$MODEL/modipsl" ]]; then
379        echo "Downloading a slightly modified version of modipsl+LMDZ"
380        cd "$MODEL"
381        getlog="$(pwd)/get.log"
382        echo "logfile : $getlog"
[5365]383        set +e; myget "src_archives/$trusting/modipsl.$version.tar.gz" &>> "$getlog"; set -e
384        if [[ ! -f "modipsl.$version.tar.gz" ]]; then
385          echo "STOP: failed to download modipsl. $getlog: <$(tail "$getlog")>"; exit 1
386        fi
[5361]387        echo "install_lmdz.sh wget_OK $(date)"
[4546]388
[5361]389        gunzip "modipsl.$version.tar.gz" &>> get.log
390        tar xf "modipsl.$version.tar" &>> get.log
391        rm "modipsl.$version.tar"
392    fi
393}
[4546]394
[5361]395function init_arch {
396    cd "$local"
397    set +e; arch_dir=$(readlink -f "$arch_dir"); set -e  # full path. readlink must be called *after* the path is created
[4212]398
[5361]399    # Check where default fcm, path, env are located - by default in $arch_path, instead in $MODEL/modipsl/modeles/LMDZ/arch/
400    local i fcm_path path_path env_path
401    for i in "path" "fcm" "env"; do
402      local varname=${i}_path
403      if [[ -f $arch_dir/arch-$arch.$i ]]; then
404          declare $varname="$arch_dir/arch-$arch.$i"
405      else
406          declare $varname="$MODEL/modipsl/modeles/LMDZ/arch/arch-$arch.$i"
407          if [[ ! -f ${!varname} ]]; then
408              echo "STOP: no ${!varname}"; exit 1
409          fi
410      fi
411    done
412    default_fcm_path=$fcm_path
413    default_path_path=$path_path
414    default_env_path=$env_path
[4212]415
[5361]416    # check compiler
417    compiler=$(< "$default_fcm_path" grep "%COMPILER" | sed -e "s/%COMPILER\s*//")
[4405]418
[5361]419    # load env
420    if [[ -f $default_env_path ]]; then source "$default_env_path"; fi
[4405]421
[5361]422    local mpi_file  # can't be done before as it depends on sourcing the env
[5398]423    if [[ $parallel != "none" ]]; then
424      if [[ $(which "mpif90") = "" ]]; then
425        echo "STOP: parallel=$parallel but <mpif90> could not be found"; exit 1
426      fi
427      mpi_file=$(readlink -e -f "$(which mpif90)")
428      path_mpi=$(dirname "$mpi_file")
429      root_mpi=$(dirname "$path_mpi")
430    fi
[5361]431}
[4210]432
[5375]433function check_compiler {
434  # Must be called after init_arch to know which compiler to use
435    cat <<eod > tt.f90
436print*,'coucou'
437end
438eod
439    $compiler tt.f90 || a.out
440    ./a.out >| tt
441    if [[ $(< tt sed -e 's/ //g' ) != "coucou" ]]; then
442        echo "problem installing with compiler $compiler"; exit 1
443    fi
444    rm tt a.out tt.f90
445}
446
[5361]447function install_arch {
448    local component=$1
[4210]449
[5361]450    # Use same .env for all components (for module compatibility)
451    cp -f "$default_env_path" "$MODEL/modipsl/modeles/$component/arch" &> /dev/null || true  # allow failure if we're copying the file to itself
[4238]452
[5361]453    # Use local .path and .fcm if available, otherwise default
454    if [[ ! -f "$MODEL/modipsl/modeles/$component/arch/arch-$arch.path" ]]; then
455        cp -f "$default_path_path" "$MODEL/modipsl/modeles/$component/arch"
[4238]456
[5361]457        if [[ $component = "ORCHIDEE" ]]; then
458            if [[ $orcbranch = "/tags/ORCHIDEE_2_0/ORCHIDEE" ]]; then  # 2.0 and before have a different fcm convention
459                sed -i'' -e "s/-I//" -e "s/-L//" "$MODEL/modipsl/modeles/ORCHIDEE/arch/arch-$arch.path"  # /!\ we only replace first occurence on purpose
460            fi
[4405]461        fi
[5361]462    fi
463    if [[ ! -f "$MODEL/modipsl/modeles/$component/arch/arch-$arch.fcm" ]]; then
464        cp -f "$default_fcm_path"  "$MODEL/modipsl/modeles/$component/arch"
[4210]465
[5361]466        if [[ $component = "XIOS" ]]; then
467            # Adapt for XIOS, which uses different naming conventions
468            sed -i'' -e "s/%COMPILER/%FCOMPILER/" -e "s/%LINK/%LINKER/" -e "s/-fdefault-real-8//" "$MODEL/modipsl/modeles/XIOS/arch/arch-$arch.fcm"
[4405]469        fi
[5361]470    fi
471}
[4210]472
[5361]473function install_netcdf {
474    echo "Installing Netcdf"
475    local ncdf_compiler="$compiler"
[4210]476
[5361]477    if [[ $netcdf = 0 ]]; then
478        ncdfdir=$(nf-config --prefix)
479    else
480        cd "$MODEL"
[4210]481
[5361]482        # Convert non-basic compiler
483        case $compiler in
484            mpif90) ncdf_compiler=$($compiler --version | head -n 1 | cut -d " " -f -1)
485        esac
[4210]486
[5361]487        case $ncdf_compiler in
488            gfortran | GNU) ncdf_compiler="gfortran"; opt1="-compiler gnu"; opt2="-CC gcc -FC gfortran -CXX g++";;
489            *)      echo "unexpected compiler $ncdf_compiler for netcdf"; exit 1
490        esac
[4210]491
[5361]492        case $with_xios in
493            0) script_install_netcdf="install_netcdf4_hdf5_seq.bash"
494               ncdfdir="netcdf4_hdf5_seq"
495               opt_="$opt1";;
496            1) script_install_netcdf="install_netcdf4_hdf5.bash"
497               ncdfdir="netcdf4_hdf5"
498               opt_="$opt2 -MPI $root_mpi";;
499            *) echo "with_xios=$with_xios, should be 0 or 1"; exit 1
500        esac
501        if [[ $netcdf = 1 ]]; then
502           ncdfdir="$MODEL/$ncdfdir"
503        else
504           mkdir -p "$netcdf"; ncdfdir="$netcdf/$ncdfdir"
505        fi
[4210]506
[5361]507        echo "Repertoire netcdf $ncdfdir"
508        if [[ ! -d $ncdfdir ]]; then
509            netcdflog=$(pwd)/netcdf.log
510            echo "----------------------------------------------------------"
511            echo "Compiling the Netcdf library"
512            echo "----------------------------------------------------------"
513            echo "log file : $netcdflog"
514            myget script_install/$script_install_netcdf &>> "$netcdflog"
515            chmod u=rwx $script_install_netcdf
516            # shellcheck disable=SC2086
517            ./$script_install_netcdf -prefix "$ncdfdir" $opt_ &>> "$netcdflog"
[4405]518        fi
[4210]519
[5361]520        # Add to path
521        export PATH="$ncdfdir/bin:$PATH"
522        echo "Bin PATH" $PATH
[4508]523
[5361]524        #----------------------------------------------------------------------------
525        # LF rajout d'une verrue, pour une raison non encore expliquee,
526        # la librairie est parfois rangée dans lib64 et non dans lib
527        # par certains compilateurs
528        if [[ ! -e lib && -d lib64 ]]; then ln -s lib64 lib; fi
529        #----------------------------------------------------------------------------
[4210]530
[5361]531        echo "install_lmdz.sh netcdf_OK $(date)"
532    fi
[4709]533
[5398]534    # add exported netcdf path to .env if not already the case. This ensures we always use the same netcdf library as during the first install.
535    if [[ $(nf-config --prefix) = "" || $(nc-config --prefix) = "" ]]; then
536      echo "STOP: missing nf-config or nc-config in \$PATH"; exit 1
537    fi
[5407]538    local env_msg env_msg_tail
[5398]539    env_msg_tail="# netcdf bin path auto-added by install_lmdz.sh"
[5407]540    env_msg="export PATH=\"$PATH:\$PATH\" $env_msg_tail"
541    if ! < "$default_env_path" grep -q "$env_msg_tail"; then
[5398]542      sed -i "1s@^@$env_msg\n@" "$default_env_path"
543    fi
544
545    # Test if netcdf works fine on a simple program
[5361]546    cat >test_netcdf90.f90 <<EOF
547    use netcdf
548    print *, "NetCDF library version: ", nf90_inq_libvers()
549    end
550EOF
[5021]551
[5361]552    if $ncdf_compiler -I"$ncdfdir"/include test_netcdf90.f90 -L"$ncdfdir"/lib -lnetcdff -lnetcdf -Wl,-rpath="$ncdfdir"/lib && ./a.out; then
553        rm test_netcdf90.f90 a.out
[4215]554    else
[5361]555        cat <<EOF
556Failed test program using NetCDF-Fortran. You can:
557- check that you have NetCDF-Fortran installed in your system
558- or specify an installation directory with option -netcdf of install_lmdz.sh
559- or download and compile NetCDF-Fortran with option -netcdf 1 of install_lmdz.sh
560EOF
561        exit 1
[4215]562    fi
[4210]563
[5361]564    # Compile NetCDF95
565    cd "$MODEL/modipsl/modeles/LMD"*
566    echo "Installing NetCDF95"
567    cd "$MODEL"
568    if [[ ! -d "NetCDF95-0.3" ]]; then
569        myget src_archives/netcdf/NetCDF95-0.3.tar.gz
570        tar -xf NetCDF95-0.3.tar.gz
571        rm NetCDF95-0.3.tar.gz
572        cd NetCDF95-0.3
573        mkdir -p build && cd build
574        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"
575        make install
[4215]576    fi
[5361]577}
[4210]578
[5361]579function install_IOIPSL {
580    install_arch "IOIPSL"
[4210]581
[5361]582    cd "$MODEL/modipsl/modeles/IOIPSL"
[5407]583    echo "Compiling IOIPSL, the interface library with Netcdf $(date)"
[5385]584    # in case ksh is not installed on the pc
[5361]585    if [[ ! -x /bin/ksh ]]; then
[5385]586      sed -i''  -e 's/ksh/bash/' ins_m_prec
[4215]587    fi
[5385]588    do_compile_sh "IOIPSL" "$jobcmd ./makeioipsl_fcm -j $make_j -arch $arch $optim_flag"
[4210]589
[5361]590    # Link to modipsl/bin
591    cp -f bin/* ../../bin
[4210]592
[5361]593    echo "IOIPSL compiled $(date)"
594}
[4210]595
[5361]596function install_XIOS {
597    if [[ $with_xios = 1 ]]; then
598        cd "$MODEL/modipsl/modeles"
599        xioslog="$(pwd)/XIOS/xios.log"
600        echo "##########################################################"
601        echo "Compiling XIOS (log $xioslog) $(date)"
602        echo "##########################################################"
[4210]603
[5361]604        # Download XIOS
605        local xios_http="http://forge.ipsl.fr/ioserver/svn/XIOS2/branches/xios-2.6"
606        local xios_rev="2568"
607       
608        cd "$MODEL/modipsl/modeles"
609        set +e; svn co -r $xios_rev $xios_http XIOS; set -e
[4210]610
[5361]611        cd XIOS
[4210]612
[5361]613        install_arch "XIOS"
614        do_compile_sh "XIOS" "$jobcmd ./make_xios --job $make_j --arch $arch"
615    fi
616}
[4210]617
[5361]618function get_orchidee_version {  # Set / Check ORCHIDEE version
619    echo "Checking Orchidee source version"
620    local fetch_rev=""
621    orcbranch=""
622    case $veget in
623        "none") fcm_veget_version="false";;
624        "orch2.0" | "CMIP6") fcm_veget_version=orchidee2.0; fetch_rev=7906;;  # in previous tar we used 6592 but with some modifications to xios_orchidee.f90, which got integrated in 7906
625        "orch2.2") fcm_veget_version=orchidee2.1; orcbranch="/branches/ORCHIDEE_2_2/ORCHIDEE" ;; # the bundled version
626        *) fetch_rev=$veget; fcm_veget_version=orchidee2.1;;  # /!\ arbitary rev only works for orch>=2.1
627          # /!\ Note: for orch>=4, we should be using fcm_vegt_version="orchideetrunk". Below copied comment by Adriana in LMDZ_Setup docs:
628#          Avec orchidee2.1, on va compiler LMDZ avec le cle cpp ORCHIDEE_NOLIC. On ne va donc pas prendre en compte les avancements fait dans le trunk qui permet que les fractions lic soitent traité par ORCHIDEE. Ca marche très bien sans cela puisque dans tout façon c'est en cours de développement et ce n'est pas activé par default. En fait on devrait compiler le trunk avec -v orchideetrunk mais avec landice_opt>2, ce qui ne change rien par rapport à orchidee2.1
629#Si on voudrait activer landice_opt=2 , il faut compiler avec -v orchideetrunk.
[4210]630
[5361]631    esac
[4210]632
[5361]633    if [[ -n $fetch_rev ]]; then
634        echo "IF YOU INSTALL ORCHIDEE THE VERY FIRST TIME, ASK for PASSWORD at orchidee-help@listes.ipsl.fr"
635        local curr_rev
636        curr_rev=$(svn info "$MODEL/modipsl/modeles/ORCHIDEE" | grep Revision: | cut -d ":" -f 2 | cut -c 2-)
637        orcbranch=$(svn log -v -q svn://forge.ipsl.fr/orchidee/ -r "$fetch_rev" | grep ORCHIDEE | head -1 | sed -e 's:ORCHIDEE/.*$:ORCHIDEE:' | awk '{print $2}')
638        if [[ $fetch_rev != "$curr_rev" ]]; then
639            echo "Fetching orch $fetch_rev from the repository (curr: $curr_rev)"
640            echo "branch is $orcbranch"
641            if [[ $fetch_rev -lt 4465 ]]; then echo 'ORCHIDEE version must be >=4465, exiting'; exit 1; fi
642            cd "$MODEL/modipsl/modeles"
643            rm -rf ORCHIDEE
644            svn co -r "$fetch_rev" "svn://forge.ipsl.fr/orchidee/$orcbranch"
645            cd - > /dev/null
646        fi
647    fi
[4210]648
[5361]649    # Check parallel LMDZ+ORCH
650    if [[ (! $veget = "none") && $parallel = "none" && ($used_lmdz_rev -lt 4894) ]]; then
651        echo "LMDZ revision must be >=4894 for orchidee without parallel support. Upgrade lmdz or use -parallel mpi_omp."; exit 1
[4210]652    fi
[5361]653}
[4210]654
[5361]655function compile_orchidee {
656    install_arch "ORCHIDEE"
[4210]657
[5361]658    if [[ $veget != "none" ]]; then
659        cd "$MODEL/modipsl/modeles/ORCHIDEE"
[4372]660
[5361]661        local xios_orchid
662        if [[ $with_xios = 1 ]]; then
663            xios_orchid="-xios";
664        else
665            xios_orchid="-noxios"
666        fi
[4427]667
[5361]668        if [[ $parallel != "none" && ! -d src_parallel ]]; then
669           echo "STOP: Orchidee version too old for parallel support"; exit 1
670        fi
671        do_compile_sh "ORCHIDEE" "$jobcmd ./makeorchidee_fcm -j $make_j $xios_orchid $optim_flag -parallel $parallel -arch $arch"
672    fi
673}
[4427]674
[5361]675function get_lmdz_version {
676    echo "Checking LMDZ source version"
677    LMDZPATH=$(readlink -e -f "$MODEL/modipsl/modeles/LMD"*)
678    cd "$LMDZPATH"
679
680    if [[ -n $svn_lmdz ]]; then
681        local curr_rev
682        curr_rev=$(svn info "$MODEL/modipsl/modeles/LMD"* | grep Revision: | cut -d ":" -f 2 | cut -c 2-)
683        if [[ $svn_lmdz != "$curr_rev" ]]; then
684            local lmdzbranch
685            echo "Fetching LMDZ $svn_lmdz from the repository"
[5399]686#            lmdzbranch=$(get_svn_branch "https://svn.lmd.jussieu.fr/LMDZ" "$svn_lmdz")
687            lmdzbranch=$(get_svn_branch "http://svn.lmd.jussieu.fr/LMDZ" "$svn_lmdz")
[5361]688            echo "branch is $lmdzbranch"
689            cd "$MODEL/modipsl/modeles"
690            rm -rf LMD*
[5399]691#            svn co -r "$svn_lmdz" "https://svn.lmd.jussieu.fr/LMDZ/$lmdzbranch" LMDZ
692            svn co -r "$svn_lmdz" "http://svn.lmd.jussieu.fr/LMDZ/$lmdzbranch" LMDZ
[5361]693            cd - > /dev/null
694        fi
695        used_lmdz_rev=$svn_lmdz
696    else  # get svn from info
697        set +e; used_lmdz_rev=$(svn info | grep "Last Changed Rev" | cut -c 19-); set -e
698        if [[ -z $used_lmdz_rev ]]; then  # svn info failed
699            used_lmdz_rev=$(grep 'Revision: [0-9]' "$MODEL"/Read*.md | awk ' { print $2 } ' 2>/dev/null)
700            if [[ -z $used_lmdz_rev ]]; then echo "Could not determine lmdz version. This is likely an issue with the .tar itself, please report to LMDZ team."; exit 1; fi
701        fi
[4427]702    fi
[5361]703}
[4427]704
[5361]705function compile_lmdz {
706    install_arch "LMDZ"
707    cd "$LMDZPATH"
[4427]708
[5361]709    if [[ $used_lmdz_rev -le 4185 ]]; then
710        exe_name="bin/${fortran_file}_${grid_resolution}_phy${compphysiq}_${suff_para}${suff_orc}${suff_aer}${suff_iso}.e"
711    else
712        exe_name="bin/${fortran_file}_${grid_resolution}_phy${compphysiq}_${rad}${suff_para}${suff_orc}${suff_aer}${suff_iso}.e"
713    fi
[4427]714
[5361]715    local opt_rad
716    case $rad in
717        oldrad) iflag_rrtm=0; NSW=2; opt_rad="";;
718        rrtm)   iflag_rrtm=1; NSW=6
719            if [[ $used_lmdz_rev -le 4185 ]]; then
[4405]720                opt_rad="-rrtm true"
721            else
722                opt_rad="-rad rrtm"
[5361]723            fi;;
724        ecrad)  iflag_rrtm=2; NSW=6; opt_rad="-rad ecrad";;
725        *) echo "Only oldrad rrtm ecrad for rad option"; exit 1
726    esac
727    if [[ $used_lmdz_rev -le 4185 && $rad = "ecrad" ]]; then
728        echo "ecrad only available for LMDZ rev starting with 4186 "; exit 1
[4215]729    fi
[4210]730
[5361]731    # Compile
732    local makelmdz="makelmdz_fcm $optim_flag -arch $arch -j $make_j"
733    local para_compile_opt="-mem -parallel $parallel"; if [[ $parallel = "none" ]]; then para_compile_opt=""; fi
734    do_compile_sh "LMDZ" "$jobcmd ./$makelmdz $opt_rad $opt_cosp $opt_makelmdz_xios $opt_aer $opt_inlandsis $opt_strataer $opt_isotopes -p $compphysiq -d ${grid_resolution} -v $fcm_veget_version $para_compile_opt $fortran_file"
[4210]735
[5361]736    # Check executable
737    if [[ ! -f $exe_name ]]; then
738        echo "STOP: Compilation failed, can't find the executable"; exit 1
739    else
740        echo "Compilation successful, the executable is $exe_name $(date)"
[4215]741    fi
[5361]742}
[4210]743
[5361]744function get_dynamico_icosa_version {
745  if [[ $icolmdz = 1 ]]; then
746    echo "Checking DYNAMICO source version"
747    cd "$MODEL/modipsl/modeles"
748    if [[ ! -d DYNAMICO ]]; then
749      git clone https://gitlab.in2p3.fr/ipsl/projets/dynamico/dynamico.git DYNAMICO
[4215]750    fi
[5361]751    cd DYNAMICO
752    git checkout master && git checkout $dynamico_commit
753    cd - > /dev/null
[4210]754
[5361]755    echo "Checking ICOSA_LMDZ source version"
756    if [[ ! -d ICOSA_LMDZ ]]; then
757      svn checkout http://svn.lmd.jussieu.fr/LMDZ/ICOSA_LMDZ
[4215]758    fi
[5361]759    cd ICOSA_LMDZ
760    svn up -r 5320
761  fi
762}
[4215]763
[5361]764function compile_icolmdzor {
765    if [[ $icolmdz = 1 ]]; then
766      install_arch "ICOSA_LMDZ"
767      local para_compile_opt="-parallel $parallel"; if [[ $parallel = "none" ]]; then para_compile_opt=""; fi
[4210]768
[5361]769      # LMDZ physics package library already available in LMDZ/config/lib directory
[4210]770
[5361]771      # Compile DYNAMICO
772      cd "$MODEL/modipsl/modeles/DYNAMICO"
[4210]773
[5361]774      # Need to get rather than install the archs as DYNAMICO uses FCMv2 that does not understand the makefile syntax ($shell)
775      cd arch
776      wget "http://lmdz.lmd.jussieu.fr/pub/src_archives/misc/arch/DYNAMICO/arch-$arch.env"
777      wget "http://lmdz.lmd.jussieu.fr/pub/src_archives/misc/arch/DYNAMICO/arch-$arch.fcm"
778      wget "http://lmdz.lmd.jussieu.fr/pub/src_archives/misc/arch/DYNAMICO/arch-$arch.path"
779      cd ..
[4219]780
[5361]781      do_compile_sh "DYNAMICO" "$jobcmd ./make_icosa $optim_flag -arch $arch -job $make_j $para_compile_opt -external_ioipsl -with_xios"
[4210]782
[5361]783      # Compile icosa_lmdz
784      echo "Bin PATH before icosalmdz" "$PATH"
785      cd "$MODEL/modipsl/modeles/ICOSA_LMDZ"
786      do_compile_sh "ICOSA_LMDZ" "$jobcmd ./make_icosa_lmdz -arch $arch -j $make_j -nodeps -p lmd $optim_flag $para_compile_opt -with_orchidee"
787      echo "# Running environment for icosa_lmdz" > icosalmdz.env
788      echo "# "                                   >> icosalmdz.env
789      if [[ -v LD_LIBRARY_PATH ]]; then 
790        echo "export LD_LIBRARY_PATH=$ncdfdir/lib:$LD_LIBRARY_PATH" >> icosalmdz.env
791      else 
792        echo "export LD_LIBRARY_PATH=$ncdfdir/lib" >> icosalmdz.env
793      fi
[4215]794    fi
[5361]795}
[4210]796
[5361]797function run_bench {
798    local bench_cmd="./bench.sh"
[4210]799
[5361]800    cd "$MODEL/modipsl/modeles/LMDZ"*
[4210]801
[5361]802    if [[ $bench = "tuto" ]]; then
803        myget "Training/tutorial.tar"; tar xf tutorial.tar; cd TUTORIAL
804        ./init.sh
805    elif [[ $bench = 1 ]]; then
806      rm -rf "BENCH${grid_resolution}"
807      local bench=bench_lmdz_${grid_resolution}
808      if [[ $compphysiq = "lmdiso" ]]; then bench=bench_lmdz_iso_${grid_resolution}; fi
[4210]809
[5361]810      if [[ $is_1D = "y" ]] ; then  # 1D
811        myget "1D/1D.tar.gz"
812        mkdir -p "BENCH${grid_resolution}"
813        tar xf "1D.tar.gz" -C "BENCH${grid_resolution}" --strip-components=1
814        cd "BENCH${grid_resolution}"
815        # Below: ugly, but until we rewrite the 1D case...
816        sed -i'' -e "s:^listecas=.*$:listecas=ARMCU/REF:" -e "s:cd \$local/bin ; ./compile -L \$L:#cd \$local/bin ; ./compile -L \$L:" \
817            -e "s:./compile -L \$llm:#./compile -L \$llm:" -e "s:ln -sf \$bin/\\\\\${main}\${suffixe}.e .:ln -sf ../../../../../$exe_name \\\\\${main}\${suffixe}.e:" -e "s:gzip listing:cp listing restartphy.nc ../../../../; exit 0:" \
818            run.sh
819        cp "../$exe_name" bin/
820        bench_cmd="./run.sh -rad $rad"  # suppress ferret commands that launch after bench is "over"
821      else
822        myget "3DBenchs/$bench.tar.gz"
823        mkdir "BENCH${grid_resolution}"
824        tar xf "$bench.tar.gz" -C "BENCH${grid_resolution}" --strip-components=1
[4210]825
[5361]826        if [[ $cosp = "v1" || $cosp = "v2" ]]; then
827            cd "BENCH${grid_resolution}"
828            # copier les fichiers namelist input et output our COSP
829            cp ../DefLists/cosp*_input_nl.txt .
830            cp ../DefLists/cosp*_output_nl.txt .
831            # Activer la cles ok_cosp pour tourner avec COSP
832            sed -e 's@ok_cosp=n@ok_cosp=y@' config.def > tmp
833            \mv -f tmp config.def
834            cd ..
835        fi
[4210]836
[5361]837        if [[ -n "$benchphysiq" ]]; then
838            cd "BENCH${grid_resolution}"
839            if [[ -f "physiq.def_${benchphysiq}" ]]; then
840                cp "physiq.def_${benchphysiq}" benchphysiq.def
841                echo "using physiq.def_${benchphysiq}"
842            else
843                echo "using standard physiq.def"
844            fi
845            cd ..
[4405]846        else
[5361]847            echo "using standard physiq.def"
[4405]848        fi
[4210]849
[5361]850        if [[ $with_xios = 1 ]]; then
851            cd "BENCH${grid_resolution}"
852            cp ../DefLists/iodef.xml .
853            cp ../DefLists/context_lmdz.xml .
854            cp ../DefLists/field_def_lmdz.xml .
855            # A raffiner par la suite
856            echo "A FAIRE : Copier les *xml en fonction de l option cosp"
857            cp ../DefLists/field_def_cosp*.xml .
858            cp ../DefLists/file_def_hist*xml .
859            # adapt iodef.xml to use attached mode
860            sed -e 's@"using_server" type="bool">true@"using_server" type="bool">false@' \
861                iodef.xml > tmp
862            \mv -f tmp iodef.xml
[4210]863
[5361]864            # and convert all the enabled="_AUTO_" (for libIGCM) to enabled=.FALSE.
865            # except for histday
866            for histfile in file_def_hist*xml; do
867                if [[ "$histfile" = "file_def_histday_lmdz.xml" ]]; then
868                    sed -e 's@enabled="_AUTO_"@type="one_file" enabled=".TRUE."@' \
869                        "$histfile" > tmp
870                    \mv -f tmp "$histfile"
871                    sed -e 's@output_level="_AUTO_"@output_level="5"@' "$histfile" \
872                        > tmp
873                    \mv -f tmp "$histfile"
874                    sed -e 's@compression_level="2"@compression_level="0"@' \
875                        "$histfile" > tmp
876                    \mv -f tmp "$histfile"
877                else
878                    sed -e 's@enabled="_AUTO_"@type="one_file" enabled=".FALSE."@' \
879                        "$histfile" > tmp
880                    \mv -f tmp "$histfile"
881                fi
882            done
883            # and add option "ok_all_xml=y" in config.def
884            echo "### XIOS outputs" >> config.def
885            echo 'ok_all_xml=.true.' >> config.def
886
887            #activer les sorties pour Cosp
888            if [[ "$cosp" = "v1" ]]; then
889                sed -i'' -e 's@enabled=".FALSE."@enabled=".TRUE."@' \
890                         -e 's@output_level="_AUTO_"@output_level="5"@' \
891                         -e 's@compression_level="2"@compression_level="0"@' \
892                         file_def_histdayCOSP_lmdz.xml
[4405]893            fi
[5361]894            if [[ "$cosp" = "v2" ]]; then
895                sed -i'' -e 's@compression_level="2"@compression_level="0"@' file_def_histdayCOSPv2_lmdz.xml
896                for type_ in hf day mth; do
897                    file=file_def_hist${type_}COSP
898                    sed -i'' -e 's@src="./'${file}'_lmdz.xml"@src="./'${file}'v2_lmdz.xml"@' context_lmdz.xml
899                done
900                sed -i'' -e 's@field_def_cosp1.xml@field_def_cospv2.xml@' field_def_lmdz.xml
901            fi
[4210]902
[5361]903            cd ..
[4405]904        fi
[5361]905
906        # Cas Bench avec ecrad
907        if [[ $rad = "ecrad" ]]; then
908            cd "BENCH${grid_resolution}"
909            cp  ../DefLists/namelist_ecrad .
910            cp -r ../libf/phylmd/ecrad/data .
911            cd ..
[4405]912        fi
[4210]913
[5361]914        # Adjusting bench physiq.def to radiative code chosen
915        cd "BENCH${grid_resolution}"
916        sed -e 's/iflag_rrtm=.*.$/iflag_rrtm='$iflag_rrtm'/' \
917            -e 's/NSW=.*.$/NSW='$NSW'/' physiq.def > tmpdef
918        \mv tmpdef physiq.def
[4405]919        cd ..
[4210]920
[5361]921        cp "$exe_name" "BENCH${grid_resolution}/gcm.e"
922        cd "BENCH${grid_resolution}"
[4210]923
[5361]924        if [[ ${parallel:0:3} = "mpi" ]]; then
925            # Lancement avec deux procs mpi et 2 openMP
926            echo "export OMP_STACKSIZE=800M" > bench.sh
927            if [[ "${parallel:4:3}" = "omp" ]]; then
928                echo "export OMP_NUM_THREADS=2" >> bench.sh
929            fi
930            if [[ $cosp = "v1" || $cosp = "v2" ]]; then
931                echo "ulimit -s 200000" >> bench.sh
[4215]932            else
[5361]933                echo "ulimit -s unlimited" >> bench.sh
934            fi
[5398]935            if [[ $(which "mpirun") != "" ]]; then
[5361]936                echo "mpirun -np 2 gcm.e &> listing" >> bench.sh
937            elif grep -q "Adastra" /etc/motd; then
938                local account
939                account=$(/usr/sbin/my_project.py -l 2>&1 | head -1 | cut -d " " -f 3- | cut -c 5-)
940                bench_cmd="srun --nodes=1 --ntasks=1 --cpus-per-task=2 --threads-per-core=2 --time=0:10:00 --constraint=GENOA --account=$account bash bench.sh"
941                echo "./gcm.e &> listing" >> bench.sh
942            else
943                echo "Error: No command found to run parallel bench"; exit 1
944            fi
945            if [[ $(hostname | cut -c -6) = "spirit" ]]; then  # ulimit unlimited segfaults on Spirit
946                sed -i'' "s/ulimit -s unlimited/ulimit -Ss 8000/" bench.sh
947            fi
948            # Add rebuild, using reb.sh if it is there
949            cat <<EOF >> bench.sh
950if [[ -f reb.sh ]]; then
951  ./reb.sh histday; ./reb.sh histmth; ./reb.sh histhf;
952  ./reb.sh histins; ./reb.sh stomate_history;
953  ./reb.sh sechiba_history; ./reb.sh sechiba_out_2
954fi
955EOF
[4405]956        else
[5361]957            echo "./gcm.e &> listing" > bench.sh
[4405]958        fi
[5361]959        chmod +x bench.sh
960        # Getting orchidee stuff
961        if [[ $veget = 'CMIP6' || $veget = "orch2.0" ]]; then  # TODO once we have a 2.2 bench, add it here (or in planned separate bench script)
962            echo 'myget 3DBenchs/BENCHCMIP6.tar.gz'
963            myget 3DBenchs/BENCHCMIP6.tar.gz
964            tar xvzf BENCHCMIP6.tar.gz
965            sed -e "s:VEGET=n:VEGET=y:" config.def > tmp
966            mv -f tmp config.def
967            if [[ $with_xios = 1 ]]; then
968                cp ../../ORCHIDEE/src_xml/context_orchidee.xml .
969                echo '<context id="orchidee" src="./context_orchidee.xml"/>' > add.tmp
970                cp ../../ORCHIDEE/src_xml/field_def_orchidee.xml .
971                cp ../../ORCHIDEE/src_xml/file_def_orchidee.xml .
972                cp ../../ORCHIDEE/src_xml/file_def_input_orchidee.xml .
973                if [[ -f ../../ORCHIDEE/src_xml/context_input_orchidee.xml ]]; then
974                       cp ../../ORCHIDEE/src_xml/context_input_orchidee.xml .
975                       echo '<context id="orchidee" src="./context_input_orchidee.xml"/>' >> add.tmp
976                fi
977                sed -e '/id="LMDZ"/r add.tmp' iodef.xml > tmp
978                mv tmp iodef.xml
979                sed -e'{/sechiba1/ s/enabled="_AUTO_"/type="one_file" enabled=".TRUE."/}' \
980                    file_def_orchidee.xml > tmp
981                \mv -f tmp file_def_orchidee.xml
982                sed -e 's@enabled="_AUTO_"@type="one_file" enabled=".FALSE."@' \
983                    file_def_orchidee.xml > tmp
984                \mv -f tmp file_def_orchidee.xml
985                sed -e 's@output_level="_AUTO_"@output_level="1"@' \
986                    file_def_orchidee.xml > tmp
987                \mv -f tmp file_def_orchidee.xml
988                sed -e 's@output_freq="_AUTO_"@output_freq="1d"@' \
989                    file_def_orchidee.xml > tmp
990                \mv -f tmp file_def_orchidee.xml
991                sed -e 's@compression_level="4"@compression_level="0"@' \
992                    file_def_orchidee.xml > tmp
993                \mv -f tmp file_def_orchidee.xml
994                sed -e 's@XIOS_ORCHIDEE_OK = n@XIOS_ORCHIDEE_OK = y@' \
995                    orchidee.def > tmp
996                \mv -f tmp orchidee.def
[4215]997            fi
[4405]998        fi
[4220]999
[5361]1000        fi
[4220]1001
[5361]1002        if [[ -f ../arch.env ]]; then source ../arch.env; fi
[4210]1003
[5361]1004        echo "STARTING BENCH"
1005        date
1006        if (! $bench_cmd &> out.bench) || ! (tail -n 1 listing | grep "Everything is cool"); then
1007            tail listing
1008            echo "Bench FAILED, exiting"; exit 1
1009        fi
1010        date
1011        tail listing
1012    fi
[4210]1013
[5361]1014    # 1D case
1015    if [[ $SCM = 1 ]]; then
1016        cd "$MODEL"
1017        myget 1D/1D.tar.gz
1018        tar xf 1D.tar.gz
1019        cd 1D
1020        for e in "fcm" "env" "path"; do
1021          cp "$MODEL/modipsl/modeles/LMDZ/arch/arch-$arch.$e" "$MODEL/modipsl/modeles/LMDZ/arch/arch-local.$e"
1022        done
1023        if [[ $rad = "oldrad" ]]; then
1024            sed -i'' -e 's/^rad=.*$/rad=oldrad/' run.sh
1025            sed -i'' -e 's/^rad=.*$/rad=oldrad/' bin/compile
1026        elif [[ $rad = ecrad ]] ; then
1027                        sed -i'' -e 's/^rad=.*$/rad=ecrad/' run.sh
1028                        sed -i'' -e 's/^rad=.*$/rad=ecrad/' bin/compile
1029                    fi
[5399]1030        sed -i -e "s:^fcm=0:fcm=1:" bin/compile
[5361]1031        echo "Running 1D/run.sh, log in $(pwd)/run1d.log"
1032        ./run.sh &> "$(pwd)/run1d.log"
[4215]1033    fi
[5361]1034}
[4210]1035
[5361]1036function run_bench_icosa {
1037    local bench_cmd="./bench.sh"
[4210]1038
[5361]1039    if [[ $icolmdz = 1 ]]; then
1040      cd "$MODEL/modipsl/modeles/ICOSA_LMDZ"
1041      if [[ $bench = 1 ]]; then
1042        namebench="bench_icolmdz_nbp10_79"
1043        rm -rf $namebench
1044        myget "3DBenchs/$namebench.tar.gz"
1045        mkdir -p $namebench
1046        tar xf "$namebench.tar.gz" -C "$namebench" --strip-components=1
1047        cd $namebench
1048        # copy executables
1049        if [[ ! -x ../bin/icosa_lmdz.exe ]]; then
1050          echo "STOP in icosa_lmdz bench, icosa_lmdz.exe executable not present"; exit 1
1051        fi
1052        cp ../bin/icosa_lmdz.exe .
1053         if [[ ! -x ../../XIOS/bin/xios_server.exe ]]; then
1054          echo "STOP in icosa_lmdz bench, XIOS executable not present"; exit 1
1055        fi
1056        cp ../../XIOS/bin/xios_server.exe .
1057        echo "STARTING ICOSA_LMDZ BENCH"
1058        date
1059        if (! $bench_cmd &> out.bench) || ! ( grep "Time elapsed" listing); then
1060            tail listing
1061            echo "ICOSA_LMDZ bench FAILED, exiting"; exit 1
1062        fi
1063        date
1064        echo "ICOSA_LMDZ bench finished"
1065      fi
1066    fi
[4210]1067
[5361]1068}
1069# If sourced: returns, else run setup
1070if [[ ! "${BASH_SOURCE[0]}" = "$0" ]]; then return 0; fi
[4210]1071
[5361]1072echo "install_lmdz.sh DEBUT $(date)"
[4210]1073
[5386]1074function wrapper_run_all() {
[5398]1075    # This is a wrapper to catch any "unexpected" error due to set -e and avoid abrupt stoppage which may confuse the user
[5386]1076    set_default_params
1077    read_cmdline_args "$@"
1078    ensure_correct_option_combinations
1079    download_modipsl_tar
1080    get_lmdz_version
1081    get_dynamico_icosa_version
1082    get_orchidee_version
1083    init_arch
1084    check_available_software
1085    check_compiler
1086    install_netcdf
1087    install_IOIPSL
1088    install_XIOS
1089    compile_orchidee
1090    compile_lmdz
1091    compile_icolmdzor
1092    run_bench
1093    run_bench_icosa
1094}
1095
1096set +e; (set -e && wrapper_run_all "$@"); err_status=$?; set -e  # workaround to make sure set -e is propagated to wrapper_run_all & check the result
1097if (($err_status)); then
1098   echo "EXIT (error)"
1099   echo "install_lmdz.sh failed"
1100   set +u
1101   if [[ $verbose != 1 ]]; then
1102       echo "Consider using the \`-verbose\` flag to see precisely where it stopped."
1103   fi
[5404]1104   exit 1
[5386]1105fi
Note: See TracBrowser for help on using the repository browser.