source: BOL/script_install/install_lmdz.sh @ 5453

Last change on this file since 5453 was 5407, checked in by abarral, 2 weeks ago

Better preservation of install path

  • Property svn:executable set to *
File size: 41.8 KB
Line 
1#!/bin/bash
2set -eu  # error on command failure, and on unset variables
3export LC_ALL=# standardize awk format
4
5###########################################################################
6# Author : Laurent Fairhead et Frédéric Hourdin
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.
21# In the present case, LMDZ, ORCHIDEE, and IOIPSL or XIOS (handling of
22# input-outputs using the NetCDF library).
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 : 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
38### Functions
39
40function myget {
41  # Get a file from LMDZ repository, make it executable if .(ba)sh
42  local url=$1
43
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
49}
50
51function do_compile_sh {
52  local component=$1
53  local command=$2
54  local log
55
56  log="$(pwd)/$component.log"
57  printf "#!/bin/bash\n%s\n" "$command" > compile.sh
58  echo "Compiling $component using $command (log: $log) $(date)"
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}
65
66function get_svn_branch {
67  local url=$1
68  local rev=$2
69  local res
70
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}
81
82function set_default_params {
83    # Valeur par défaut des parametres
84    svn_lmdz=""
85    version="20241018.trunk"
86
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"
96
97    parallel="none"
98    trusting="testing"
99    MODEL=""
100
101    with_xios=0
102    opt_makelmdz_xios=""
103
104    icolmdz=0
105    dynamico_commit="11001689"
106
107    rad="rrtm"
108
109    compile_with_fcm=1
110
111    cosp="none"
112    aerosols=0
113    strataer=0
114    inlandsis=0
115
116    make_j=8
117    clean_install=1
118    local="$(pwd)"
119
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
124
125    optim_flag="-prod"
126    arch="local"
127
128    arch="local-gfortran"
129    arch_dir=""
130
131    jobcmd=""
132    verbose=0
133}
134
135function read_cmdline_args {
136    while (($# > 0)); do
137        case $1 in
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
178        $0 [ -v version ] [ -r svn_release ]
179               [ -parallel PARA ] [ -d GRID_RESOLUTION ] [ -bench 0/1 ]
180               [-name LOCAL_MODEL_NAME] [-rad RADIATIF]
181
182        -v       "version" like 20150828.trunk, see http://www.lmd.jussieu.fr/~lmdz/Distrib/LISMOI.trunk (default <$version>)
183
184        -r       "svn_release" : either the svn release number or "last" (default <$svn_lmdz>)
185
186        -parallel parallel support: mpi, omp, mpi_omp (mpi with openMP) or none (default: <$parallel>)
187
188        -d        "grid resolution": should be among the available benchs if -bench 1 (valid values: 48x36x19, 48x36x39) (default : <$grid_resolution>)
189
190        -bench     activating the bench or not (0/1) (default: <$bench>)
191
192        -unstable  use unstable tar instead of testing
193
194        -name      name of the folder to install to (default <$MODEL>)
195
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>)
197
198        -xios      use (download and compile) the XIOS library (will compile the parallel NetCDF4-HDF5 library) (requires to also have -parallel mpi_omp)
199
200        -cosp       to run with cospv1 or cospv2 [none/v1/v2] (default <$cosp>)
201
202        -rad        radiative code: oldrad, rrtm or ecrad (default <$rad>)
203
204        -nofcm      to compile without fcm
205
206        -SCM        install 1D version automatically
207
208        -debug      compile everything in debug mode
209
210        -benchphysiq   to choose which physics.def package to use in the bench (default <$benchphysiq>)
211
212        -compilephysiq   physics to compile the model with (default <$compphysiq>)
213
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)
215
216        -spla       activate interactive aerosols
217
218        -inlandsis  activate new snow scheme
219
220        -arch       name of the arch to use (default <$arch>)
221
222        -arch_dir   where to find the arch files (default <$arch_dir>)
223
224        -make_j     number of processes to parallelize installations (default <$make_j>)
225
226        -jobcmd     command prepended to fcm compile jobs, e.g. "srun" (default <$jobcmd>)
227
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)
229
230        -icolmdz    to compile the icolmdz executable as well as the lonlat one
231
232        -verbose    to print every executed command
233
234........fin
235                  exit 0;;
236        esac
237    done
238
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
241
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
248
249    #Define veget-related suffix for gcm name
250    if [[ $veget = 'none' ]]; then
251        suff_orc=''
252    else
253        suff_orc='_orch'
254    fi
255
256
257    if [[ $parallel = "none" ]]; then
258        suff_para='_seq'
259    else
260        suff_para='_para_mem'
261    fi
262
263    if [[ $with_xios = 1 ]]; then opt_makelmdz_xios="-io xios"; fi
264
265    if [[ $aerosols = 1 ]]; then
266      opt_aer="-dust true"; suff_aer="_spla"
267    else
268      opt_aer=""; suff_aer=""
269    fi
270
271    if [[ $strataer = 1 ]]; then
272      opt_strataer="-strataer true"
273    else
274      opt_strataer=""
275    fi
276
277    if [[ $inlandsis = 1 ]]; then
278       opt_inlandsis="-inlandsis true"
279    else
280       opt_inlandsis=""
281    fi
282
283    if [[ $isotopes = 1 ]]; then
284      opt_isotopes="-isotopes true"; suff_iso="_iso"
285    else
286      opt_isotopes="" ; suff_iso=""
287    fi
288
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"
293    fi
294
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
299
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
305
306    if ! (echo "$grid_resolution" | grep -q "x"); then
307      is_1D="y"
308      fortran_file="lmdz1d"
309    fi
310
311    if [[ $verbose = 1 ]]; then set -vx; fi
312}
313
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
322
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
326    fi
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
331
332    if [[ $cosp = "v2" && $with_xios = 0 ]]; then
333        echo "Error, Cospv2 cannot run without Xios"; exit 1
334    fi
335
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
339    fi
340
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
345
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
350
351    if [[ $aerosols = 1 && $rad != "rrtm" ]]; then
352      echo "STOP: For the time being, <aerosols=spla> requires <rad=rrtm>"; exit 1
353    fi
354}
355
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
362        fi
363    done
364}
365
366function download_modipsl_tar {
367    if [[ $clean_install = 1 && -d $MODEL ]]; then
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
375
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"
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
387        echo "install_lmdz.sh wget_OK $(date)"
388
389        gunzip "modipsl.$version.tar.gz" &>> get.log
390        tar xf "modipsl.$version.tar" &>> get.log
391        rm "modipsl.$version.tar"
392    fi
393}
394
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
398
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
415
416    # check compiler
417    compiler=$(< "$default_fcm_path" grep "%COMPILER" | sed -e "s/%COMPILER\s*//")
418
419    # load env
420    if [[ -f $default_env_path ]]; then source "$default_env_path"; fi
421
422    local mpi_file  # can't be done before as it depends on sourcing the env
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
431}
432
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
447function install_arch {
448    local component=$1
449
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
452
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"
456
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
461        fi
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"
465
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"
469        fi
470    fi
471}
472
473function install_netcdf {
474    echo "Installing Netcdf"
475    local ncdf_compiler="$compiler"
476
477    if [[ $netcdf = 0 ]]; then
478        ncdfdir=$(nf-config --prefix)
479    else
480        cd "$MODEL"
481
482        # Convert non-basic compiler
483        case $compiler in
484            mpif90) ncdf_compiler=$($compiler --version | head -n 1 | cut -d " " -f -1)
485        esac
486
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
491
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
506
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"
518        fi
519
520        # Add to path
521        export PATH="$ncdfdir/bin:$PATH"
522        echo "Bin PATH" $PATH
523
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        #----------------------------------------------------------------------------
530
531        echo "install_lmdz.sh netcdf_OK $(date)"
532    fi
533
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
538    local env_msg env_msg_tail
539    env_msg_tail="# netcdf bin path auto-added by install_lmdz.sh"
540    env_msg="export PATH=\"$PATH:\$PATH\" $env_msg_tail"
541    if ! < "$default_env_path" grep -q "$env_msg_tail"; then
542      sed -i "1s@^@$env_msg\n@" "$default_env_path"
543    fi
544
545    # Test if netcdf works fine on a simple program
546    cat >test_netcdf90.f90 <<EOF
547    use netcdf
548    print *, "NetCDF library version: ", nf90_inq_libvers()
549    end
550EOF
551
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
554    else
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
562    fi
563
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
576    fi
577}
578
579function install_IOIPSL {
580    install_arch "IOIPSL"
581
582    cd "$MODEL/modipsl/modeles/IOIPSL"
583    echo "Compiling IOIPSL, the interface library with Netcdf $(date)"
584    # in case ksh is not installed on the pc
585    if [[ ! -x /bin/ksh ]]; then
586      sed -i''  -e 's/ksh/bash/' ins_m_prec
587    fi
588    do_compile_sh "IOIPSL" "$jobcmd ./makeioipsl_fcm -j $make_j -arch $arch $optim_flag"
589
590    # Link to modipsl/bin
591    cp -f bin/* ../../bin
592
593    echo "IOIPSL compiled $(date)"
594}
595
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 "##########################################################"
603
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
610
611        cd XIOS
612
613        install_arch "XIOS"
614        do_compile_sh "XIOS" "$jobcmd ./make_xios --job $make_j --arch $arch"
615    fi
616}
617
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.
630
631    esac
632
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
648
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
652    fi
653}
654
655function compile_orchidee {
656    install_arch "ORCHIDEE"
657
658    if [[ $veget != "none" ]]; then
659        cd "$MODEL/modipsl/modeles/ORCHIDEE"
660
661        local xios_orchid
662        if [[ $with_xios = 1 ]]; then
663            xios_orchid="-xios";
664        else
665            xios_orchid="-noxios"
666        fi
667
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}
674
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"
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")
688            echo "branch is $lmdzbranch"
689            cd "$MODEL/modipsl/modeles"
690            rm -rf LMD*
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
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
702    fi
703}
704
705function compile_lmdz {
706    install_arch "LMDZ"
707    cd "$LMDZPATH"
708
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
714
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
720                opt_rad="-rrtm true"
721            else
722                opt_rad="-rad rrtm"
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
729    fi
730
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"
735
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)"
741    fi
742}
743
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
750    fi
751    cd DYNAMICO
752    git checkout master && git checkout $dynamico_commit
753    cd - > /dev/null
754
755    echo "Checking ICOSA_LMDZ source version"
756    if [[ ! -d ICOSA_LMDZ ]]; then
757      svn checkout http://svn.lmd.jussieu.fr/LMDZ/ICOSA_LMDZ
758    fi
759    cd ICOSA_LMDZ
760    svn up -r 5320
761  fi
762}
763
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
768
769      # LMDZ physics package library already available in LMDZ/config/lib directory
770
771      # Compile DYNAMICO
772      cd "$MODEL/modipsl/modeles/DYNAMICO"
773
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 ..
780
781      do_compile_sh "DYNAMICO" "$jobcmd ./make_icosa $optim_flag -arch $arch -job $make_j $para_compile_opt -external_ioipsl -with_xios"
782
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
794    fi
795}
796
797function run_bench {
798    local bench_cmd="./bench.sh"
799
800    cd "$MODEL/modipsl/modeles/LMDZ"*
801
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
809
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
825
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
836
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 ..
846        else
847            echo "using standard physiq.def"
848        fi
849
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
863
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
893            fi
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
902
903            cd ..
904        fi
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 ..
912        fi
913
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
919        cd ..
920
921        cp "$exe_name" "BENCH${grid_resolution}/gcm.e"
922        cd "BENCH${grid_resolution}"
923
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
932            else
933                echo "ulimit -s unlimited" >> bench.sh
934            fi
935            if [[ $(which "mpirun") != "" ]]; then
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
956        else
957            echo "./gcm.e &> listing" > bench.sh
958        fi
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
997            fi
998        fi
999
1000        fi
1001
1002        if [[ -f ../arch.env ]]; then source ../arch.env; fi
1003
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
1013
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
1030        sed -i -e "s:^fcm=0:fcm=1:" bin/compile
1031        echo "Running 1D/run.sh, log in $(pwd)/run1d.log"
1032        ./run.sh &> "$(pwd)/run1d.log"
1033    fi
1034}
1035
1036function run_bench_icosa {
1037    local bench_cmd="./bench.sh"
1038
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
1067
1068}
1069# If sourced: returns, else run setup
1070if [[ ! "${BASH_SOURCE[0]}" = "$0" ]]; then return 0; fi
1071
1072echo "install_lmdz.sh DEBUT $(date)"
1073
1074function wrapper_run_all() {
1075    # This is a wrapper to catch any "unexpected" error due to set -e and avoid abrupt stoppage which may confuse the user
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
1104   exit 1
1105fi
Note: See TracBrowser for help on using the repository browser.