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 | |
---|