[3744] | 1 | #!/bin/bash |
---|
| 2 | # Author: David Cugnet |
---|
| 3 | # This script build a bunch of jobs, each one building limit.nc files, ozone files (optional) |
---|
| 4 | # and initial state (optional, first year only) for a particular configuration. |
---|
| 5 | # All those sequential light jobs can be submitted in parallel. |
---|
| 6 | # The script checks used files are present, to avoid to submit nonfunctional jobs. |
---|
| 7 | # Currently set up for CURIE, ADA and CICLAD machines, with corresponding paths for |
---|
| 8 | # AMIP SST/SIC and ozone files. |
---|
| 9 | # If you want to use other SST/SIC files, please change TYPE option. You will have to enter |
---|
| 10 | # the path to the SST/SIC files manually, unless you include them in this script. |
---|
| 11 | # |
---|
| 12 | # Several types of sst/sic (variable V) files can be used, triggered by $TYPE keywork ; so far: |
---|
| 13 | # standard files name variable name |
---|
| 14 | # * AMIP for AMIP files amipbc_${V}_1x1.nc tosbcs/sicbcs |
---|
| 15 | # * CPL for coupled model outputs cpl_atm_${V}.nc SISUTESW/SIICECOV |
---|
| 16 | # * HIST for atmosph model outputs histmth_${V}.nc tsol_oce/pourc_sic |
---|
| 17 | # * DELK for ??? sstk.nc/ci.nc sstk/ci |
---|
| 18 | |
---|
| 19 | |
---|
| 20 | #=============================================================================== |
---|
| 21 | #=== DETERMINE THE MACHINE NAME ================================================ |
---|
| 22 | #=============================================================================== |
---|
| 23 | if [ ${HOSTNAME:0:3} = 'ada' ]; then machine='ada'; work=$WORKDIR |
---|
| 24 | elif [ ${HOSTNAME:0:5} = 'curie' ]; then machine='curie'; work=$CCCWORKDIR |
---|
| 25 | elif [ ${HOSTNAME:0:6} = 'ciclad']; then machine='ciclad'; work=/data/$USER |
---|
| 26 | else echo "Not set up for this machine yet, sorry."; exit; fi |
---|
| 27 | export machine=$machine |
---|
| 28 | |
---|
| 29 | #=============================================================================== |
---|
| 30 | #=== PARAMETERS YOU WILL PROBABLY NEED TO CHANGE =============================== |
---|
| 31 | #=============================================================================== |
---|
| 32 | #=== GENERAL PARAMETERS |
---|
| 33 | GENCI_ID='gen1168' #= GENCI project ID (for CURIE) |
---|
| 34 | etat0=n #= BUILD "start.nc" & "startphy.nc" (initial states) FILES (y/n) |
---|
| 35 | limit=n #= BUILD "limit.nc" (boundary conditions) FILES (y/n) |
---|
| 36 | climoz=1 #= BUILD (1/2) OR NOT (0) climoz FILES USING: |
---|
| 37 | #= 1: "tro3" 2: "tro3" and "tro3_daylight" |
---|
| 38 | #res=('96x95x39' '144x142x79' '280x280x79') #= resolution(s) (at least one) |
---|
| 39 | #cal='earth_360d earth_365d gregorian' #= calendar(s): earth_366d / julian /... (at least one) |
---|
| 40 | res=('96x95x39' '144x142x79') |
---|
| 41 | cal='earth_360d' |
---|
| 42 | |
---|
| 43 | #=== PARAMETERS RELATED TO SST/SIC |
---|
| 44 | Ybs=1870; Yes=2008 |
---|
| 45 | STYPE='AMIP' #= SST/SIC files type (single one) |
---|
| 46 | #SVERS='2012 2014 20161020 20170419' #= SST/SIC files versions, for AMIP only (at least one) |
---|
| 47 | #LIMOUT='$work/LIMIT/$sstp/${rs}_${oatp}_$cl' #= SST/SIC output files storage folder |
---|
| 48 | SVERS='20170419' |
---|
| 49 | LIMOUT='$work/IGCM/ATM/LIMIT/$sstp/interpol/${rs}_${oatp}_$cl' |
---|
| 50 | |
---|
| 51 | #=== PARAMETERS RELATED TO OZONE |
---|
| 52 | Ybo=1850; Yeo=2014 |
---|
| 53 | #OTYPE=('HYBRIDE' 'UReading_2016') #= ozone files type (at least one) |
---|
| 54 | #OVERS=('v2.clim' '2D_14Fields') #= corresponding versions tags (one each o3 file type) |
---|
| 55 | #OZOOUT='$work/Ozone/$o3tp/$o3vs/${rs}' #= ozone output files storage folder |
---|
| 56 | OTYPE=('UReading') #= ozone files type (at least one) |
---|
| 57 | OVERS=('historical.v20160711') #= corresponding versions tags (one each o3 file type) |
---|
| 58 | OZOOUT='$work/IGCM/ATM/OZONE/$o3tp/$o3vs/interpol/${rs}' #= ozone output files storage folder |
---|
| 59 | |
---|
| 60 | #=== PARAMETERS RELATED TO INITIAL STATES |
---|
| 61 | INIOUT='$work/IGCM/ATM/START/${rs}_${oatp}' #= initial states storage folder (1st year only) |
---|
| 62 | |
---|
| 63 | #=============================================================================== |
---|
| 64 | #=== PARAMETERS NOT SUPPOSED TO BE CHANGED OFTEN =============================== |
---|
| 65 | #=============================================================================== |
---|
| 66 | #--- EXECUTABLE PATH AND NAME |
---|
| 67 | ce0l="./ce0lseq.e" #= command to run ce0l executable in jobs |
---|
| 68 | BINDIR=$PWD/bin #= folder containing ce0l executable(s) |
---|
| 69 | |
---|
| 70 | #--- CONFIGURATION FILES |
---|
| 71 | DEFDIR=$PWD/DefLists #= folder containing parameters files |
---|
| 72 | #= List of *.def files ; any change of name: after ":". |
---|
| 73 | defslist='physiq.def config.def traceur.def run.def' #conv_param.def wake_param.def |
---|
| 74 | #= keys to change. Syntax: <file>:<key>=<value> |
---|
| 75 | |
---|
| 76 | #--- RUN COMMAND, LOCAL STORAGE SPACE, INPUT DATA FOLDER, NEEDED FILES (EXCLUDING SIC/SST/O3, NO ".nc") |
---|
| 77 | case $machine in |
---|
| 78 | ada) work=$WORKDIR; DATAIN='/workgpfs/rech/psl/rpsl035/IGCM' ; run="";; |
---|
| 79 | curie) work=$CCCWORKDIR; DATAIN='/ccc/work/cont003/igcmg/igcmg/IGCM' ; run="ccc_mprun";; |
---|
| 80 | ciclad) work=/data/$USER; DATAIN='/prodigfs/ipslfs/igcmg/IGCM' ; run="";; |
---|
| 81 | esac |
---|
| 82 | DATAIN_TMP=$work/IGCM |
---|
| 83 | |
---|
| 84 | #--- CLIMATOLOGIES FOLDER AND CORRESPONDING NEEDED FILES |
---|
| 85 | CLIDIR=$DATAIN/ATM |
---|
| 86 | climslist="Albedo ECDYN:ECDYN ECDYN:ECPHY landiceref Relief Rugos" |
---|
| 87 | |
---|
| 88 | #--- INPUT SST/SIC FILES AND VARIABLES NAMES + STANDARD NAMES KNOWN BY ce0l |
---|
| 89 | #SSTSIN='$DATAIN/ATM/$sstp' |
---|
| 90 | SSTSIN='$DATAIN/ATM/LIMIT/$sstp/original/360x180/BCS' |
---|
| 91 | |
---|
| 92 | case $STYPE in |
---|
| 93 | AMIP) sstsic_in=('amipbc_sst_360x180_${Y}.nc' 'amipbc_sic_360x180_${Y}.nc') |
---|
| 94 | sstsic_ou=('amipbc_sst_1x1.nc' 'amipbc_sic_1x1.nc') |
---|
| 95 | sstsic_cl=('sst_bc_clim.nc' 'sic_bc_clim.nc') ;; |
---|
| 96 | CPL) sstsic_in=('cpl_atm_sst_${Y}.nc' 'cpl_atm_sic_${Y}.nc') |
---|
| 97 | sstsic_ou=('cpl_atm_sst.nc' 'cpl_atm_sic.nc') |
---|
| 98 | sstsic_cl=('sst_cpl_clim.nc' 'sic_cpl_clim.nc') ;; |
---|
| 99 | HIST) sstsic_in=('histmth_sst_${Y}.nc' 'histmth_sic_${Y}.nc') |
---|
| 100 | sstsic_ou=('histmth_sst.nc' 'histmth_sic.nc') |
---|
| 101 | sstsic_cl=('sst_hist_clim.nc' 'sic_hist_clim.nc') ;; |
---|
| 102 | DELK) sstsic_in=('sstk_${Y}.nc' 'ci_${Y}.nc') |
---|
| 103 | sstsic_ou=('sstk.nc' 'ci.nc') |
---|
| 104 | sstsic_cl=('sstk_clim.nc' 'sick_clim.nc') ;; |
---|
| 105 | esac |
---|
| 106 | |
---|
| 107 | #--- INPUT OZONE FILES NAMES + STANDARD NAMES KNOW BY ce0l |
---|
| 108 | #OZONIN='$DATAIN/ATM/Ozone/$o3tp/$o3vs' |
---|
| 109 | OZONIN='$DATAIN_TMP/ATM/OZONE/$o3tp/$o3vs/original/144x96x66' |
---|
| 110 | ozonefile='tro3_${Y}.nc' |
---|
| 111 | ozonehybr='tro3_${Y}.new.nc' |
---|
| 112 | |
---|
| 113 | #--- PARAMETERS RELATED TO o2a.nc |
---|
| 114 | O2CDIR=$DATAIN/ATM/IPSLCM6 |
---|
| 115 | |
---|
| 116 | #=============================================================================== |
---|
| 117 | #=== FEW FUNCTIONS ============================================================= |
---|
| 118 | #=============================================================================== |
---|
| 119 | function addc { |
---|
| 120 | local s |
---|
| 121 | s="$1"; while [ ${#s} -lt $2 ]; do s="_$s"; done ; echo "$s"; unset s |
---|
| 122 | } |
---|
| 123 | #================================================================================== |
---|
| 124 | function progress_bar { |
---|
| 125 | # $1: iteration $2: iterations number $3: length of the bar |
---|
| 126 | local n bar |
---|
| 127 | bar=`echo "scale=1 ; (100*$1)/$2" | bc` |
---|
| 128 | bar="`addc "$bar" 5`% [" |
---|
| 129 | n=`echo "scale=0 ; ($3*$1)/$2" | bc` |
---|
| 130 | if [ $n -ne 0 ]; then bar="$bar"`eval "printf '='%.0s {1..$n}"`; fi |
---|
| 131 | n=$(($3-$n)) |
---|
| 132 | if [ $n -ne 0 ]; then bar="$bar"`eval "printf '.'%.0s {1..$n}"`']\r'; fi |
---|
| 133 | echo -ne $bar; if [ $2 -eq $1 ]; then echo; fi |
---|
| 134 | unset n bar |
---|
| 135 | } |
---|
| 136 | #================================================================================== |
---|
| 137 | function check_file { |
---|
| 138 | # Purpose: Check if a file is present. Return in $method the way to get it: |
---|
| 139 | # 1) untar for files from tar archives. |
---|
| 140 | # 2) simple link for files on mounted disks. |
---|
| 141 | # 3) mfget for files stored on ERGON. |
---|
| 142 | # $1=<archive name>:<input file name> (case 1) |
---|
| 143 | # $1=<input file name> (cases 2,3) |
---|
| 144 | # Global variable used: $method (+ variables used to evaluate $1). |
---|
| 145 | local f=${1##*:} a="" fnam arch |
---|
| 146 | if [ "${1%%:*}" != "$1" ]; then a=${1%%:*}; fi |
---|
| 147 | fnam=$(eval echo $f); arch=$(eval echo $a) |
---|
| 148 | |
---|
| 149 | #=== CHECK WETHER ARGUMENTS ARE CORRECT IN CASE OF A *.tar ARCHIVE |
---|
| 150 | if [ "$arch" != "" ]; then |
---|
| 151 | #--- NOT A TAR ARCHIVE |
---|
| 152 | if [ "${arch##*.tar}" = "${arch}" ]; then |
---|
| 153 | echo "Argument provided is not a *.tar file: ${arch}"; return 1 |
---|
| 154 | fi |
---|
| 155 | #--- TAR ARCHIVE UNFOUND |
---|
| 156 | if [ ! -f "${arch}" ]; then |
---|
| 157 | echo "Missing archive ${arch}"; return 1 |
---|
| 158 | fi |
---|
| 159 | #--- FILE NOT IN THE ARCHIVE |
---|
| 160 | if [ ! `tar tf $arch $fnam 2> /dev/null` ]; then |
---|
| 161 | echo "Archive ${arch} does not contain a file named $fnam"; return 1 |
---|
| 162 | fi |
---|
| 163 | fi |
---|
| 164 | |
---|
| 165 | #=== SEVERAL POSSIBILITIES FOR A PRESENT FILE |
---|
| 166 | if [ -f $fnam ]; then #=== REACHABLE FILE: SIMPLE LINK |
---|
| 167 | export method='ln -sf $f_in $f_ou' ; return 0 |
---|
| 168 | elif [ "${arch}" != "" ]; then #=== TAR ARCHIVE ; MOSTLY USEFULL FOR CURIE |
---|
| 169 | export method='tar xvf $arch $f_in --strip-components=$(grep -o "/" <<< "$f_in" | wc -l) ; mv ${f_in##*/} $f_ou'; return 0 |
---|
| 170 | elif [ `mfls $fnam 2> /dev/null` ]; then #=== STORED ON ERGON |
---|
| 171 | export method='mfget $f_in $f_ou' ; return 0 |
---|
| 172 | fi |
---|
| 173 | |
---|
| 174 | #=== FILE NOT FOUND ; DISPLAY A MESSAGE IF NEEDED. |
---|
| 175 | if [ $# -eq 3 ]; then #=== NOT FOUND |
---|
| 176 | if [ $3 = '-v' ]; then echo "No way to deal with file described by argument $1"; fi |
---|
| 177 | fi |
---|
| 178 | return 1 |
---|
| 179 | } |
---|
| 180 | |
---|
| 181 | #=============================================================================== |
---|
| 182 | function check_fyears { |
---|
| 183 | # $1: Ystart $2: Ystop $3: files $4: type |
---|
| 184 | echo ">>> CHECKING $4 FILES: ${3##*/}..." |
---|
| 185 | Yok=(); Yno=() |
---|
| 186 | #------------------------------------------------------------------------------- |
---|
| 187 | for Y in $(eval echo {$1..$2}); do #--- LOOP ON YEARS |
---|
| 188 | #------------------------------------------------------------------------------- |
---|
| 189 | check_file $(Y=$Y; eval echo $3) |
---|
| 190 | if [ $? -eq 0 ]; then Yok=(${Yok[@]} $Y); else Yno=(${Yno[@]} $Y); fi |
---|
| 191 | progress_bar $((Y-$1+1)) $(($2-$1+1)) 50 |
---|
| 192 | #------------------------------------------------------------------------------- |
---|
| 193 | done #--- YEARS |
---|
| 194 | #------------------------------------------------------------------------------- |
---|
| 195 | if [ ${#Yok} -eq 0 ]; then echo " No $4 files found: $3 $4"; return 1; fi |
---|
| 196 | nY=$((${#Yok[@]}-1)); Yi=$1; Yf=$2 |
---|
| 197 | if [ $nY -ne $(($2-$1)) ]; then Yi=${Yok[0]}; Yf=${Yok[$nY]} |
---|
| 198 | echo " Reduced interval for $4 files ${3##*/}: ${Yi}-${Yf} (instead of $1-$2)" |
---|
| 199 | i=0; while [ $i -le ${#Yno} ]; do |
---|
| 200 | if [[ ${Yno[$i]} -lt $Yi || ${Yno[$i]} -gt $Yf ]]; then unset Yno[$i]; fi; ((i++)) |
---|
| 201 | done |
---|
| 202 | elif [ ${#Yno} -ne 0 ]; then |
---|
| 203 | echo " Missing years for $4 files (${3##*/}): ${Yno[@]}"; return 1 |
---|
| 204 | else |
---|
| 205 | echo " Default interval for $4 files ${3##*/}: $1-$2" |
---|
| 206 | fi |
---|
| 207 | export Yi=$Yi Yf=$Yf method="$method" |
---|
| 208 | return 0 |
---|
| 209 | } |
---|
| 210 | |
---|
| 211 | #=============================================================================== |
---|
| 212 | function change_key { |
---|
| 213 | # Purpose: write in $3 the command to set the value of key ${1%%=*} to ${1##*=} in file $2.def |
---|
| 214 | # $1: <key=value> $2: parameter file name (without .def suffix) $3: job name |
---|
| 215 | if ! test $(grep ${1%%=*}= $2.def); then echo " echo $1 >> ${2##*/}.def" >> $3 |
---|
| 216 | else echo " sed -i s%${1%%=*}=.*%${1}% ${2##*/}.def" >> $3 ; fi |
---|
| 217 | return 0 |
---|
| 218 | } |
---|
| 219 | |
---|
| 220 | #=============================================================================== |
---|
| 221 | function header { |
---|
| 222 | # Generate a job header ; $1=<job_name> ; $2=resolution |
---|
| 223 | # Used global paths: TMPDIR/SCRATCHDIR/USER, depending on the machine. |
---|
| 224 | local jobn=$(t=${1##*/}; eval echo ${t%.*}) suff tmp time |
---|
| 225 | suff=${jobn##*ob_}; tmp=CE0L_${suff}_$$ |
---|
| 226 | |
---|
| 227 | #-- Number of hours required (4 by default) |
---|
| 228 | time=4 |
---|
| 229 | case $2 in |
---|
| 230 | 96x95x39) time=2 ;; |
---|
| 231 | 144x142x79) time=4 ;; |
---|
| 232 | 280x280x79) time=12 ;; |
---|
| 233 | esac |
---|
| 234 | case $machine in |
---|
| 235 | ada) tmp=\$TMPDIR/$tmp; time=$time:00:00 |
---|
| 236 | cat > $1 << ______fin |
---|
| 237 | # @ job_name = $jobn |
---|
| 238 | # @ output = \$(job_name).\$(jobid) |
---|
| 239 | # @ error= \$(job_name).\$(jobid) |
---|
| 240 | # @ job_type = serial |
---|
| 241 | # @ as_limit = 20.0Gb |
---|
| 242 | # @ wall_clock_limit = $time |
---|
| 243 | # @ queue |
---|
| 244 | ______fin |
---|
| 245 | ;; |
---|
| 246 | curie) tmp=\$SCRATCHDIR/$tmp; time=$((3600*time)) |
---|
| 247 | cat > $1 << ______fin |
---|
| 248 | #!/bin/bash |
---|
| 249 | #MSUB -r $jobn |
---|
| 250 | #MSUB -n 1 |
---|
| 251 | #MSUB -T $time |
---|
| 252 | #MSUB -o $1.%I.o |
---|
| 253 | #MSUB -e $1.%I.e |
---|
| 254 | #MSUB -A $GENCI_ID |
---|
| 255 | #MSUB -q large |
---|
| 256 | ______fin |
---|
| 257 | ;; |
---|
| 258 | ciclad) tmp=/data/$USER/$tmp |
---|
| 259 | cat > $1 << ______fin |
---|
| 260 | #!/bin/bash |
---|
| 261 | #PBS -qstd |
---|
| 262 | #PBS -k oe |
---|
| 263 | #PBS -j oe |
---|
| 264 | #PBS -l mem=10gb |
---|
| 265 | #PBS -l vmem=12gb |
---|
| 266 | ______fin |
---|
| 267 | ;; |
---|
| 268 | esac |
---|
| 269 | cat >> $1 << ______fin |
---|
| 270 | set -x |
---|
| 271 | tmp=$tmp ; if [ ! -d \$tmp ]; then mkdir \$tmp; fi; cd \$tmp |
---|
| 272 | ______fin |
---|
| 273 | } |
---|
| 274 | |
---|
| 275 | |
---|
| 276 | #=============================================================================== |
---|
| 277 | #=== MAIN PROGRAM |
---|
| 278 | #=============================================================================== |
---|
| 279 | |
---|
| 280 | #=== CHECK EXECUTABLE ARE THERE FOR EACH RESOLUTION |
---|
| 281 | mrs="" |
---|
| 282 | #------------------------------------------------------------------------------- |
---|
| 283 | for rs in ${res[@]}; do #--- LOOP ON RESOLUTIONS |
---|
| 284 | #------------------------------------------------------------------------------- |
---|
| 285 | exe=ce0l_${rs}_phylmd_seq.e #= name of used executable |
---|
| 286 | check_file $BINDIR/$exe |
---|
| 287 | if [ $? -ne 0 ]; then echo "Missing executable $BINDIR/$exe"; mrs="$mrs $rs"; fi |
---|
| 288 | for rrs in $mrs; do res=(${res[@]/$rrs}); done |
---|
| 289 | #------------------------------------------------------------------------------- |
---|
| 290 | done |
---|
| 291 | #------------------------------------------------------------------------------- |
---|
| 292 | if [ "$mrs" != "" ]; then echo "No executable available."; exit; fi |
---|
| 293 | |
---|
| 294 | #=== IF SELECTED TYPE IS "AMIP", THEN USE SEVERAL VERSIONS FROM $SVERS VARIABLE. |
---|
| 295 | TYPE=$STYPE; |
---|
| 296 | if [ "$TYPE" = "AMIP" ]; then TYPE=""; for vr in $SVERS; do TYPE="$TYPE AMIP.v$vr"; done; fi |
---|
| 297 | |
---|
| 298 | |
---|
| 299 | #=== CHECK THE SST/SIC FILES ARE THERE FOR EACH REQUIRED YEAR |
---|
| 300 | itype=0; Ybsst=(); Yesst=(); Ybsic=(); Yesic=() |
---|
| 301 | #------------------------------------------------------------------------------- |
---|
| 302 | for sstp in $TYPE; do #--- LOOP ON SST/SIC TYPES |
---|
| 303 | #------------------------------------------------------------------------------- |
---|
| 304 | SSTDIR=$(sstp=$sstp; DATAIN=$DATAIN; eval echo $SSTSIN) |
---|
| 305 | if [ ! -d $SSTDIR ]; then |
---|
| 306 | SSTDIR=$(sstp=$sstp; DATAIN=$DATAIN_TMP; eval echo $SSTSIN) |
---|
| 307 | fi |
---|
| 308 | iv=0 |
---|
| 309 | for V in sst sic; do |
---|
| 310 | check_fyears $Ybs $Yes $SSTDIR/${sstsic_in[$iv]} $sstp ; if [ $? -ne 0 ]; then exit; fi |
---|
| 311 | Ybsst[$itype]=$Yi; Yesst[$itype]=$Yf |
---|
| 312 | eval clim$V[$itype]=\"$(ls $SSTDIR/${sstsic_cl[$iv]} 2> /dev/null) $(ls $SSTDIR/$(Y=*_*_clim; eval echo ${sstsic_in[$iv]}) 2> /dev/null)\" |
---|
| 313 | ((iv++)) |
---|
| 314 | done |
---|
| 315 | get_sstsic[$itype]=$method; ((itype++)) |
---|
| 316 | #------------------------------------------------------------------------------- |
---|
| 317 | done #--- TYPES |
---|
| 318 | #------------------------------------------------------------------------------- |
---|
| 319 | |
---|
| 320 | #=== CHECK THE OZONE FILES ARE THERE FOR EACH REQUIRED YEAR |
---|
| 321 | if [ $climoz -ne 0 ]; then |
---|
| 322 | itype=0; Ybozo=(); Yeozo=() |
---|
| 323 | #------------------------------------------------------------------------------- |
---|
| 324 | for o3tp in ${OTYPE[@]}; do #--- LOOP ON OZONE TYPES |
---|
| 325 | #------------------------------------------------------------------------------- |
---|
| 326 | o3vs=${OVERS[$itype]} |
---|
| 327 | OZODIR=$(o3tp=$o3tp; o3vs=$o3vs; DATAIN=$DATAIN; eval echo $OZONIN) |
---|
| 328 | if [ ! -d $OZODIR ]; then |
---|
| 329 | OZODIR=$(o3tp=$o3tp; o3vs=$o3vs; DATAIN=$DATAIN_TMP; eval echo $OZONIN) |
---|
| 330 | fi |
---|
| 331 | o3f=$ozonefile; if [ "$o3tp" = "HYBRIDE" ]; then o3f=$ozonehybr; fi |
---|
| 332 | check_fyears $Ybo $Yeo $OZODIR/$o3f $o3tp ; if [ $? -ne 0 ]; then exit; fi |
---|
| 333 | Ybozo[$itype]=$Yi; Yeozo[$itype]=$Yf |
---|
| 334 | eval climozo[$itype]=\"`ls $OZODIR/$(Y=*_*_clim; eval echo $o3f) 2> /dev/null`\" |
---|
| 335 | get_ozone[$itype]=$method; ((itype++)) |
---|
| 336 | #------------------------------------------------------------------------------- |
---|
| 337 | done #--- TYPES |
---|
| 338 | #------------------------------------------------------------------------------- |
---|
| 339 | fi |
---|
| 340 | |
---|
| 341 | #iv=0; ttp=($TYPE) |
---|
| 342 | #for V in sst sic; do |
---|
| 343 | # for k in {1..3}; do n=$k; ((n--)) |
---|
| 344 | # echo type: ${ttp[$n]} Yb: ${Ybsst[$n]} Ye: ${Yesst[$n]} clim$V: $(eval echo \${clim$V[$n]}) |
---|
| 345 | # done; ((iv++)) |
---|
| 346 | #done |
---|
| 347 | #exit |
---|
| 348 | |
---|
| 349 | #=== JOBS CREATION |
---|
| 350 | echo ">>> GENERATING JOBS..." |
---|
| 351 | no2a=0 |
---|
| 352 | for rs in ${res[@]}; do |
---|
| 353 | n=$(ls $O2CDIR/*LMD${rs%x*}/o2a.nc 2> /dev/null|wc -l); no2a=$((no2a+n+1)) |
---|
| 354 | done |
---|
| 355 | njobs=$(($(echo $TYPE|wc -w)*$(echo $cal|wc -w)*$no2a)) |
---|
| 356 | itype=0; ijob=0 |
---|
| 357 | #------------------------------------------------------------------------------- |
---|
| 358 | for sstp in $TYPE; do #--- LOOP ON SST/SIC TYPES |
---|
| 359 | #------------------------------------------------------------------------------- |
---|
| 360 | #=== CHECK WETHER OZONE FILES HAVE TO BE COMPUTED |
---|
| 361 | okO3='n'; if [[ $itype -lt ${#OTYPE[@]} && $climoz -ne 0 ]]; then okO3='y'; fi |
---|
| 362 | |
---|
| 363 | #--- DETERMINE PATH FOR SST/SIC FILES |
---|
| 364 | SSTDIR=$(sstp=$sstp; DATAIN=$DATAIN; eval echo $SSTSIN) |
---|
| 365 | if [ ! -d $SSTDIR ]; then |
---|
| 366 | SSTDIR=$(sstp=$sstp; DATAIN=$DATAIN_TMP; eval echo $SSTSIN) |
---|
| 367 | fi |
---|
| 368 | |
---|
| 369 | #--- DETERMINE PATH FOR OZONE FILES + MODIFICATION |
---|
| 370 | if [ $okO3 = 'y' ]; then o3tp=${OTYPE[$itype]}; o3vs=${OVERS[$itype]} |
---|
| 371 | OZODIR=$(o3tp=$o3tp; o3vs=$o3vs; DATAIN=$DATAIN; eval echo $OZONIN) |
---|
| 372 | if [ ! -d $OZODIR ]; then |
---|
| 373 | OZODIR=$(o3tp=$o3tp; o3vs=$o3vs; DATAIN=$DATAIN_TMP; eval echo $OZONIN) |
---|
| 374 | fi |
---|
| 375 | o3f=$ozonefile; if [ "$o3tp" = "HYBRIDE" ]; then o3f=$ozonehybr; fi |
---|
| 376 | fi |
---|
| 377 | #------------------------------------------------------------------------------- |
---|
| 378 | for rs in ${res[@]}; do #--- LOOP ON RESOLUTIONS |
---|
| 379 | #------------------------------------------------------------------------------- |
---|
| 380 | hres=${rs%x*} |
---|
| 381 | exe=ce0l_${rs}_phylmd_seq.e #= name of the executable used |
---|
| 382 | case ${rs##*x} in #= Additional *.def file (depends on resolution) |
---|
| 383 | 39) DEFLIST="$defslist gcm.def_96x95x39_NPv3.1:gcm.def" ;; |
---|
| 384 | 79) DEFLIST="$defslist gcm.def vert_L79.def:vert.def" ;; |
---|
| 385 | *) DEFLIST="$defslist gcm.def" ;; |
---|
| 386 | esac |
---|
| 387 | export DEFLIST=$DEFLIST |
---|
| 388 | ical=0 |
---|
| 389 | #------------------------------------------------------------------------------- |
---|
| 390 | for cl in $cal; do #--- LOOP ON CALENDARS |
---|
| 391 | #------------------------------------------------------------------------------- |
---|
| 392 | export cl=$cl |
---|
| 393 | if [ $okO3 = 'y' ]; then |
---|
| 394 | OZONOU=$(o3tp=$o3tp; o3vs=$o3vs; rs=$hres; eval echo $OZOOUT) |
---|
| 395 | fi |
---|
| 396 | io2a=0 |
---|
| 397 | #------------------------------------------------------------------------------- |
---|
| 398 | for o2a in default $(ls $O2CDIR/*LMD${hres}/o2a.nc 2> /dev/null); do |
---|
| 399 | #------------------------------------------------------------------------------- |
---|
| 400 | okOzone=$okO3; if [[ $ical -ne 0 || $io2a -ne 0 ]]; then okOzone='n'; fi |
---|
| 401 | oketat0=$etat0; if [[ $ical -ne 0 || $itype -ne 0 ]]; then oketat0='n'; fi |
---|
| 402 | oatp=$(a=${o2a%xLMD*}; echo ${a##*/}) |
---|
| 403 | job=$PWD/job_ce0l-${sstp}-${rs}-${cl##*_}-${oatp}.bash |
---|
| 404 | LIMTOU=$(sstp=$sstp; oatp=$oatp; rs=$hres; cl=${cl##*_}; eval echo $LIMOUT) |
---|
| 405 | header $job $rs |
---|
| 406 | cat >> $job << ______fin |
---|
| 407 | |
---|
| 408 | #=== SOME PATHS |
---|
| 409 | DEFDIR=$DEFDIR |
---|
| 410 | BINDIR=$BINDIR |
---|
| 411 | CLIDIR=$CLIDIR |
---|
| 412 | SSTDIR=$SSTDIR |
---|
| 413 | LIMTOU=$LIMTOU |
---|
| 414 | if [ ! -d \$LIMTOU ]; then mkdir -p \$LIMTOU; fi |
---|
| 415 | ______fin |
---|
| 416 | if [ $okOzone = 'y' ]; then |
---|
| 417 | cat >> $job << ______fin |
---|
| 418 | OZODIR=$OZODIR |
---|
| 419 | OZONOU=$OZONOU |
---|
| 420 | if [ ! -d \$OZONOU ]; then mkdir -p \$OZONOU; fi |
---|
| 421 | ______fin |
---|
| 422 | fi |
---|
| 423 | if [ $oketat0 = 'y' ]; then |
---|
| 424 | cat >> $job << ______fin |
---|
| 425 | INITOU=$(eval echo $INIOUT) |
---|
| 426 | if [ ! -d \$INITOU ]; then mkdir -p \$INITOU; fi |
---|
| 427 | ______fin |
---|
| 428 | fi |
---|
| 429 | echo "" >> $job |
---|
| 430 | echo " #=== GET AND ALTER CONFIGURATION FILES" >> $job |
---|
| 431 | for fi in $DEFLIST; do fo=. |
---|
| 432 | if [ $(grep -o ":" <<< "$fi" | wc -l) -ne 0 ]; then |
---|
| 433 | fo="${fi##*:}"; fi="${fi%:*}" |
---|
| 434 | fi |
---|
| 435 | check_file $DEFDIR/$fi |
---|
| 436 | if [ $? -ne 0 ]; then echo "Missing file $DEFDIR/$fi"; isOK=1; fi |
---|
| 437 | echo " cp \$DEFDIR/$fi $fo" >> $job |
---|
| 438 | done |
---|
| 439 | change_key calend=${cl} $DEFDIR/run $job |
---|
| 440 | change_key ok_etat0=y $DEFDIR/run $job |
---|
| 441 | change_key ok_limit=y $DEFDIR/run $job |
---|
| 442 | change_key read_climoz=0 $DEFDIR/config $job |
---|
| 443 | echo "" >> $job |
---|
| 444 | echo " #=== LINK THE MODEL" >> $job |
---|
| 445 | check_file $BINDIR/$exe |
---|
| 446 | if [ $? -ne 0 ]; then echo "Missing executable $BINDIR/$exe"; isOK=1; fi |
---|
| 447 | echo " $(f_in=\$BINDIR/$exe; f_ou=$ce0l; eval echo $method)" >> $job |
---|
| 448 | echo "" >> $job |
---|
| 449 | echo " #=== LINK MISCELLANOUS DATA" >> $job |
---|
| 450 | for clim in $climslist; do |
---|
| 451 | fi=$clim.nc; fo=. |
---|
| 452 | if [ $(grep -o ":" <<< "$clim" | wc -l) -ne 0 ]; then |
---|
| 453 | fo="${clim##*:}.nc"; fi="${clim%:*}.nc" |
---|
| 454 | fi |
---|
| 455 | check_file $CLIDIR/$fi |
---|
| 456 | if [ $? -ne 0 ]; then echo "Missing climatology $fi"; isOK=1; fi |
---|
| 457 | echo " $(f_in=\$CLIDIR/$fi; f_ou=$fo; eval echo $method)" >> $job |
---|
| 458 | done |
---|
| 459 | if [ $o2a != 'default' ]; then |
---|
| 460 | echo " ln -sf $o2a o2a.nc" >> $job |
---|
| 461 | fi |
---|
| 462 | Yb1=${Ybsst[$itype]}; Ye1=${Yesst[$itype]} |
---|
| 463 | Yb2=$Yb1; Ye2=$Ye1; if [ $okOzone = 'y' ]; then Yb2=${Ybozo[$itype]}; Ye2=${Yeozo[$itype]}; fi |
---|
| 464 | Yb0=$((Yb1<Yb2?Yb1:Yb2)); Ye0=$((Ye1>Ye2?Ye1:Ye2)) |
---|
| 465 | cat >> $job << ______fin |
---|
| 466 | |
---|
| 467 | #----------------------------------------------------------------------------- |
---|
| 468 | for Y in {$Yb0..$Ye0}; do #--- LOOP ON YEARS |
---|
| 469 | #----------------------------------------------------------------------------- |
---|
| 470 | Y1=\$Y; Y1=\$((Y1<$Yb1?$Yb1:Y1)); Y1=\$((Y1>$Ye1?$Ye1:Y1)) |
---|
| 471 | Y2=\$Y; Y2=\$((Y2<$Yb2?$Yb2:Y2)); Y2=\$((Y2>$Ye2?$Ye2:Y2)) |
---|
| 472 | sed -i s%anneeref=.*%anneeref=\${Y}% run.def |
---|
| 473 | ______fin |
---|
| 474 | if [ $okOzone = 'y' ]; then |
---|
| 475 | fin=$o3f; fou=climoz.nc; fom=${fou%.*}_m.nc; fop=${fou%.*}_p.nc |
---|
| 476 | cat >> $job << ______fin |
---|
| 477 | |
---|
| 478 | #=== OZONE FILES |
---|
| 479 | read_climoz=$climoz; if [[ \$Y -lt $Yb2 || \$Y -gt $Ye2 ]]; then read_climoz=0; fi |
---|
| 480 | sed -i s%read_climoz=.*%read_climoz=\$read_climoz% config.def |
---|
| 481 | fin=\$(Y=\$Y2; eval echo $fin) |
---|
| 482 | fip=\$(Y=\$((Y2+1)); eval echo $fin) |
---|
| 483 | fou=$fou; fom=$fom; fop=$fop |
---|
| 484 | if [ \$Y -eq $Yb0 ]; then $(f_in=\$OZODIR/\$fin; f_ou=\$fou; eval echo ${get_ozone[$itype]}); fi |
---|
| 485 | if [[ \$Y -ge $Yb2 && \$Y -le $Ye2 ]]; then |
---|
| 486 | if [ \$Y -ne $Yb2 ]; then mv \$fou \$fom; mv \$fop \$fou; fi |
---|
| 487 | if [ \$Y -ne $Ye2 ]; then $(f_in=\$OZODIR/\$fip; f_ou=\$fop; eval echo ${get_ozone[$itype]}); fi |
---|
| 488 | fi |
---|
| 489 | if [ \$Y -eq $((Ye2+1)) ]; then rm \$fom; fi |
---|
| 490 | ______fin |
---|
| 491 | fi |
---|
| 492 | iv=0 |
---|
| 493 | for V in sst sic; do |
---|
| 494 | fin=${sstsic_in[$iv]}; fou=${sstsic_ou[$iv]}; fom=${fou%.*}_m.nc; fop=${fou%.*}_p.nc |
---|
| 495 | cat >> $job << ______fin |
---|
| 496 | |
---|
| 497 | #=== $V FILES |
---|
| 498 | fin=\$(Y=\$Y1; eval echo $fin) |
---|
| 499 | fip=\$(Y=\$((Y1+1)); eval echo $fin) |
---|
| 500 | fou=$fou; fom=$fom; fop=$fop |
---|
| 501 | if [ \$Y -eq $Yb0 ]; then $(f_in=\$SSTDIR/\$fin; f_ou=\$fou; eval echo ${get_sstsic[$itype]}); fi |
---|
| 502 | if [[ \$Y -ge $Yb1 && \$Y -le $Ye1 ]]; then |
---|
| 503 | if [ \$Y -ne $Yb1 ]; then mv \$fou \$fom; mv \$fop \$fou; fi |
---|
| 504 | if [ \$Y -ne $Ye1 ]; then $(f_in=\$SSTDIR/\$fip; f_ou=\$fop; eval echo ${get_sstsic[$itype]}); fi |
---|
| 505 | fi |
---|
| 506 | if [ \$Y -eq $((Ye1+1)) ]; then rm \$fom; fi |
---|
| 507 | ______fin |
---|
| 508 | ((iv++)) |
---|
| 509 | done |
---|
| 510 | cat >> $job << ______fin |
---|
| 511 | |
---|
| 512 | ls |
---|
| 513 | |
---|
| 514 | #=== RUN THE MODEL |
---|
| 515 | $run $ce0l |
---|
| 516 | |
---|
| 517 | #=== COPY OUTPUTS |
---|
| 518 | ______fin |
---|
| 519 | if [ $limit = 'y' ]; then Y1=${Ybsst[$itype]}; Y2=${Yesst[$itype]} |
---|
| 520 | echo " if [[ \$Y -ge $Y1 && \$Y -le $Y2 ]]; then" >> $job |
---|
| 521 | echo " mv limit.nc \$LIMTOU/limit_\${Y}.nc" >> $job |
---|
| 522 | echo " fi" >> $job |
---|
| 523 | fi |
---|
| 524 | if [ $okOzone = 'y' ]; then Y1=${Ybozo[$itype]}; Y2=${Yeozo[$itype]} |
---|
| 525 | echo " if [[ \$Y -ge $Y1 && \$Y -le $Y2 ]]; then" >> $job |
---|
| 526 | echo " mv climoz_LMDZ.nc \$OZONOU/climoz_LMDZ_\${Y}.nc" >> $job |
---|
| 527 | echo " fi" >> $job |
---|
| 528 | fi |
---|
| 529 | if [ $oketat0 = 'y' ]; then |
---|
| 530 | echo " if [ \$Y -eq $Yb1 ]; then" >> $job |
---|
| 531 | echo " mv start.nc \$INITOU/start.nc" >> $job |
---|
| 532 | echo " mv startphy.nc \$INITOU/startphy.nc" >> $job |
---|
| 533 | echo " fi" >> $job |
---|
| 534 | fi |
---|
| 535 | cat >> $job << ______fin |
---|
| 536 | #----------------------------------------------------------------------------- |
---|
| 537 | done |
---|
| 538 | #----------------------------------------------------------------------------- |
---|
| 539 | |
---|
| 540 | #=== COMPUTE CLIMATOLOGIES (IF SOME CORRESPONDING FILES ARE AVAILABLE) |
---|
| 541 | ______fin |
---|
| 542 | #--- SIC/SST climatologies for current combination (itype) |
---|
| 543 | csic=(${climsic[$itype]}) |
---|
| 544 | csst=(${climsst[$itype]}); ns=${#csst[@]}; nmax=$ns |
---|
| 545 | #--- Same for oeone if required |
---|
| 546 | if [ $okOzone = 'y' ]; then fou=climoz.nc |
---|
| 547 | cozo=(${climozo[$itype]}); no=${#cozo[@]}; nmax=$((ns>no?ns:no)) |
---|
| 548 | echo " rm -f ${fou%.*}_m.nc ${fou%.*}_p.nc" >> $job |
---|
| 549 | fi |
---|
| 550 | #--- Get rid of the adjacent files (previous/next months) |
---|
| 551 | if [ $nmax -gt 0 ]; then iv=0 |
---|
| 552 | for V in sst sic; do fou=${sstsic_ou[$iv]}; ((iv++)) |
---|
| 553 | echo " rm -f ${fou%.*}_m.nc ${fou%.*}_p.nc" >> $job |
---|
| 554 | done |
---|
| 555 | fi |
---|
| 556 | for iclim in $(eval echo {1..$nmax}); do #=== LOOP ON CLIMATOLOGIES |
---|
| 557 | if [ $iclim -le $ns ]; then isst=$((iclim-1)) |
---|
| 558 | iv=0 |
---|
| 559 | for V in sst sic; do |
---|
| 560 | #--- Get SST/SIC files names a,nd link/copy them |
---|
| 561 | eval fin=\${c$V[$isst]}; fou=${sstsic_ou[$iv]} |
---|
| 562 | echo " $(f_in=\$SSTDIR/${fin##*/}; f_ou=$fou; eval echo ${get_sstsic[$itype]})" >> $job |
---|
| 563 | #--- Build the output file name |
---|
| 564 | m=${sstsic_in[$iv]}; p=${m%%'${Y}'*}; n=_clim${m##*'${Y}'} |
---|
| 565 | Yspan=_$(p=$p ; n=$n ; t=${fin##*$p}; t=${t%%$n*}; echo ${t##*/}) |
---|
| 566 | if ! [[ ${Yspan:1:4} =~ ^-?[0-9]+$ && ${Yspan:6:4} =~ ^-?[0-9]+$ ]]; then Yspan=""; fi |
---|
| 567 | lim_ou=limit${Yspan}_clim.nc |
---|
| 568 | ((iv++)) |
---|
| 569 | done |
---|
| 570 | fi |
---|
| 571 | if [[ $iclim -le $no && $okOzone = 'y' ]]; then iozo=$((iclim-1)) |
---|
| 572 | eval fin=\${cozo[$iozo]}; fou=climoz.nc |
---|
| 573 | echo " sed -i s%read_climoz=.*%read_climoz=$climoz% config.def" >> $job |
---|
| 574 | echo " $(f_in=\$OZODIR/${fin##*/}; f_ou=$fou; eval echo ${get_ozone[$itype]})" >> $job |
---|
| 575 | p=${o3f%%'${Y}'*}; n=_clim${o3f##*'${Y}'} |
---|
| 576 | Yspan=_$(p=$p ; n=$n ; t=${fin##*$p}; t=${t%%$n*}; echo ${t##*/}) |
---|
| 577 | if ! [[ ${Yspan:1:4} =~ ^-?[0-9]+$ && ${Yspan:6:4} =~ ^-?[0-9]+$ ]]; then Yspan=""; fi |
---|
| 578 | ozo_ou=climoz_LMDZ${Yspan}_clim.nc |
---|
| 579 | fi |
---|
| 580 | echo " sed -i s%anneeref=.*%anneeref=1980% run.def" >> $job |
---|
| 581 | echo " $run $ce0l" >> $job |
---|
| 582 | if [ $iclim -le $ns ]; then |
---|
| 583 | if [ "$cl" = "gregorian" ]; then |
---|
| 584 | echo " mv limit.nc \$LIMTOU/${lim_ou%.nc*}_leap.nc" >> $job |
---|
| 585 | echo " sed -i s%anneeref=.*%anneeref=1982% run.def" >> $job |
---|
| 586 | echo " $run $ce0l" >> $job |
---|
| 587 | echo " mv limit.nc \$LIMTOU/${lim_ou%.nc*}_noleap.nc" >> $job |
---|
| 588 | else |
---|
| 589 | echo " mv limit.nc \$LIMTOU/$lim_ou" >> $job |
---|
| 590 | fi |
---|
| 591 | fi |
---|
| 592 | if [[ $iclim -le $no && $okOzone = 'y' ]]; then |
---|
| 593 | echo " mv climoz_LMDZ.nc \$OZONOU/$ozo_ou" >> $job |
---|
| 594 | fi |
---|
| 595 | done |
---|
| 596 | echo " cd .. ; rm -rf \$tmp" >> $job |
---|
| 597 | ((io2a++)) |
---|
| 598 | ((ijob++)); progress_bar $ijob $njobs 50 |
---|
| 599 | #------------------------------------------------------------------------------- |
---|
| 600 | done; ((ical++)) |
---|
| 601 | #------------------------------------------------------------------------------- |
---|
| 602 | done |
---|
| 603 | #------------------------------------------------------------------------------- |
---|
| 604 | done ; ((itype++)) |
---|
| 605 | #------------------------------------------------------------------------------- |
---|
| 606 | done |
---|
| 607 | #------------------------------------------------------------------------------- |
---|
| 608 | echo |
---|
| 609 | |
---|