source: BOL/script_install_amaury/install_lmdz.sh @ 4995

Last change on this file since 4995 was 4994, checked in by abarral, 4 months ago

add new JEANZAY arch
fix env supplied in modipsl/config
bugfix related to modipsl/config arch retrieval
fix orcbranch only computed if svn rev doesnt match current
fix orc&lmdz svn retrieval

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