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