source: BOL/script_install_amaury/install_lmdz.sh @ 5047

Last change on this file since 5047 was 5044, checked in by abarral, 3 months ago

move mpi detection after env sourcing

  • Property svn:executable set to *
File size: 34.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 set_default_params {
52    # Valeur par défaut des parametres
53    svn_lmdz=""
54    version="20240508.CM7"
55
56    netcdf=1
57    bench=1
58    SCM=0
59    veget="none"
60    grid_resolution="32x32x39"
61    benchphysiq=""
62    compphysiq="lmd"
63
64    parallel="none"
65    trusting="testing"
66    MODEL=""
67
68    with_xios=0
69    opt_makelmdz_xios=""
70
71    rad="rrtm"
72
73    compile_with_fcm=1
74
75    cosp="none"
76    aerosols=0
77    inlandsis=0
78
79    make_j=8
80    clean_install=1
81
82    # Check if on a Mac /!\ Probably doesn't work anymore, to fix one day...
83    if [[ $(uname) = "Darwin" ]]; then
84        export MAKE="make"
85    fi
86
87    optim_debug=""
88    arch="local"
89
90    arch="local-gfortran"
91    arch_dir=""
92
93    jobcmd=""
94}
95
96function read_cmdline_args {
97    while (($# > 0)); do
98        case $1 in
99            "-h") cat <<........fin
100        $0 [ -v version ] [ -r svn_release ]
101               [ -parallel PARA ] [ -d GRID_RESOLUTION ] [ -bench 0/1 ]
102               [-name LOCAL_MODEL_NAME] [-rad RADIATIF]
103
104        -v       "version" like 20150828.trunk, see http://www.lmd.jussieu.fr/~lmdz/Distrib/LISMOI.trunk (default <$version>)
105
106        -r       "svn_release" : either the svn release number or "last" (default <$svn_lmdz>)
107
108        -parallel parallel support: mpi, omp, mpi_omp (mpi with openMP) or none (default: <$parallel>)
109
110        -d        "grid resolution": should be among the available benchs if -bench 1 (valid values: 48x36x19, 48x36x39) (default : <$grid_resolution>)
111
112        -bench     activating the bench or not (0/1) (default: <$bench>)
113
114        -unstable  use unstable tar instead of testing
115
116        -name      name of the folder to install to (default <$MODEL>)
117
118        -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>)
119
120        -xios      use (download and compile) the XIOS library (will compile the parallel NetCDF4-HDF5 library) (requires to also have -parallel mpi_omp)
121
122        -cosp       to run with cospv1 or cospv2 [none/v1/v2] (default <$cosp>)
123
124        -rad        radiative code: oldrad, rrtm or ecrad (default <$rad>)
125
126        -nofcm      to compile without fcm
127
128        -SCM        install 1D version automatically
129
130        -debug      compile everything in debug mode
131
132        -benchphysiq   to choose which physics.def package to use in the bench (default <$benchphysiq>)
133
134        -compilephysiq   physics to compile the model with (default <$compphysiq>)
135
136        -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)
137
138        -spla       activate interactive aerosols
139
140        -inlandsis  activate new snow scheme
141
142        -arch       name of the arch to use (default <$arch>)
143
144        -arch_dir   where to find the arch files (default <$arch_dir>)
145
146        -make_j     number of processes to parallelize installations (default <$make_j>)
147
148        -jobcmd     command prepended to fcm compile jobs, e.g. "srun" (default <$jobcmd>)
149
150        -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)
151
152........fin
153                  exit 1;;
154            "-v") version=$2; shift; shift;;
155            "-r") svn_lmdz=$2; shift; shift;;
156            "-d") grid_resolution=$2; shift; shift;;
157            "-unstable") trusting="unstable"; shift;;
158            "-cosp") cosp=$2
159                     case $cosp in
160                         "none"|"v1"|"v2") cosp=$2; shift; shift;;
161                         *) echo "Only none v1 v2 for cosp option"; exit 1
162                     esac;;
163            "-nofcm") compile_with_fcm=0; echo "This option will be reactivated soon (promesse du 8dec2022)"; exit 1;  shift;;
164            "-SCM") SCM=1; shift;;
165            "-rad") rad=$2
166                    case $rad in
167                        "oldrad"|"rrtm"|"ecrad") rad=$2; shift; shift;;
168                        *) echo "Only oldrad rrtm ecrad for rad option"; exit 1
169                    esac;;
170            "-parallel") parallel=$2
171                         case $parallel in
172                             "none"|"mpi"|"omp"|"mpi_omp") parallel=$2; shift; shift;;
173                             *) echo "Only none mpi omp mpi_omp for the parallel option"; exit 1
174                         esac;;
175            "-bench") bench=$2; shift; shift;;
176            "-debug") optim_debug=-debug; shift;;
177            "-name") MODEL=$2; shift; shift;;
178            "-netcdf") netcdf=$2; shift; shift;;
179            "-benchphysiq") benchphysiq=$2; shift; shift;;
180            "-compilephysiq") compphysiq=$2; shift; shift;;
181            "-xios") with_xios=1; shift;;
182            "-arch") arch=$2; shift; shift;;
183            "-arch_dir") arch_dir=$2; shift; shift;;
184            "-veget") veget=$2; shift; shift;;
185            "-spla") aerosols=1; shift;;
186            "-inlandsis") inlandsis=1; shift;;
187            "-make_j") make_j=$2; shift; shift;;
188            "-jobcmd") jobcmd=$2; shift; shift;;
189            "-noclean") clean_install=0; shift;;
190            *)  bash install_lmdz.sh -h; exit 1
191        esac
192    done
193
194    # Isotopes : Compile and run with isotopes if lmdz_phys="lmdiso" in main.sh
195    if [[ $compphysiq = "lmdiso" ]]; then isotopes=1; else isotopes=0; fi
196
197    # Option de compilation pour Cosp
198    case $cosp in
199        v1) opt_cosp="-cosp true";;
200        v2) opt_cosp="-cospv2 true";;
201        *) opt_cosp=""
202    esac
203
204    #Define veget-related suffix for gcm name
205    if [[ $veget = 'none' ]]; then
206        suff_orc=''
207    else
208        suff_orc='_orch'
209    fi
210
211
212    if [[ $parallel = "none" ]]; then
213        suff_para='_seq'
214    else
215        suff_para='_para_mem'
216    fi
217
218    if [[ $with_xios = 1 ]]; then opt_makelmdz_xios="-io xios"; fi
219
220    if [[ $aerosols = 1 ]]; then
221      opt_aer="-dust true"; suff_aer="_spla"
222    else
223      opt_aer=""; suff_aer=""
224    fi
225
226    if [[ $inlandsis = 1 ]]; then
227       opt_inlandsis="-inlandsis true"
228    else
229       opt_inlandsis=""
230    fi
231
232    if [[ $isotopes = 1 ]]; then
233      opt_isotopes="-isotopes true"; suff_iso="_iso"
234    else
235      opt_isotopes="" ; suff_iso=""
236    fi
237
238
239    # Name of the model's folder. The convention taken here is that models that requires different compilation sources should have a different names.
240    local xios_name=""
241    if [[ $with_xios = 1 ]]; then xios_name="XIOS"; fi
242    if [[ $MODEL = "" ]]; then MODEL="./LMDZ$version${svn_lmdz}OR$veget$xios_name"; fi
243
244    if [[ $arch_dir = "" ]]; then
245      arch_dir="$MODEL/modipsl/config/IPSLCM7/ARCH/";
246    elif ! readlink -fe "$arch_dir"; then
247      echo "STOP: no arch dir <$arch_dir>"; exit 1
248    fi
249}
250
251function ensure_correct_option_combinations {
252    # Check on veget version
253    if [[ $veget != 'none' && $veget != "CMIP6" && $veget != "orch2.0" && $veget != "orch2.2" ]]; then
254        re='^[0-9]+$'
255        if ! [[ $veget =~ $re ]]; then
256            echo 'Valeur de l option veget non valable'; exit 1
257        fi
258    fi
259
260    ## if also compiling XIOS, parallel must be mpi_omp
261    if [[ $with_xios = 1 && $parallel != "mpi_omp" ]]; then
262        echo "Error, you must set -parallel mpi_omp if you want XIOS"; exit 1
263    fi
264
265    if [[ $cosp = "v2" && $with_xios = 0 ]]; then
266        echo "Error, Cospv2 cannot run without Xios"; exit 1
267    fi
268
269    # STOP if trying to use both ORCHIDEE and Isotopes :
270    if [[ $isotopes = 1 && $veget != "none" ]]; then
271      echo "STOP: You cannot run LMDZ with ORCHIDEE and ISOtopes at the same time"; exit 1
272    fi
273
274    # STOP if trying to use both SPLA and Isotopes :
275    if [[ $isotopes = 1 && $aerosols = 1 ]]; then
276      echo "STOP: You cannot run LMDZ with Isotopes and aerosols=spla at the same time"; exit 1
277    fi
278
279    # (Temporary) STOP if trying to use Isotopes with XIOS :
280    # TODO Amaury: check if still relevant
281    if [[ $isotopes = 1 && $with_xios = 1 ]]; then
282      echo "STOP: Isotopes cannont yet be run with XIOS"; exit 1
283    fi
284
285    if [[ $aerosols = 1 && $rad != "rrtm" ]]; then
286      echo "STOP: For the time being, <aerosols=spla> requires <rad=rrtm>"; exit 1
287    fi
288    # TODO: vérifier quelles contraintes sont des contraintes lmdzsetup, et lesquelles sont des vraies contraintes
289}
290
291function check_available_software {
292    echo "################################################################"
293    echo "Check if required software is available"
294    echo "################################################################"
295    for logiciel in wget tar gzip make gcc cmake m4 c++; do
296        if [[ $(which "$logiciel") = "" ]]; then
297            echo "You must first install $logiciel on your system"; exit 1
298        fi
299    done
300
301    cat <<eod > tt.f90
302print*,'coucou'
303end
304eod
305    $compiler tt.f90 || a.out
306    ./a.out >| tt
307    if [[ $(< tt sed -e 's/ //g' ) != "coucou" ]]; then
308        echo "problem installing with compiler $compiler"; exit 1
309    fi
310    \rm tt a.out tt.f90
311}
312
313function download_model {
314    if [[ $clean_install = 1 ]]; then rm -rf "$MODEL"; fi
315
316    mkdir -p "$MODEL"
317    MODEL=$(readlink -e -f "$MODEL"); echo "$MODEL"  # absolute path
318    if [[ ! -d "$MODEL/modipsl" ]]; then
319        echo "##########################################################"
320        echo "Download a slightly modified version of LMDZ"
321        echo "##########################################################"
322        cd "$MODEL"
323        getlog="$(pwd)/get.log"
324        echo "logfile : $getlog"
325        myget "src_archives/$trusting/modipsl.$version.tar.gz" &>> get.log
326        echo "install_lmdz.sh wget_OK $(date)"
327        gunzip "modipsl.$version.tar.gz" &>> get.log
328        tar xf "modipsl.$version.tar" &>> get.log
329        \rm "modipsl.$version.tar"
330        cd - &> /dev/null
331    fi
332}
333
334function init_arch {
335    set +e; arch_dir=$(readlink -f "$arch_dir"); set -e  # full path. readlink must be called *after* the path is created
336
337    # Check where default fcm, path, env are located - by default in $arch_path, instead in $MODEL/modipsl/modeles/LMDZ/arch/
338    local i fcm_path path_path env_path
339    for i in "path" "fcm" "env"; do
340      local varname=${i}_path
341      if [[ -f $arch_dir/arch-$arch.$i ]]; then
342          declare $varname="$arch_dir/arch-$arch.$i"
343      else
344          declare $varname="$MODEL/modipsl/modeles/LMDZ/arch/arch-$arch.$i"
345          if [[ ! -f ${!varname} ]]; then
346              echo "STOP: no ${!varname}"; exit 1
347          fi
348      fi
349    done
350    default_fcm_path=$fcm_path
351    default_path_path=$path_path
352    default_env_path=$env_path
353
354    # check compiler
355    compiler=$(< "$default_fcm_path" grep "%COMPILER" | sed -e "s/%COMPILER\s*//")
356
357    # load env
358    # shellcheck disable=SC1090
359    if [[ -f $default_env_path ]]; then source "$default_env_path"; fi
360
361    local mpi_file  # can't be done before as it depends on sourcing the env
362    mpi_file=$(readlink -e -f "$(which mpif90)")
363    path_mpi=$(dirname "$mpi_file")
364    root_mpi=$(dirname "$path_mpi")
365}
366
367function install_arch {
368    local component=$1
369
370    # Use same .env for all components (for module compatibility)
371    cp -f "$default_env_path" "$MODEL/modipsl/modeles/$component/arch" &> /dev/null || true  # allow failure if we're copying the file to itself
372
373    # Use local .path and .fcm is available, otherwise default
374    if [[ ! -f "$MODEL/modipsl/modeles/$component/arch/arch-$arch.path" ]]; then
375        cp -f "$default_path_path" "$MODEL/modipsl/modeles/$component/arch"
376
377        if [[ $component = "ORCHIDEE" ]]; then
378            if [[ $orcbranch = "/tags/ORCHIDEE_2_0/ORCHIDEE" ]]; then  # 2.0 and before have a different fcm convention
379                sed -i'' -e "s/-I//" -e "s/-L//" "$MODEL/modipsl/modeles/ORCHIDEE/arch/arch-$arch.path"  # /!\ we only replace first occurence on purpose
380            fi
381        fi
382    fi
383    if [[ ! -f "$MODEL/modipsl/modeles/$component/arch/arch-$arch.fcm" ]]; then
384        cp -f "$default_fcm_path"  "$MODEL/modipsl/modeles/$component/arch"
385
386        if [[ $component = "XIOS" ]]; then
387            # Adapt for XIOS, which uses different naming conventions
388            sed -i'' -e "s/%COMPILER/%FCOMPILER/" -e "s/%LINK/%LINKER/" -e "s/-fdefault-real-8//" "$MODEL/modipsl/modeles/XIOS/arch/arch-$arch.fcm"
389        fi
390    fi
391}
392
393function install_netcdf {
394    echo "Installing Netcdf"
395    local ncdf_compiler="$compiler"
396
397    if [[ $netcdf = 0 ]]; then
398        ncdfdir=$(nf-config --prefix)
399    else
400        cd "$MODEL"
401
402        # Convert non-basic compiler
403        case $compiler in
404            mpif90) ncdf_compiler=$($compiler --version | head -n 1 | cut -d " " -f -1)
405        esac
406
407        case $ncdf_compiler in
408            gfortran | GNU) ncdf_compiler="gfortran"; opt1="-compiler gnu"; opt2="-CC gcc -FC gfortran -CXX g++";;
409            *)      echo "unexpected compiler $ncdf_compiler for netcdf"; exit 1
410        esac
411
412        case $with_xios in
413            0) script_install_netcdf="install_netcdf4_hdf5_seq.bash"
414               ncdfdir="netcdf4_hdf5_seq"
415               opt_="$opt1";;
416            1) script_install_netcdf="install_netcdf4_hdf5.bash"
417               ncdfdir="netcdf4_hdf5"
418               opt_="$opt2 -MPI $root_mpi";;
419            *) echo "with_xios=$with_xios, should be 0 or 1"; exit 1
420        esac
421        if [[ $netcdf = 1 ]]; then
422           ncdfdir="$MODEL/$ncdfdir"
423        else
424           mkdir -p "$netcdf"; ncdfdir="$netcdf/$ncdfdir"
425        fi
426
427        echo "Repertoire netcdf $ncdfdir"
428        if [[ ! -d $ncdfdir ]]; then
429            netcdflog=$(pwd)/netcdf.log
430            echo "----------------------------------------------------------"
431            echo "Compiling the Netcdf library"
432            echo "----------------------------------------------------------"
433            echo "log file : $netcdflog"
434            myget script_install/$script_install_netcdf &>> "$netcdflog"
435            chmod u=rwx $script_install_netcdf
436            # shellcheck disable=SC2086
437            ./$script_install_netcdf -prefix "$ncdfdir" $opt_ &>> "$netcdflog"
438        fi
439
440        # Add to path
441        export PATH="$ncdfdir/bin:$PATH"
442
443        #----------------------------------------------------------------------------
444        # LF rajout d'une verrue, pour une raison non encore expliquee,
445        # la librairie est parfois rangée dans lib64 et non dans lib
446        # par certains compilateurs
447        if [[ ! -e lib && -d lib64 ]]; then ln -s lib64 lib; fi
448        #----------------------------------------------------------------------------
449
450        echo "install_lmdz.sh netcdf_OK $(date)"
451    fi
452
453    cat >test_netcdf90.f90 <<EOF
454    use netcdf
455    print *, "NetCDF library version: ", nf90_inq_libvers()
456    end
457EOF
458
459    if $ncdf_compiler -I"$ncdfdir"/include test_netcdf90.f90 -L"$ncdfdir"/lib -lnetcdff -lnetcdf -Wl,-rpath="$ncdfdir"/lib && ./a.out; then
460        \rm test_netcdf90.f90 a.out
461    else
462        cat <<EOF
463Failed test program using NetCDF-Fortran. You can:
464- check that you have NetCDF-Fortran installed in your system
465- or specify an installation directory with option -netcdf of install_lmdz.sh
466- or download and compile NetCDF-Fortran with option -netcdf 1 of install_lmdz.sh
467EOF
468        exit 1
469    fi
470
471    # Compile NetCDF95
472    cd "$MODEL/modipsl/modeles/LMD"*
473    echo "Installing NetCDF95"
474    cd "$MODEL"
475    if [[ ! -d "NetCDF95-0.3" ]]; then
476        myget src_archives/netcdf/NetCDF95-0.3.tar.gz
477        tar -xf NetCDF95-0.3.tar.gz
478        rm NetCDF95-0.3.tar.gz
479        cd NetCDF95-0.3
480        mkdir -p build && cd build
481        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"
482        make install
483    fi
484}
485
486function install_IOIPSL {
487    install_arch "IOIPSL"
488
489    cd "$MODEL/modipsl/modeles/IOIPSL"
490    ioipsllog="$(pwd)/ioipsl.log"
491    echo "Compiling IOIPSL, the interface library with Netcdf $(date) (log: $ioipsllog)"
492
493    echo "$jobcmd ./makeioipsl_fcm -j $make_j -arch $arch" > compile.sh
494    chmod +x compile.sh
495    echo "Compiling IOIPSL using $(\cat compile.sh)"
496    if ! ./compile.sh &> "$ioipsllog"; then
497        echo "STOP: IOIPSL compile failed, exiting"; exit 1
498    fi
499
500    # Link to modipsl/bin
501    cp -f bin/* ../../bin
502
503    echo "IOIPSL compiled $(date)"
504}
505
506function install_XIOS {
507    if [[ $with_xios = 1 ]]; then
508        cd "$MODEL/modipsl/modeles"
509        xioslog="$(pwd)/XIOS/xios.log"
510        echo "##########################################################"
511        echo "Compiling XIOS (log $xioslog) $(date)"
512        echo "##########################################################"
513
514        # Download XIOS
515        local xios_http="http://forge.ipsl.fr/ioserver/svn/XIOS2/branches/xios-2.6"
516        local xios_rev="2568"
517       
518        cd "$MODEL/modipsl/modeles"
519        set +e; svn co -r $xios_rev $xios_http XIOS; set -e
520
521        cd XIOS
522
523        install_arch "XIOS"
524
525        echo "$jobcmd ./make_xios --job $make_j --arch $arch" > compile.sh
526        chmod +x compile.sh
527        echo "$(date) Compiling XIOS using $(\cat compile.sh) (log in $xioslog)"
528        if ! ./compile.sh &> "$xioslog"; then
529            echo "STOP: XIOS compilation failed, exiting"; exit 1
530        fi
531
532        echo "Compiled XIOS $(date)"
533    fi
534}
535
536function get_orchidee_version {  # Set / Check ORCHIDEE version
537    local fetch_rev=""
538    orcbranch=""
539    case $veget in
540        "none") fcm_veget_version="false";;
541        "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
542        "orch2.2") fcm_veget_version=orchidee2.1; orcbranch="/branches/ORCHIDEE_2_2/ORCHIDEE" ;; # the bundled version
543        *) fetch_rev=$veget; fcm_veget_version=orchidee2.1;;  # /!\ arbitary rev only works for orch>=2.1
544          # /!\ Note: for orch>=4, we should be using fcm_vegt_version="orchideetrunk". Below copied comment by Adriana in LMDZ_Setup docs:
545#          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
546#Si on voudrait activer landice_opt=2 , il faut compiler avec -v orchideetrunk.
547
548    esac
549
550    if [[ -n $fetch_rev ]]; then
551        local curr_rev
552        curr_rev=$(svn info "$MODEL/modipsl/modeles/ORCHIDEE" | grep Revision: | cut -d ":" -f 2 | cut -c 2-)
553        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}')
554        if [[ $fetch_rev != "$curr_rev" ]]; then
555            echo "Fetching orch $fetch_rev from the repository (curr: $curr_rev)"
556            echo "branch is $orcbranch"
557            if [[ $fetch_rev -lt 4465 ]]; then echo 'ORCHIDEE version must be >=4465, exiting'; exit 1; fi
558            echo "IF YOU INSTALL ORCHIDEE THE VERY FIRST TIME, ASK for PASSWORD at orchidee-help@listes.ipsl.fr"
559            cd "$MODEL/modipsl/modeles"
560            rm -rf ORCHIDEE
561            svn co -r "$fetch_rev" "svn://forge.ipsl.fr/orchidee/$orcbranch"
562            cd - > /dev/null
563        fi
564    fi
565
566    # Check parallel LMDZ+ORCH
567    if [[ (! $veget = "none") && $parallel = "none" && ($used_lmdz_rev -lt 4894) ]]; then
568        echo "LMDZ revision must be >=4894 for orchidee without parallel support. Upgrade lmdz or use -parallel mpi_omp."; exit 1
569    fi
570}
571
572function compile_orchidee {
573    install_arch "ORCHIDEE"
574
575    if [[ $veget != "none" ]]; then
576        cd "$MODEL/modipsl/modeles/ORCHIDEE"
577
578        orchideelog="$(pwd)/orchidee.log"
579        echo "Compiling ORCHIDEE, the continental surface model (log $orchideelog) $(date)"
580
581        local xios_orchid opt_orc
582        if [[ $with_xios = 1 ]]; then
583            xios_orchid="-xios";
584        else
585            xios_orchid="-noxios"
586        fi
587        if [[ $optim_debug = "-debug" ]]; then
588            opt_orc="-debug";
589        else
590            opt_orc="-prod"
591        fi
592
593        if [[ $parallel != "none" && ! -d src_parallel ]]; then
594           echo "STOP: Orchidee version too old for parallel support"; exit 1
595        fi
596        echo "$jobcmd ./makeorchidee_fcm -j $make_j $xios_orchid $opt_orc -parallel $parallel -arch $arch" > compile.sh
597        chmod +x compile.sh
598        echo "Compiling ORCHIDEE using $(\cat compile.sh)"
599        if ! ./compile.sh &> "$orchideelog"; then
600            echo "STOP: ORCHIDEE compilation failed, exiting"; exit 1
601        fi
602        echo "Compiled ORCHIDEE $(date)"
603    fi
604}
605
606function get_lmdz_version {
607    LMDZPATH=$(readlink -e -f "$MODEL/modipsl/modeles/LMD"*)
608    cd "$LMDZPATH"
609    lmdzlog="$(pwd)/lmdz.log"
610
611    if [[ -n $svn_lmdz ]]; then
612        local curr_rev
613        curr_rev=$(svn info "$MODEL/modipsl/modeles/LMD"* | grep Revision: | cut -d ":" -f 2 | cut -c 2-)
614        if [[ $svn_lmdz != "$curr_rev" ]]; then
615            local lmdzbranch
616            echo "Fetching LMDZ $svn_lmdz from the repository"
617            lmdzbranch=$(svn log -v -q https://svn.lmd.jussieu.fr/LMDZ -r "$svn_lmdz" | grep LMDZ | head -1 | sed -e 's:trunk/.*$:trunk:' | awk '{print $2}')
618            cd "$MODEL/modipsl/modeles"
619            rm -rf LMD*
620            svn co -r "$svn_lmdz" "https://svn.lmd.jussieu.fr/LMDZ$lmdzbranch" LMDZ
621            cd - > /dev/null
622        fi
623        used_lmdz_rev=$svn_lmdz
624    else  # get svn from info
625        set +e; used_lmdz_rev=$(svn info | grep "Last Changed Rev" | cut -c 19-); set -e
626        if [[ -z $used_lmdz_rev ]]; then  # svn info failed
627            used_lmdz_rev=$(grep 'Revision: [0-9]' "$MODEL"/Read*.md | awk ' { print $2 } ' 2>/dev/null)
628            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
629        fi
630    fi
631}
632
633function compile_lmdz {
634    install_arch "LMDZ"
635    cd "$LMDZPATH"
636
637    if [[ $used_lmdz_rev -le 4185 ]]; then
638        exe_name="bin/gcm_${grid_resolution}_phy${compphysiq}_${suff_para}${suff_orc}${suff_aer}${suff_iso}.e"
639    else
640        exe_name="bin/gcm_${grid_resolution}_phy${compphysiq}_${rad}${suff_para}${suff_orc}${suff_aer}${suff_iso}.e"
641    fi
642
643    local opt_rad
644    case $rad in
645        oldrad) iflag_rrtm=0; NSW=2; opt_rad="";;
646        rrtm)   iflag_rrtm=1; NSW=6
647            if [[ $used_lmdz_rev -le 4185 ]]; then
648                opt_rad="-rrtm true"
649            else
650                opt_rad="-rad rrtm"
651            fi;;
652        ecrad)  iflag_rrtm=2; NSW=6; opt_rad="-rad ecrad";;
653        *) echo "Only oldrad rrtm ecrad for rad option"; exit 1
654    esac
655    if [[ $used_lmdz_rev -le 4185 && $rad = "ecrad" ]]; then
656        echo "ecrad only available for LMDZ rev starting with 4186 "; exit 1
657    fi
658
659    # Compile
660    makelmdz="makelmdz_fcm $optim_debug -arch $arch -j $make_j"
661    local para_compile_opt="-mem -parallel $parallel"; if [[ $parallel = "none" ]]; then para_compile_opt=""; fi
662    echo "$jobcmd ./$makelmdz $opt_rad $opt_cosp $opt_makelmdz_xios $opt_aer $opt_inlandsis $opt_isotopes -p $compphysiq -d ${grid_resolution} -v $fcm_veget_version $para_compile_opt gcm" > compile.sh
663    echo "Compiling lmdz using $(\cat compile.sh) (log: $lmdzlog) $(date)"
664    chmod +x ./compile.sh
665    if ! ./compile.sh &> "$lmdzlog"; then
666        echo "STOP: LMDZ compilation failed, exiting"; exit 1
667    fi
668    echo "Finished LMDZ compilation $(date)"
669
670    # Check executable
671    if [[ ! -f $exe_name ]]; then
672        echo "STOP: Compilation failed, can't find the executable"; exit 1
673    else
674        echo "Compilation successfull, the executable is $exe_name $(date)"
675    fi
676}
677
678function run_bench {
679    cd "$MODEL/modipsl/modeles/LMDZ"*
680
681    if [[ $bench = "tuto" ]]; then
682        myget "Training/tutorial.tar"; tar xf tutorial.tar; cd TUTORIAL
683        ./init.sh
684    elif [[ $bench = 1 ]]; then
685        \rm -rf "BENCH${grid_resolution}"
686        local bench=bench_lmdz_${grid_resolution}
687        myget "3DBenchs/$bench.tar.gz"
688        tar xf "$bench.tar.gz"
689
690        if [[ $cosp = "v1" || $cosp = "v2" ]]; then
691            cd "BENCH${grid_resolution}"
692            # copier les fichiers namelist input et output our COSP
693            cp ../DefLists/cosp*_input_nl.txt .
694            cp ../DefLists/cosp*_output_nl.txt .
695            # Activer la cles ok_cosp pour tourner avec COSP
696            sed -e 's@ok_cosp=n@ok_cosp=y@' config.def > tmp
697            \mv -f tmp config.def
698            cd ..
699        fi
700
701        if [[ -n "$benchphysiq" ]]; then
702            cd "BENCH${grid_resolution}"
703            if [[ -f "physiq.def_${benchphysiq}" ]]; then
704                cp "physiq.def_${benchphysiq}" benchphysiq.def
705                echo "using physiq.def_${benchphysiq}"
706            else
707                echo "using standard physiq.def"
708            fi
709            cd ..
710        else
711            echo "using standard physiq.def"
712        fi
713
714        if [[ $with_xios = 1 ]]; then
715            cd "BENCH${grid_resolution}"
716            cp ../DefLists/iodef.xml .
717            cp ../DefLists/context_lmdz.xml .
718            cp ../DefLists/field_def_lmdz.xml .
719            # A raffiner par la suite
720            echo "A FAIRE : Copier les *xml en fonction de l option cosp"
721            cp ../DefLists/field_def_cosp*.xml .
722            cp ../DefLists/file_def_hist*xml .
723            # adapt iodef.xml to use attached mode
724            sed -e 's@"using_server" type="bool">true@"using_server" type="bool">false@' \
725                iodef.xml > tmp
726            \mv -f tmp iodef.xml
727
728            # and convert all the enabled="_AUTO_" (for libIGCM) to enabled=.FALSE.
729            # except for histday
730            for histfile in file_def_hist*xml; do
731                if [[ "$histfile" = "file_def_histday_lmdz.xml" ]]; then
732                    sed -e 's@enabled="_AUTO_"@type="one_file" enabled=".TRUE."@' \
733                        "$histfile" > tmp
734                    \mv -f tmp "$histfile"
735                    sed -e 's@output_level="_AUTO_"@output_level="5"@' "$histfile" \
736                        > tmp
737                    \mv -f tmp "$histfile"
738                    sed -e 's@compression_level="2"@compression_level="0"@' \
739                        "$histfile" > tmp
740                    \mv -f tmp "$histfile"
741                else
742                    sed -e 's@enabled="_AUTO_"@type="one_file" enabled=".FALSE."@' \
743                        "$histfile" > tmp
744                    \mv -f tmp "$histfile"
745                fi
746            done
747            # and add option "ok_all_xml=y" in config.def
748            echo "### XIOS outputs" >> config.def
749            echo 'ok_all_xml=.true.' >> config.def
750
751            #activer les sorties pour Cosp
752            if [[ "$cosp" = "v1" ]]; then
753                sed -i'' -e 's@enabled=".FALSE."@enabled=".TRUE."@' \
754                         -e 's@output_level="_AUTO_"@output_level="5"@' \
755                         -e 's@compression_level="2"@compression_level="0"@' \
756                         file_def_histdayCOSP_lmdz.xml
757            fi
758            if [[ "$cosp" = "v2" ]]; then
759                sed -i'' -e 's@compression_level="2"@compression_level="0"@' file_def_histdayCOSPv2_lmdz.xml
760                for type_ in hf day mth; do
761                    file=file_def_hist${type_}COSP
762                    sed -i'' -e 's@src="./'${file}'_lmdz.xml"@src="./'${file}'v2_lmdz.xml"@' context_lmdz.xml
763                done
764                sed -i'' -e 's@field_def_cosp1.xml@field_def_cospv2.xml@' field_def_lmdz.xml
765            fi
766
767            cd ..
768        fi
769
770        # Cas Bench avec ecrad
771        if [[ $rad = "ecrad" ]]; then
772            cd "BENCH${grid_resolution}"
773            cp  ../DefLists/namelist_ecrad .
774            cp -r ../libf/phylmd/ecrad/data .
775            cd ..
776        fi
777
778        # Adjusting bench physiq.def to radiative code chosen
779        cd "BENCH${grid_resolution}"
780        sed -e 's/iflag_rrtm=.*.$/iflag_rrtm='$iflag_rrtm'/' \
781            -e 's/NSW=.*.$/NSW='$NSW'/' physiq.def > tmpdef
782        \mv tmpdef physiq.def
783        cd ..
784
785        cp "$exe_name" "BENCH${grid_resolution}/gcm.e"
786        cd "BENCH${grid_resolution}"
787
788        local bench_cmd="./bench.sh"
789        if [[ ${parallel:0:3} = "mpi" ]]; then
790            # Lancement avec deux procs mpi et 2 openMP
791            echo "export OMP_STACKSIZE=800M" > bench.sh
792            if [[ "${parallel:4:3}" = "omp" ]]; then
793                echo "export OMP_NUM_THREADS=2" >> bench.sh
794            fi
795            if [[ $cosp = "v1" || $cosp = "v2" ]]; then
796                echo "ulimit -s 200000" >> bench.sh
797            else
798                echo "ulimit -s unlimited" >> bench.sh
799            fi
800            if which mpirun &> /dev/null; then
801                echo "mpirun -np 2 gcm.e &> listing" >> bench.sh
802            elif grep -q "Adastra" /etc/motd; then
803                local account
804                account=$(/usr/sbin/my_project.py -l 2>&1 | head -1 | cut -d " " -f 3- | cut -c 5-)
805                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"
806                echo "./gcm.e &> listing" >> bench.sh
807            else
808                echo "Error: No command found to run parallel bench"; exit 1
809            fi
810            if [[ $(hostname | cut -c -6) = "spirit" ]]; then  # ulimit unlimited segfaults on Spirit
811                sed -i'' "s/ulimit -s unlimited/ulimit -Ss 8000/" bench.sh
812            fi
813            # Add rebuild, using reb.sh if it is there
814            cat <<EOF >> bench.sh
815if [[ -f reb.sh ]]; then
816  ./reb.sh histday; ./reb.sh histmth; ./reb.sh histhf;
817  ./reb.sh histins; ./reb.sh stomate_history;
818  ./reb.sh sechiba_history; ./reb.sh sechiba_out_2
819fi
820EOF
821        else
822            echo "./gcm.e &> listing" > bench.sh
823        fi
824        # Getting orchidee stuff
825        if [[ $veget = 'CMIP6' || $veget = "orch2.0" ]]; then  # TODO once we have a 2.2 bench, add it here (or in planned separate bench script)
826            echo 'myget 3DBenchs/BENCHCMIP6.tar.gz'
827            myget 3DBenchs/BENCHCMIP6.tar.gz
828            tar xvzf BENCHCMIP6.tar.gz
829            sed -e "s:VEGET=n:VEGET=y:" config.def > tmp
830            mv -f tmp config.def
831            if [[ $with_xios = 1 ]]; then
832                cp ../../ORCHIDEE/src_xml/context_orchidee.xml .
833                echo '<context id="orchidee" src="./context_orchidee.xml"/>' > add.tmp
834                cp ../../ORCHIDEE/src_xml/field_def_orchidee.xml .
835                cp ../../ORCHIDEE/src_xml/file_def_orchidee.xml .
836                cp ../../ORCHIDEE/src_xml/file_def_input_orchidee.xml .
837                if [[ -f ../../ORCHIDEE/src_xml/context_input_orchidee.xml ]]; then
838                       cp ../../ORCHIDEE/src_xml/context_input_orchidee.xml .
839                       echo '<context id="orchidee" src="./context_input_orchidee.xml"/>' >> add.tmp
840                fi
841                sed -e '/id="LMDZ"/r add.tmp' iodef.xml > tmp
842                mv tmp iodef.xml
843                sed -e'{/sechiba1/ s/enabled="_AUTO_"/type="one_file" enabled=".TRUE."/}' \
844                    file_def_orchidee.xml > tmp
845                \mv -f tmp file_def_orchidee.xml
846                sed -e 's@enabled="_AUTO_"@type="one_file" enabled=".FALSE."@' \
847                    file_def_orchidee.xml > tmp
848                \mv -f tmp file_def_orchidee.xml
849                sed -e 's@output_level="_AUTO_"@output_level="1"@' \
850                    file_def_orchidee.xml > tmp
851                \mv -f tmp file_def_orchidee.xml
852                sed -e 's@output_freq="_AUTO_"@output_freq="1d"@' \
853                    file_def_orchidee.xml > tmp
854                \mv -f tmp file_def_orchidee.xml
855                sed -e 's@compression_level="4"@compression_level="0"@' \
856                    file_def_orchidee.xml > tmp
857                \mv -f tmp file_def_orchidee.xml
858                sed -e 's@XIOS_ORCHIDEE_OK = n@XIOS_ORCHIDEE_OK = y@' \
859                    orchidee.def > tmp
860                \mv -f tmp orchidee.def
861            fi
862        fi
863
864        if [[ -f ../arch.env ]]; then source ../arch.env; fi
865
866        echo "EXECUTION DU BENCH"
867        date
868        if (! $bench_cmd &> out.bench) || ! (tail -n 1 listing | grep "Everything is cool"); then
869            tail listing
870            echo "Bench FAILED, exiting"; exit 1
871        fi
872        date
873        tail listing
874    fi
875
876    # 1D case
877    if [[ $SCM = 1 ]]; then
878        cd "$MODEL"
879        myget 1D/1D.tar.gz
880        tar xf 1D.tar.gz
881        cd 1D
882        if [[ $rad = "oldrad" ]]; then
883            sed -i'' -e 's/^rad=.*$/rad=oldrad/' run.sh
884            sed -i'' -e 's/^rad=.*$/rad=oldrad/' bin/compile
885        elif [[ $rad = ecrad ]] ; then
886                        sed -i'' -e 's/^rad=.*$/rad=ecrad/' run.sh
887                        sed -i'' -e 's/^rad=.*$/rad=ecrad/' bin/compile
888                    fi
889        echo "Running 1D/run.sh, log in $(pwd)/run1d.log"
890        ./run.sh &> "$(pwd)/run1d.log"
891    fi
892}
893
894# If sourced: returns, else run setup
895if [[ ! "${BASH_SOURCE[0]}" = "$0" ]]; then return 0; fi
896
897echo "install_lmdz.sh DEBUT $(date)"
898
899set_default_params
900read_cmdline_args "$@"
901ensure_correct_option_combinations
902download_model
903init_arch
904check_available_software
905get_lmdz_version
906get_orchidee_version
907install_netcdf
908install_IOIPSL
909install_XIOS
910compile_orchidee
911compile_lmdz
912run_bench
Note: See TracBrowser for help on using the repository browser.