source: BOL/LMDZ_Setup_amaury/script_SIMU @ 5052

Last change on this file since 5052 was 5052, checked in by abarral, 4 months ago

Fix CPU binding on Adastra

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