source: TOOLS/CMIP6_FORCING/OZONE/gen_jobs_ce0l.bash @ 3744

Last change on this file since 3744 was 3744, checked in by cugnet, 6 years ago

Few corrections in clims_CMIP6.bash, in particular:

  • paths corrections to match final files organization.
  • boundary variables indicated by "bounds" attributes are also renamed.

Jobs generator "gen_jobs_ce0l.bash" introduced.

File size: 27.4 KB
Line 
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#===============================================================================
23if   [ ${HOSTNAME:0:3} = 'ada'   ]; then machine='ada';    work=$WORKDIR
24elif [ ${HOSTNAME:0:5} = 'curie' ]; then machine='curie'work=$CCCWORKDIR
25elif [ ${HOSTNAME:0:6} = 'ciclad']; then machine='ciclad'; work=/data/$USER
26else echo "Not set up for this machine yet, sorry."; exit; fi
27export machine=$machine
28
29#===============================================================================
30#=== PARAMETERS YOU WILL PROBABLY NEED TO CHANGE ===============================
31#===============================================================================
32#=== GENERAL PARAMETERS
33GENCI_ID='gen1168'                           #= GENCI project ID (for CURIE)
34etat0=n                                      #= BUILD "start.nc" & "startphy.nc" (initial states) FILES (y/n)
35limit=n                                      #= BUILD "limit.nc" (boundary conditions) FILES (y/n)
36climoz=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)
40res=('96x95x39' '144x142x79')
41cal='earth_360d'
42
43#=== PARAMETERS RELATED TO SST/SIC
44Ybs=1870; Yes=2008
45STYPE='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
48SVERS='20170419'
49LIMOUT='$work/IGCM/ATM/LIMIT/$sstp/interpol/${rs}_${oatp}_$cl'
50
51#=== PARAMETERS RELATED TO OZONE
52Ybo=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
56OTYPE=('UReading')                           #= ozone   files type                    (at least one)
57OVERS=('historical.v20160711')               #= corresponding versions tags  (one each o3 file type)
58OZOOUT='$work/IGCM/ATM/OZONE/$o3tp/$o3vs/interpol/${rs}' #= ozone   output files storage folder
59
60#=== PARAMETERS RELATED TO INITIAL STATES
61INIOUT='$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
67ce0l="./ce0lseq.e"                           #= command to run ce0l executable in jobs
68BINDIR=$PWD/bin                              #= folder containing ce0l executable(s)
69
70#--- CONFIGURATION FILES
71DEFDIR=$PWD/DefLists                         #= folder containing parameters files
72                                             #= List of *.def files ; any change of name: after ":".
73defslist='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")
77case $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="";;
81esac
82DATAIN_TMP=$work/IGCM
83
84#--- CLIMATOLOGIES FOLDER AND CORRESPONDING NEEDED FILES
85CLIDIR=$DATAIN/ATM
86climslist="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'
90SSTSIN='$DATAIN/ATM/LIMIT/$sstp/original/360x180/BCS'
91
92case $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') ;;
105esac
106
107#--- INPUT OZONE FILES NAMES + STANDARD NAMES KNOW BY ce0l
108#OZONIN='$DATAIN/ATM/Ozone/$o3tp/$o3vs'
109OZONIN='$DATAIN_TMP/ATM/OZONE/$o3tp/$o3vs/original/144x96x66'
110ozonefile='tro3_${Y}.nc'
111ozonehybr='tro3_${Y}.new.nc'
112
113#--- PARAMETERS RELATED TO o2a.nc
114O2CDIR=$DATAIN/ATM/IPSLCM6
115
116#===============================================================================
117#=== FEW FUNCTIONS =============================================================
118#===============================================================================
119function addc {
120  local s
121  s="$1"; while [ ${#s} -lt $2 ]; do s="_$s"; done ; echo "$s"; unset s
122}
123#==================================================================================
124function 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#==================================================================================
137function 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#===============================================================================
182function 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#===============================================================================
212function 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#===============================================================================
221function 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
281mrs=""
282#-------------------------------------------------------------------------------
283for 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#-------------------------------------------------------------------------------
290done
291#-------------------------------------------------------------------------------
292if [ "$mrs" != "" ]; then echo "No executable available."; exit; fi
293
294#=== IF SELECTED TYPE IS "AMIP", THEN USE SEVERAL VERSIONS FROM $SVERS VARIABLE.
295TYPE=$STYPE;
296if [ "$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
300itype=0; Ybsst=(); Yesst=(); Ybsic=(); Yesic=()
301#-------------------------------------------------------------------------------
302for 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#-------------------------------------------------------------------------------
317done                                         #--- TYPES
318#-------------------------------------------------------------------------------
319
320#=== CHECK THE OZONE FILES ARE THERE FOR EACH REQUIRED YEAR
321if [ $climoz -ne 0 ]; then
322itype=0; Ybozo=(); Yeozo=()
323#-------------------------------------------------------------------------------
324for 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#-------------------------------------------------------------------------------
337done                                         #--- TYPES
338#-------------------------------------------------------------------------------
339fi
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
350echo ">>> GENERATING JOBS..."
351no2a=0
352for rs in ${res[@]}; do
353  n=$(ls $O2CDIR/*LMD${rs%x*}/o2a.nc 2> /dev/null|wc -l); no2a=$((no2a+n+1))
354done
355njobs=$(($(echo $TYPE|wc -w)*$(echo $cal|wc -w)*$no2a))
356itype=0; ijob=0
357#-------------------------------------------------------------------------------
358for 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=$okO3if [[ $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#-------------------------------------------------------------------------------
606done
607#-------------------------------------------------------------------------------
608echo
609
Note: See TracBrowser for help on using the repository browser.