source: BOL/script_install_amaury/install_lmdz.sh

Last change on this file was 4961, checked in by abarral, 11 days ago

add MESOIPSL-GNU arch
fix ncdf dir detection

  • Property svn:executable set to *
File size: 34.0 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 (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        cd ../../script_install
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 "Error: no arch dir $arch_dir"; exit 1
361    elif [[ ! -f $arch_dir/arch-$arch.path ]]; then
362        echo "Error: no arch-$arch.path in $arch_dir"; exit 1
363    fi
364
365    local fcm_path
366    if [[ -f $arch_dir/arch-$arch.fcm ]]; then
367        fcm_path="$arch_dir/arch-$arch.fcm"
368    else
369        fcm_path="$MODEL/modipsl/modeles/LMDZ/arch/arch-$arch.fcm"
370        if [[ ! -f $fcm_path ]]; then
371            echo "Error: no $fcm_path"; exit 1
372        fi
373    fi
374
375    # check compiler
376    compiler=$(< "$fcm_path" grep "%COMPILER" | sed -e "s/%COMPILER\s*//")
377
378    # load env
379    local env_path=${fcm_path/.fcm/.env}
380    # shellcheck disable=SC1090
381    if [[ -f $env_path ]]; then source "$env_path"; fi
382}
383
384function install_arch {
385    local component=$1
386
387    if [[ ! -f "$MODEL/modipsl/modeles/$component/arch/arch-$arch.fcm" ]]; then
388        cp -f "$arch_dir/arch-$arch."{fcm,path,env} "$MODEL/modipsl/modeles/$component/arch"
389
390        if [[ $component = "XIOS" ]]; then
391            # Adapt for XIOS, which uses different naming conventions
392            sed -i'' -e "s/%COMPILER/%FCOMPILER/" -e "s/%LINK/%LINKER/" -e "s/-fdefault-real-8//" "$MODEL/modipsl/modeles/XIOS/arch/arch-$arch.fcm"
393        elif [[ $component = "ORCHIDEE" ]]; then
394            if [[ $orcbranch = "/tags/ORCHIDEE_2_0/ORCHIDEE" ]]; then  # 2.0 and before have a different fcm convention
395                sed -i'' -e "s/-I//" -e "s/-L//" "$MODEL/modipsl/modeles/ORCHIDEE/arch/arch-$arch.path"  # /!\ we only replace first occurence on purpose
396            fi
397        fi
398    fi
399}
400
401function install_netcdf {
402    echo "Installing Netcdf"
403    local ncdf_compiler="$compiler"
404
405    if [[ $netcdf = 0 ]]; then
406        ncdfdir=$(nf-config --prefix)
407    else
408        cd "$MODEL"
409
410        # Convert non-basic compiler
411        case $compiler in
412            mpif90) ncdf_compiler=$($compiler --version | head -n 1 | cut -d " " -f -1)
413        esac
414
415        case $ncdf_compiler in
416            gfortran | GNU) ncdf_compiler="gfortran"; opt1="-compiler gnu"; opt2="-CC gcc -FC gfortran -CXX g++";;
417            *)      echo "unexpected compiler $ncdf_compiler for netcdf"; exit 1
418        esac
419
420        case $with_xios in
421            0) script_install_netcdf="install_netcdf4_hdf5_seq.bash"
422               ncdfdir="netcdf4_hdf5_seq"
423               opt_="$opt1";;
424            1) script_install_netcdf="install_netcdf4_hdf5.bash"
425               ncdfdir="netcdf4_hdf5"
426               opt_="$opt2 -MPI $root_mpi";;
427            *) echo "with_xios=$with_xios, should be 0 or 1"; exit 1
428        esac
429        if [[ $netcdf = 1 ]]; then
430           ncdfdir="$MODEL/$ncdfdir"
431        else
432           mkdir -p "$netcdf"; ncdfdir="$netcdf/$ncdfdir"
433        fi
434
435        echo "Repertoire netcdf $ncdfdir"
436        if [[ ! -d $ncdfdir ]]; then
437            netcdflog=$(pwd)/netcdf.log
438            echo "----------------------------------------------------------"
439            echo "Compiling the Netcdf library"
440            echo "----------------------------------------------------------"
441            echo "log file : $netcdflog"
442            myget script_install/$script_install_netcdf >> "$netcdflog" 2>&1
443            chmod u=rwx $script_install_netcdf
444            # shellcheck disable=SC2086
445            ./$script_install_netcdf -prefix "$ncdfdir" $opt_ >> "$netcdflog" 2>&1
446        fi
447
448        # Add to path
449        export PATH="$ncdfdir/bin:$PATH"
450
451        #----------------------------------------------------------------------------
452        # LF rajout d'une verrue, pour une raison non encore expliquee,
453        # la librairie est parfois rangée dans lib64 et non dans lib
454        # par certains compilateurs
455        if [[ ! -e lib && -d lib64 ]]; then ln -s lib64 lib; fi
456        #----------------------------------------------------------------------------
457
458        echo "install_lmdz.sh netcdf_OK $(date)"
459    fi
460
461    cat >test_netcdf90.f90 <<EOF
462    use netcdf
463    print *, "NetCDF library version: ", nf90_inq_libvers()
464    end
465EOF
466
467    if $ncdf_compiler -I"$ncdfdir"/include test_netcdf90.f90 -L"$ncdfdir"/lib -lnetcdff \
468              -lnetcdf -Wl,-rpath="$ncdfdir"/lib && ./a.out
469    then
470        \rm test_netcdf90.f90 a.out
471    else
472        cat <<EOF
473Failed test program using NetCDF-Fortran. You can:
474- check that you have NetCDF-Fortran installed in your system
475- or specify an installation directory with option -netcdf of install_lmdz.sh
476- or download and compile NetCDF-Fortran with option -netcdf 1 of nstall_lmdz.sh
477EOF
478        exit 1
479    fi
480
481    # Compile NetCDF95
482    cd "$MODEL/modipsl/modeles/LMD"*
483    echo "Installing NetCDF95"
484    cd "$MODEL"
485    if [[ ! -d "NetCDF95-0.3" ]]; then
486        myget src_archives/netcdf/NetCDF95-0.3.tar.gz
487        tar -xf NetCDF95-0.3.tar.gz
488        \rm NetCDF95-0.3.tar.gz
489        cd NetCDF95-0.3
490        mkdir -p build && cd build
491        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"
492        make install
493    fi
494}
495
496function install_IOIPSL {
497    install_arch "IOIPSL"
498
499    cd "$MODEL/modipsl/modeles/IOIPSL"
500    ioipsllog="$(pwd)/ioipsl.log"
501    echo "Compiling IOIPSL, the interface library with Netcdf $(date) (log: $ioipsllog)"
502
503    if ! ./makeioipsl_fcm -arch "$arch" -job 8 > "$ioipsllog" 2>&1; then
504        echo "IOIPSL compile failed, exiting"; exit 1
505    fi
506
507    # Link to modipsl/bin
508    cp -f bin/* ../../bin
509
510    echo "IOIPSL compiled $(date)"
511}
512
513function install_XIOS {
514    if [[ $with_xios = 1 ]]; then
515        cd "$MODEL/modipsl/modeles"
516        xioslog="$(pwd)/XIOS/xios.log"
517        echo "##########################################################"
518        echo "Compiling XIOS (log $xioslog) $(date)"
519        echo "##########################################################"
520
521        # Download XIOS
522        local xios_http="http://forge.ipsl.fr/ioserver/svn/XIOS2/branches/xios-2.6"
523        local xios_rev="2568"
524       
525        cd "$MODEL/modipsl/modeles"
526        set +e; svn co -r $xios_rev $xios_http XIOS; set -e
527
528        cd XIOS
529
530        install_arch "XIOS"
531
532        echo "Starting XIOS compilation"
533        if ! ./make_xios --arch "$arch" --job 8 > "$xioslog" 2>&1; then
534            echo "XIOS compilation failed, exiting"; exit 1
535        fi
536
537        echo "Compiled XIOS $(date)"
538    fi
539}
540
541function get_orchidee_version {  # Set / Check ORCHIDEE version
542    local fetch_rev=""
543    orcbranch=""
544    case $veget in
545        "none") fcm_veget_version="false";;
546        "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
547        "orch2.2") fcm_veget_version=orchidee2.1; orcbranch="ORCHIDEE_2_2" ;; # the bundled version
548        *) fetch_rev=$veget
549    esac
550
551    if [[ -n $fetch_rev ]]; then
552        echo "Fetching orch $fetch_rev from the repository"
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        echo "branch is $orcbranch"
555        if [[ $fetch_rev -lt 4465 ]]; then echo 'ORCHIDEE version must be >=4465, exiting'; exit 1; fi
556        echo "IF YOU INSTALL ORCHIDEE THE VERY FIRST TIME, ASK for PASSWORD at orchidee-help@listes.ipsl.fr"
557        cd "$MODEL/modipsl/modeles"
558        svn co -r "$fetch_rev" "svn://forge.ipsl.fr/orchidee/$orcbranch" || (rm -rf ORCHIDEE && svn co -r "$fetch_rev" "svn://forge.ipsl.fr/orchidee/$orcbranch")  # if orch dir exists and is from a different branch, need to delete it first (but we don't want to do this all the time, as it would require a recompile for the same code)
559        cd -
560    fi
561
562    # Check parallel LMDZ+ORCH
563    if [[ (! $veget = "none") && $parallel = "none" && ($used_lmdz_rev -lt 4894) ]]; then
564        echo "LMDZ revision must be >=4894 for orchidee without parallel support. Upgrade lmdz or use -parallel mpi_omp."; exit 1
565    fi
566}
567
568function compile_orchidee {
569    install_arch "ORCHIDEE"
570
571    if [[ $veget != "none" ]]; then
572        cd "$MODEL/modipsl/modeles/ORCHIDEE"
573
574        orchideelog="$(pwd)/orchidee.log"
575        echo "Compiling ORCHIDEE, the continental surface model (log $orchideelog) $(date)"
576
577        local xios_orchid opt_orc
578        if [[ $with_xios = 1 ]]; then
579            xios_orchid="-xios";
580        else
581            xios_orchid="-noxios"
582        fi
583        if [[ $optim_debug = "-debug" ]]; then
584            opt_orc="-debug";
585        else
586            opt_orc="-prod"
587        fi
588
589        if [[ $parallel = "none" ]]; then
590            echo "./makeorchidee_fcm $xios_orchid $opt_orc -parallel none -arch $arch -j $make_j" > compile.sh
591        else
592            if [[ ! -d src_parallel ]]; then
593               echo "Orchidee version too old for parallel support"; exit 1
594            fi
595            {
596                echo "./makeorchidee_fcm -j $make_j $xios_orchid $opt_orc -parallel $parallel -arch $arch"
597            } > compile.sh
598        fi
599        chmod +x compile.sh
600        echo "Compiling ORCHIDEE using $(\cat compile.sh)"
601        if ! ./compile.sh > "$orchideelog" 2>&1; then
602            echo "ORCHIDEE compilation failed, exiting"; exit 1
603        fi
604        echo "Compiled ORCHIDEE $(date)"
605    fi
606}
607
608function get_lmdz_version {
609    LMDZPATH=$(readlink -e -f "$MODEL/modipsl/modeles/LMD"*)
610    cd "$LMDZPATH"
611    lmdzlog="$(pwd)/lmdz.log"
612
613    used_lmdz_rev=$svn_lmdz
614    if [[ -n $svn_lmdz ]]; 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        svn co -r "$svn_lmdz" "https://svn.lmd.jussieu.fr/LMDZ$lmdzbranch" LMDZ || (rm -rf LMD* && svn co -r "$svn_lmdz" "https://svn.lmd.jussieu.fr/LMDZ$lmdzbranch" LMDZ)  # if lmdz dir exists and is from a different branch, need to delete it first (but we don't want to do this all the time, as it would require a recompile for the same code)
620        cd -
621    else  # get svn from info
622         set +e; used_lmdz_rev=$(svn info | grep "Last Changed Rev" | cut -c 19-); set -e
623         if [[ -z $used_lmdz_rev ]]; then  # svn info failed
624            used_lmdz_rev=$(grep 'Revision: [0-9]' "$MODEL"/Read*.md | awk ' { print $2 } ' 2>/dev/null)
625            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
626         fi
627    fi
628}
629
630function compile_lmdz {
631    install_arch "LMDZ"
632    cd "$LMDZPATH"
633
634    if [[ $used_lmdz_rev -le 4185 ]]; then
635        exe_name="bin/gcm_${grid_resolution}_phy${compphysiq}_${suff_para}${suff_orc}${suff_aer}${suff_iso}.e"
636    else
637        exe_name="bin/gcm_${grid_resolution}_phy${compphysiq}_${rad}${suff_para}${suff_orc}${suff_aer}${suff_iso}.e"
638    fi
639
640    local opt_rad
641    case $rad in
642        oldrad) iflag_rrtm=0; NSW=2; opt_rad="";;
643        rrtm)   iflag_rrtm=1; NSW=6
644            if [[ $used_lmdz_rev -le 4185 ]]; then
645                opt_rad="-rrtm true"
646            else
647                opt_rad="-rad rrtm"
648            fi;;
649        ecrad)  iflag_rrtm=2; NSW=6; opt_rad="-rad ecrad";;
650        *) echo "Only oldrad rrtm ecrad for rad option"; exit 1
651    esac
652    if [[ $used_lmdz_rev -le 4185 && $rad = "ecrad" ]]; then
653        echo "ecrad only available for LMDZ rev starting with 4186 "; exit 1
654    fi
655
656    # Compile
657    makelmdz="makelmdz_fcm $optim_debug -arch $arch -j $make_j"
658    local para_compile_opt="-mem -parallel $parallel"; if [[ $parallel = "none" ]]; then para_compile_opt=""; fi
659    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
660    echo "Compiling lmdz using $(\cat compile.sh) (log: $lmdzlog) $(date)"
661    chmod +x ./compile.sh
662    if ! ./compile.sh > "$lmdzlog" 2>&1; then
663        echo "LMDZ compilation failed, exiting"; exit 1
664    fi
665    echo "Finished LMDZ compilation $(date)"
666
667    # Check executable
668    if [[ ! -f $exe_name ]]; then
669        echo "Compilation failed, can't find the executable"; exit 1
670    else
671        echo "Compilation successfull, the executable is $exe_name $(date)"
672    fi
673}
674
675function run_bench {
676    cd "$MODEL/modipsl/modeles/LMDZ"*
677
678    if [[ $bench = "tuto" ]]; then
679        myget "Training/tutorial.tar"; tar xf tutorial.tar; cd TUTORIAL
680        ./init.sh
681    elif [[ $bench = 1 ]]; then
682        \rm -rf "BENCH${grid_resolution}"
683        local bench=bench_lmdz_${grid_resolution}
684        myget "3DBenchs/$bench.tar.gz"
685        tar xf "$bench.tar.gz"
686
687        if [[ $cosp = "v1" || $cosp = "v2" ]]; then
688            cd "BENCH${grid_resolution}"
689            # copier les fichiers namelist input et output our COSP
690            cp ../DefLists/cosp*_input_nl.txt .
691            cp ../DefLists/cosp*_output_nl.txt .
692            # Activer la cles ok_cosp pour tourner avec COSP
693            sed -e 's@ok_cosp=n@ok_cosp=y@' config.def > tmp
694            \mv -f tmp config.def
695            cd ..
696        fi
697
698        if [[ -n "$benchphysiq" ]]; then
699            cd "BENCH${grid_resolution}"
700            if [[ -f "physiq.def_${benchphysiq}" ]]; then
701                cp "physiq.def_${benchphysiq}" benchphysiq.def
702                echo "using physiq.def_${benchphysiq}"
703            else
704                echo "using standard physiq.def"
705            fi
706            cd ..
707        else
708            echo "using standard physiq.def"
709        fi
710
711        if [[ $with_xios = 1 ]]; then
712            cd "BENCH${grid_resolution}"
713            cp ../DefLists/iodef.xml .
714            cp ../DefLists/context_lmdz.xml .
715            cp ../DefLists/field_def_lmdz.xml .
716            # A raffiner par la suite
717            echo "A FAIRE : Copier les *xml en fonction de l option cosp"
718            cp ../DefLists/field_def_cosp*.xml .
719            cp ../DefLists/file_def_hist*xml .
720            # adapt iodef.xml to use attached mode
721            sed -e 's@"using_server" type="bool">true@"using_server" type="bool">false@' \
722                iodef.xml > tmp
723            \mv -f tmp iodef.xml
724
725            # and convert all the enabled="_AUTO_" (for libIGCM) to enabled=.FALSE.
726            # except for histday
727            for histfile in file_def_hist*xml; do
728                if [[ "$histfile" = "file_def_histday_lmdz.xml" ]]; then
729                    sed -e 's@enabled="_AUTO_"@type="one_file" enabled=".TRUE."@' \
730                        "$histfile" > tmp
731                    \mv -f tmp "$histfile"
732                    sed -e 's@output_level="_AUTO_"@output_level="5"@' "$histfile" \
733                        > tmp
734                    \mv -f tmp "$histfile"
735                    sed -e 's@compression_level="2"@compression_level="0"@' \
736                        "$histfile" > tmp
737                    \mv -f tmp "$histfile"
738                else
739                    sed -e 's@enabled="_AUTO_"@type="one_file" enabled=".FALSE."@' \
740                        "$histfile" > tmp
741                    \mv -f tmp "$histfile"
742                fi
743            done
744            # and add option "ok_all_xml=y" in config.def
745            echo "### XIOS outputs" >> config.def
746            echo 'ok_all_xml=.true.' >> config.def
747
748            #activer les sorties pour Cosp
749            if [[ "$cosp" = "v1" ]]; then
750                sed -i'' -e 's@enabled=".FALSE."@enabled=".TRUE."@' \
751                         -e 's@output_level="_AUTO_"@output_level="5"@' \
752                         -e 's@compression_level="2"@compression_level="0"@' \
753                         file_def_histdayCOSP_lmdz.xml
754            fi
755            if [[ "$cosp" = "v2" ]]; then
756                sed -i'' -e 's@compression_level="2"@compression_level="0"@' file_def_histdayCOSPv2_lmdz.xml
757                for type_ in hf day mth; do
758                    file=file_def_hist${type_}COSP
759                    sed -i'' -e 's@src="./'${file}'_lmdz.xml"@src="./'${file}'v2_lmdz.xml"@' context_lmdz.xml
760                done
761                sed -i'' -e 's@field_def_cosp1.xml@field_def_cospv2.xml@' field_def_lmdz.xml
762            fi
763
764            cd ..
765        fi
766
767        # Cas Bench avec ecrad
768        if [[ $rad = "ecrad" ]]; then
769            cd "BENCH${grid_resolution}"
770            cp  ../DefLists/namelist_ecrad .
771            cp -r ../libf/phylmd/ecrad/data .
772            cd ..
773        fi
774
775        # Adjusting bench physiq.def to radiative code chosen
776        cd "BENCH${grid_resolution}"
777        sed -e 's/iflag_rrtm=.*.$/iflag_rrtm='$iflag_rrtm'/' \
778            -e 's/NSW=.*.$/NSW='$NSW'/' physiq.def > tmpdef
779        \mv tmpdef physiq.def
780        cd ..
781
782        cp "$exe_name" "BENCH${grid_resolution}/gcm.e"
783        cd "BENCH${grid_resolution}"
784
785        local bench_cmd="./bench.sh"
786        if [[ ${parallel:0:3} = "mpi" ]]; then
787            # Lancement avec deux procs mpi et 2 openMP
788            echo "export OMP_STACKSIZE=800M" > bench.sh
789            if [[ "${parallel:4:3}" = "omp" ]]; then
790                echo "export OMP_NUM_THREADS=2" >> bench.sh
791            fi
792            if [[ $cosp = "v1" || $cosp = "v2" ]]; then
793                echo "ulimit -s 200000" >> bench.sh
794            else
795                echo "ulimit -s unlimited" >> bench.sh
796            fi
797            if which mpirun > /dev/null 2>&1; then
798                echo "mpirun -np 2 gcm.e > listing 2>&1" >> bench.sh
799            elif grep -q "Adastra" /etc/motd; then
800                local account
801                account=$(/usr/sbin/my_project.py -l 2>&1 | head -1 | cut -d " " -f 3- | cut -c 5-)
802                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"
803                echo "./gcm.e > listing 2>&1" >> bench.sh
804            else
805                echo "Error: No command found to run parallel bench"; exit 1
806            fi
807            # Add rebuild, using reb.sh if it is there
808            cat <<EOF >> bench.sh
809if [[ -f reb.sh ]]; then
810  ./reb.sh histday; ./reb.sh histmth; ./reb.sh histhf;
811  ./reb.sh histins; ./reb.sh stomate_history;
812  ./reb.sh sechiba_history; ./reb.sh sechiba_out_2
813fi
814EOF
815        else
816            echo "./gcm.e > listing 2>&1" > bench.sh
817        fi
818        # Getting orchidee stuff
819        if [[ $veget = 'CMIP6' || $veget = "orch2.0" ]]; then  # TODO once we have a 2.2 bench, add it here (or in planned separate bench script)
820            echo 'myget 3DBenchs/BENCHCMIP6.tar.gz'
821            myget 3DBenchs/BENCHCMIP6.tar.gz
822            tar xvzf BENCHCMIP6.tar.gz
823            sed -e "s:VEGET=n:VEGET=y:" config.def > tmp
824            mv -f tmp config.def
825            if [[ $with_xios = 1 ]]; then
826                cp ../../ORCHIDEE/src_xml/context_orchidee.xml .
827                echo '<context id="orchidee" src="./context_orchidee.xml"/>' > add.tmp
828                cp ../../ORCHIDEE/src_xml/field_def_orchidee.xml .
829                cp ../../ORCHIDEE/src_xml/file_def_orchidee.xml .
830                cp ../../ORCHIDEE/src_xml/file_def_input_orchidee.xml .
831                if [[ -f ../../ORCHIDEE/src_xml/context_input_orchidee.xml ]]; then
832                       cp ../../ORCHIDEE/src_xml/context_input_orchidee.xml .
833                       echo '<context id="orchidee" src="./context_input_orchidee.xml"/>' >> add.tmp
834                fi
835                sed -e '/id="LMDZ"/r add.tmp' iodef.xml > tmp
836                mv tmp iodef.xml
837                sed -e'{/sechiba1/ s/enabled="_AUTO_"/type="one_file" enabled=".TRUE."/}' \
838                    file_def_orchidee.xml > tmp
839                \mv -f tmp file_def_orchidee.xml
840                sed -e 's@enabled="_AUTO_"@type="one_file" enabled=".FALSE."@' \
841                    file_def_orchidee.xml > tmp
842                \mv -f tmp file_def_orchidee.xml
843                sed -e 's@output_level="_AUTO_"@output_level="1"@' \
844                    file_def_orchidee.xml > tmp
845                \mv -f tmp file_def_orchidee.xml
846                sed -e 's@output_freq="_AUTO_"@output_freq="1d"@' \
847                    file_def_orchidee.xml > tmp
848                \mv -f tmp file_def_orchidee.xml
849                sed -e 's@compression_level="4"@compression_level="0"@' \
850                    file_def_orchidee.xml > tmp
851                \mv -f tmp file_def_orchidee.xml
852                sed -e 's@XIOS_ORCHIDEE_OK = n@XIOS_ORCHIDEE_OK = y@' \
853                    orchidee.def > tmp
854                \mv -f tmp orchidee.def
855            fi
856        fi
857
858        if [[ -f ../arch.env ]]; then source ../arch.env; fi
859
860        echo "EXECUTION DU BENCH"
861        date
862        if (! $bench_cmd > out.bench 2>&1) || ! (tail -n 1 listing | grep "Everything is cool"); then
863            tail listing
864            echo "Bench FAILED, exiting"; exit 1
865        fi
866        date
867        tail listing
868    fi
869
870    # 1D case
871    if [[ $SCM = 1 ]]; then
872        cd "$MODEL"
873        myget 1D/1D.tar.gz
874        tar xf 1D.tar.gz
875        cd 1D
876        if [[ $rad = "oldrad" ]]; then
877            sed -i'' -e 's/^rad=.*$/rad=oldrad/' run.sh
878            sed -i'' -e 's/^rad=.*$/rad=oldrad/' bin/compile
879        elif [[ $rad = ecrad ]] ; then
880                        sed -i'' -e 's/^rad=.*$/rad=ecrad/' run.sh
881                        sed -i'' -e 's/^rad=.*$/rad=ecrad/' bin/compile
882                    fi
883        echo "Running 1D/run.sh, log in $(pwd)/run1d.log"
884        ./run.sh > "$(pwd)/run1d.log" 2>&1
885    fi
886}
887
888# If sourced: returns, else run setup
889if [[ ! "${BASH_SOURCE[0]}" = "$0" ]]; then return 0; fi
890
891echo "install_lmdz.sh DEBUT $(date)"
892
893set_default_params
894read_cmdline_args "$@"
895ensure_correct_option_combinations
896#download_model
897create_model_tar
898init_arch
899check_available_software
900get_lmdz_version
901get_orchidee_version
902install_netcdf
903install_IOIPSL
904install_XIOS
905compile_orchidee
906compile_lmdz
907run_bench
Note: See TracBrowser for help on using the repository browser.