source: BOL/LMDZ_Setup/script_SIMU @ 5425

Last change on this file since 5425 was 5422, checked in by fhourdin, 15 hours ago

Changing $SUBMITCMD to a function submitcmd

Need for local use of LMDZ

File size: 15.5 KB
Line 
1#!/bin/bash
2## Headers managed by sed
3#@JZ#JeanZay
4#@JZ#SBATCH --job-name=NOM_SIMU         # nom du job
5#@JZ# Nombre de processus MPI :
6#@JZ#SBATCH --ntasks=8
7#@JZ##### number of MPI processes per node : 40(procs/node on Jean-Zay) / cpus-per-task (ex : =5 for 8 OMP)
8#@JZ####SBATCH --ntasks-per-node=5    # if specified, also add "#SBATCH --nodes= ..."  with nodes=ntasks/(ntasks-per-node)
9#@JZ# nombre de threads OpenMP
10#@JZ#SBATCH --cpus-per-task=8
11#@JZ# de Slurm "multithread" fait bien reference a l'hyperthreading.
12#@JZ#SBATCH --hint=nomultithread       # 1 thread par coeur physique (pas d'hyperthreading)
13#@JZ#SBATCH --time=00:30:00            # Temps d execution maximum demande (HH:MM:SS)
14#@JZ#SBATCH --output=outNOM_SIMU%j     # Nom du fichier de sortie
15#@JZ#SBATCH --error=outNOM_SIMU%j      # Nom du fichier d'erreur (ici commun avec la sortie)
16#@JZ# To submit to test queue ; "time" (above) must be max 30 min
17#@JZ#TESTQ#SBATCH --qos=qos_cpu-dev
18#@SP#Spirit
19#@SP#SBATCH --job-name=NOM_SIMU
20#@SP#SBATCH --ntasks=8
21#@SP#SBATCH --cpus-per-task=8
22#@SP#SBATCH --time=00:30:00
23#@SP#SBATCH --output=outNOM_SIMU%j
24#@SP#SBATCH --error=outNOM_SIMU%j
25#@ADS#Adastra
26#@ADS#SBATCH --job-name=NOM_SIMU
27#@ADS#SBATCH --ntasks=8
28#@ADS#SBATCH --cpus-per-task=8
29#@ADS#SBATCH --ntasks-per-node=8
30#@ADS#SBATCH --time=00:30:00
31#@ADS#SBATCH --output=outNOM_SIMU%j
32#@ADS#SBATCH --error=outNOM_SIMU%j
33#@ADS#SBATCH --exclusive
34
35set -eux
36
37# Number of MPI processes :
38ntasks=8
39# number of OpenMP threads
40nthreads=8
41export OMP_NUM_THREADS=$nthreads
42#@JZ#export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK  # For Jean-Zay (replacing the next 3 lines, commented out)
43# private memory for each thread
44export OMP_STACKSIZE=800M
45
46
47#@JZ#export OMP_PLACES=cores  # "binding" present in old script_SIMU, but terribly reduces performance on Spirit...
48ulimit -s unlimited
49#@SP ulimit -Ss 8192
50
51simul=NOM_SIMU
52
53reseau_local=0
54#veget=y
55veget=CMIP6
56if [[ $veget = "none" ]] ; then VEGET=n ; else VEGET=y ; fi
57
58isotopes=n
59# If isotopes=y, initialisation_iso will be changed to 0 in iso.def after the 1st run period, to read isotopes in restart files
60
61# Choice of aerosols : n / clim / spla
62aerosols=clim
63stopsim=201101
64ok_guide=y   # y/n guidage ou non
65climato=1
66
67echo '##############################################################'
68echo '# Gestion des repertoires de lancement                                 '
69echo '##############################################################'
70
71# Repertoires de la simulation
72SCRATCHD=$SCRATCH
73STORED=$STORE
74MAINDIR=LMDZOR96x95x79
75SIMU_dir=$MAINDIR/$simul
76SIMUDIR=$STORED/$SIMU_dir
77
78# Repertoires de travail
79WWORKD=$SCRATCHD/$simul$$
80if [[ -d $WWORKD ]]; then  # useful when running on local computer, where jobs aren't submitted
81  #rm -rf "$WWORKD"
82  mv $WWORKD $WWORKD$$
83fi
84mkdir -p $WWORKD
85cd $WWORKD
86SCRIPTDIR=$SCRATCHD
87
88cp "$STORED/$MAINDIR/lmdz_env.sh" .; . lmdz_env.sh
89cp "$STORED/$MAINDIR/slurm_set_cpu_binding.sh" .
90
91ERADIR=$STORED/$MAINDIR/GUIDE
92if [ "$aerosols" = "spla" ] ; then ERA10mDIR=$STORED/$MAINDIR/ERA10m ; fi
93LIMITDIR=$STORED/$MAINDIR/LIMIT
94SPLADIR=$STORED/$MAINDIR/INPUT_SPLA
95DEFDIR=$SIMUDIR/DEF
96
97GET='ln -s'
98PUT='mv '
99
100
101echo '##################################################################'
102echo 'Gestion des mois et annees'
103echo '##################################################################'
104
105$GET $SIMUDIR/etat
106year=`tail -1 etat | awk ' { print $1 } ' | cut -c1-4`
107month=`tail -1 etat | awk ' { print $1 } ' | cut -c5-`
108echo year $year month $month
109
110if [ "$month" = "" ] ; then
111   paran=1
112   ym=$year
113   next=`expr $ym + 1`
114else
115   paran=0
116   if [ $month = 12 ] ; then
117      nextmonth=1
118      nextyear=`expr $year + 1`
119   else
120      nextmonth=`expr $month + 1`
121      nextyear=$year
122   fi
123   if [ `echo $nextmonth | wc -m` = 2  ] ; then
124      nextmonth=0$nextmonth
125   fi
126   ym=$year$month
127   next=$nextyear$nextmonth
128fi
129
130
131echo ym $ym
132echo mois ancien  : $ym
133echo mois nouveau : $next
134
135INI=${SPLADIR}/INITIAL
136PERIOD=${SPLADIR}/PERIOD00${month}/SUB
137
138echo '#################################################################'
139echo 'Modification de run.def et gcm.def pour prendre en compte la duree du'
140echo 'du mois en question.'
141echo 'le dayref est modifie pour tricher avec le calendrier (ecrit pour'
142echo 'une annee de 260 jours dans le modele).'
143echo 'On passe donc comme jour de reference le numero du jour du mois dans'
144echo 'une annee en 360 jours.'
145echo '#################################################################'
146
147# Choix du calendrier
148#AS: La condition if "$climato" = "0" suffit, car "$ok_guide" = "y" est interdit avec $climato" = "1" dans setup.sh (exit ligne 160)
149##calend=earth_360d
150##if [ "$ok_guide" = "y" -o "$climato" = "0" ] ; then calend=gregorian ; fi
151if [ "$climato" = "0" ] ; then calend=gregorian ; else calend=earth_360d ; fi
152bisextile=0
153if [[ $(( year % 4 )) = 0 && $calend = gregorian ]] ; then bisextile=1 ; fi
154if [ $paran = 0 ] ; then
155   if [ "$calend" = "gregorian" ] ; then
156      ndays=( 31 28 31 30 31 30 31 31 30 31 30 31 )
157      if [ $bisextile = 1 ] ; then ndays[1]=29 ; fi
158   else
159      ndays=( 30 30 30 30 30 30 30 30 30 30 30 30 )
160   fi
161   #Constants with a leading 0 are interpreted as octal numbers.
162   # You can remove the leading zero by parameter expansion: hour=${hour#0}
163
164   nday=${ndays[(( ${month#0} - 1 ))]}
165   ndayh=$nday
166   dayref=1 ; mm=1 ; while [ $mm -lt ${month#0} ] ; do
167    (( dayref = $dayref + ${ndays[(( $mm - 1 ))]} )) ; (( mm = $mm + 1 )) ; done
168else
169   dayref=1
170   if [ "$calend" = "gregorian" ] ; then
171      if [ $bisextile = 0 ] ; then nday=365 ; else nday=366 ; fi
172   else
173      nday=360 ; ndayh=30
174      # nday=3 ; ndayh=1 # Pratique pour des tests rapides
175   fi
176fi
177
178echo CALENDRIER $calend : longueur du mois vrai $year $month $nday dayref=$dayref
179
180
181echo '####################################################################'
182echo '# On va chercher les fichiers necessaires a la simulation'
183echo '####################################################################'
184#Reminder : we are in $WWORKD = $SCRATCHD/$SIMU_dir = $SCRATCHD/$MAINDIR/$simul
185
186echo DEFDIR $DEFDIR
187echo SIMUDIR $SIMUDIR
188echo simul $simul
189
190if [ $reseau_local = 0 ] ; then mkdir DEF ; cd DEF ; $GET $DEFDIR/* . ; cd .. ; fi
191
192cp -f DEF/* .
193#---The following changes in .def files will only be visible in the running directory (on SCRATCH if $reseau_local = 0)
194# They concern variables that change during runtime : nday, dayref, anneeref, ndayh
195# The other "sed" were totally or partially moved in setup.sh, to be done in $MAINDIR/DEF/*.def, before creating $MAINDIR/$SIMU (more transparent)
196#sed -e 's/ok_guide=.*.$/ok_guide='$ok_guide'/' DEF/guide.def >| guide.def
197#sed -e 's/nday=.*.$/nday='$nday'/' -e 's/dayref=.*.$/dayref='${dayref}'/' -e 's/calend=.*.$/calend='$calend'/' -e 's/anneeref=.*.$/anneeref='$year'/' DEF/run.def >| run.def
198
199#=====!!!!!!!!====!!!!!!====!!!!+++====!!!!!!====!!!!!!!=====!!!!!!====z!!!====!!!!========!!!!!========!!!
200##POUR que des TESTS soyent tres RAPIDES (pour ex, verifier fichiers input), ON FORCE nday=1 jour  !!!
201#nday=1
202#=====!!!!!!!!====!!!!!!====!!!!+++====!!!!!!====!!!!!!!=====!!!!!!====z!!!====!!!!========!!!!!========!!!
203
204sed -e 's/nday=.*.$/nday='$nday'/' -e 's/dayref=.*.$/dayref='${dayref}'/' -e 's/anneeref=.*.$/anneeref='$year'/' DEF/run.def >| run.def
205sed -e 's/phys_out_filetimesteps=[[:space:]]*[0-9][0-9]day/phys_out_filetimesteps=  '$ndayh'day/'  DEF/config.def >| config.def
206#--- End of *.def changes in the $WWORKD only
207
208${GET} $SIMUDIR/start.$ym.nc start.nc
209${GET} $SIMUDIR/startphy.$ym.nc startphy.nc
210if [ $climato = 1 ] ; then
211   ${GET} $LIMITDIR/limit.nc limit.nc
212else
213   ${GET} $LIMITDIR/limit.$year.nc limit.nc
214fi
215
216
217echo '####################################################################'
218echo '# Imports des fichiers aerosols si flag_aerosol>0 dans config.def, '
219echo '# et si dans setup.sh on a "aerosols=clim" ou "aerosols=spla". '
220echo '# NOTE: Si "aerosols=n" dans setup.sh, script_SIMU met flag_aerosol=0 et on tourne SANS aerosols' 
221echo '####################################################################'
222if [ "`grep 'flag_aerosol=' config.def | head -1 | cut -d= -f2`" != 0 ] ; then
223  if [ $aerosols = clim ] ; then
224    # if [ $climato = 1 ] ; then suf=clim ; else suf=$year ; fi
225    suf=clim
226    # Le script pourrait être sophistique pour prendre des aerosols interannuels
227    ${GET} $LIMITDIR/aerosols.$suf.nc aerosols$year.nc
228    if [ ! -f aerosols1980.nc ] ; then ${GET} $LIMITDIR/aerosols.$suf.nc aerosols1980.nc ; fi
229    ${GET} $LIMITDIR/aerosols.nat.nc aerosols.nat.nc
230  fi
231
232  ## Ca doit etre la meme liste de fichiers rapatriee par setup.sh dans $LMDZ_INIT/SPLA_Init
233  ## et interpolee (setup.sh aussi) dans $SPLADIR
234  if [ $aerosols = spla ] ; then 
235    inputf="wth.dat cly.dat donnees_lisa.nc SOILSPEC.data \
236                carbon_emissions.nc sulphur_emissions_antro.nc  \
237                sulphur_emissions_nat.nc  sulphur_emissions_volc.nc"
238    for file in $inputf ; do ${GET} $INI/$file . ; done
239
240    change="dust.nc "
241    for file in $change ; do ${GET} $PERIOD/$file . ; done
242
243    # Le calcul d'emissions de sels marins utilise les vents ERA-10m interpoles sur grille_s (lonv,latu) avec le script era2gcm_uv10m.sh
244    # NB : GET=ln -s ; ERA10mDIR contient lui-meme le lien ERA10m vers le repertoire des vents interpoles $REA_uv10m (REA=ERA5, ERAI ou OPERA)
245    ventl="u10m.nc v10m.nc"
246    for file in $ventl ; do ${GET} $ERA10mDIR/${year}/${month}/$file . ; done
247  fi
248fi
249
250#----------------------------------------
251# Noveaux forcages a activer a l'avenir
252#   (commentes en attendant) :
253#----------------------------------------
254#for file in climoz_LMDZ.nc solarforcing.nc  taulwstrat.2D.nc  tauswstrat.2D.nc ; do
255#   ${GET} $LIMITDIR/$file $file
256#done
257#----------------------------------------
258
259${GET} $SIMUDIR/gcm.e gcm.e ; chmod  +x gcm.e
260
261
262if [ $VEGET = y ] ; then
263    set +e ; for t in stomate sechiba ; do cp $SIMUDIR/start_$t.$ym.nc ${t}_rest_in.nc ; done ; set -e
264    if [ "`grep RIVER_ROUTING orchidee.def |grep -i y`" ] ; then
265      set +e ; ln -s $LMDZ_INIT/routing_simple.nc . ; ln -s $LMDZ_INIT/routing.nc .
266               cp $SIMUDIR/start_routing.$ym.nc routing_start.nc ; set -e
267    fi
268
269#For Orchidee trunk (post-CMIP6), orchidee_pft.def must be copied in addition to orchidee.def
270    \cp -f DEF/orchidee*.def .
271
272# Test sur sechiba_rest_in.nc,
273#  supposant que les restarts pour sechiba, stomate, et routing le cas echeant,
274#  sont soit tous dispo, soit tous absents
275    if [ ! -f sechiba_rest_in.nc ] ; then
276       echo '#########################################################'
277       echo "Autoinitialisation d'orchidee au besoin"
278       echo '#########################################################'
279       get="ln -s $LMDZ_INIT/"
280       for file in cartepente2d_15min.nc \
281          lai2D.nc soils_param.nc soil_bulk_and_ph.nc alb_bg_modisopt_2D_ESA_v2.nc reftemp.nc ; do ${get}$file ; done
282
283       ln -sf alb_bg_modisopt_2D_ESA_v2.nc alb_bg.nc
284
285       echo ATTENTION : ON UTILISE LES FICHIERS DE L ANNEE 2000
286       ${get}PFTmap_15PFT.v1_2000.nc PFTmap.nc
287       ${get}woodharvest_2000.nc woodharvest.nc
288
289       sed -e 's/^SECHIBA_restart_in.*./SECHIBA_restart_in=NONE/' \
290           -e 's/^STOMATE_RESTART_FILEIN.*./STOMATE_RESTART_FILEIN=NONE/' \
291           -i orchidee.def
292
293      if [ $veget = 7994 ] ; then
294         get="ln -s $LMDZ_INIT/"
295         for file in ndep_nhx.nc ndep_noy.nc nfert_cropland.nc nfert_pasture.nc nmanure_cropland.nc nmanure_pasture.nc bnf.nc ; do ${get}$file ; done
296      fi
297
298    fi
299
300fi
301
302
303echo '#################################################################'
304echo    'Repertoire contenant les fichiers de reanalyses'
305echo '#################################################################'
306
307if [ "$ok_guide" = "y" ] ; then
308   \rm -f u.nc v.nc T.nc hur.nc
309   if [ -f u.nc ] ; then
310      echo PROBLEME D EFFACEMENT DES FICHIERS DE REANALYSES
311      exit 1
312   fi
313   for var in u v T hur ; do $GET $ERADIR/$year/$month/$var.nc $var.nc ; done
314   echo Fin du rapatriement des fichiers de guidage
315fi
316
317echo '##################################################################'
318echo    'liste des fichiers avant le lancement de la simulation'
319echo '##################################################################'
320ls -lrt
321#diff DEF ./
322
323echo '##################################################################'
324echo    'Lancement de la simulation'
325echo '##################################################################'
326
327#@ADS if 1; then
328time $MPICMD $ntasks ./gcm.e > listing
329#@ADS else
330#@ADS srun --cpu-bind=none --mem-bind=none -- ./slurm_set_cpu_binding.sh ./gcm.e > listing
331#@ADS fi
332
333if [ ! -f restartphy.nc ] ; then
334echo PROBLEME PAS DE FICHIER RESTARTPHY
335exit
336fi
337
338echo '##################################################################'
339echo     'sauvegarde des fichiers de sortie'
340echo '##################################################################'
341
342# listing
343${PUT} listing ${SIMUDIR}/list$ym
344# if the listing for Orchidee is also needed, then uncomment the following line :
345#if [ $VEGET = y ] ; then ${PUT} out_orchidee_0000.0000 ${SIMUDIR}/out_orchidee$ym ; fi
346
347# restart(s)
348${PUT} restart.nc ${SIMUDIR}/start.$next.nc
349${PUT} restartphy.nc ${SIMUDIR}/startphy.$next.nc
350if [ $VEGET = y ] ; then for t in sechiba stomate ; do
351    f=${t}_rest_out.nc ; if [ -f $f ] ; then ${PUT} $f ${SIMUDIR}/start_$t.$next.nc ; fi ; done 
352    f=routing_restart.nc ; if [ -f $f ] ; then ${PUT} $f ${SIMUDIR}/start_routing.$next.nc ; fi
353fi
354
355# fichiers "histoires"
356# Si on tourne avec xios (et type="one_file") au lieu de ioipsl, on n'a pas besoin de rebuild, on doit juste copier les fichiers
357liste_out="histmth histday histhf histmthCOSP Xhistins XhistLES sechiba_history sechiba_history_4dim sechiba_out_2 stomate_history stomate_ipcc_history diag_routing dynzon"
358xios_used=0
359
360for fileout in $liste_out ; do
361  if [ -f  $fileout.nc ] ; then 
362     ${PUT} $fileout.nc ${SIMUDIR}/$fileout.$ym.nc
363     xios_used=1
364  fi
365done
366
367if [ $xios_used = 0 ] ; then
368  $GET $SIMUDIR/reb.sh
369  chmod +x reb.sh
370  ./reb.sh $ym $SIMUDIR $liste_out
371fi
372
373if [ -f guide_ins.nc ] ; then ${PUT} guide_ins.nc ${SIMUDIR}/guide_ins.$ym.nc ; fi
374
375echo '##################################################################'
376echo     'preparation et lancement de la simulation suivante'
377echo '##################################################################'
378
379# Gestion du fichier etat de controle de la simulation
380echo $ym OK >> etat
381echo $next a faire >> etat
382# ${PUT} etat $SIMUDIR/etat # Pas necessaire car etat est un lien vers $SIMUDIR/etat
383
384# set initialisation_iso to 0 for next run to read isotopes from restart files
385if [ $isotopes = y ] ; then
386   sed -i 's/^initialisation_iso=.*.$/initialisation_iso=0/' $SIMUDIR/DEF/iso.def
387fi
388set +e ; \rm out* sec* sta* list* rest* gcm.e aer* ; set -e
389
390# Arret si on est arrive au bout
391if [ $next =  $stopsim ] ; then
392   echo 'On arrive au bout, simulation next:'$next', stopsim:'$stopsim
393   # Cas particulier ou on veut chainer plusieurs simulations multi annuelles.
394   # pour le tuning automatique.
395   # Ici on passe de SCM_1-019 a SCM_1-029
396   if [ "${simul:0:3}" = "SCM" ] ; then
397      pre="SCM_1-"
398      num=`echo $simul | sed -e 's/'$pre'//'`
399      # (( num = $num + 10 )) change a cause d un probleme avec 008
400      num=`echo $num | awk ' { print $1 + 10 } '`
401      num=`printf "%03d\n" $num`
402      simul_new=$pre$num
403      cd $SCRIPTDIR
404      if [ $num -le 250 ] ; then
405         sed -e 's/^simul=.*.$/simul='$simul_new'/' -e 's/^\# @ job_nam.*.=.*.$/\# @ job_name = '$simul_new'/' tmp_$simul >| tmp_$simul_new
406         submitcmd tmp_$simul_new
407      fi
408   fi
409   exit
410fi
411
412
413echo '##################################################################'
414echo      'lancement de la simulation suivante tmp_'$simul' depuis :'
415echo '##################################################################'
416pwd
417
418
419cd $SCRIPTDIR
420submitcmd tmp_$simul
421#$SUBMITCMD tmp_$simul
Note: See TracBrowser for help on using the repository browser.