source: BOL/LMDZ_Setup/script_SIMU @ 5421

Last change on this file since 5421 was 5421, checked in by fhourdin, 7 hours ago

Following

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#@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   fi
175fi
176
177echo CALENDRIER $calend : longueur du mois vrai $year $month $nday dayref=$dayref
178
179
180echo '####################################################################'
181echo '# On va chercher les fichiers necessaires a la simulation'
182echo '####################################################################'
183#Reminder : we are in $WWORKD = $SCRATCHD/$SIMU_dir = $SCRATCHD/$MAINDIR/$simul
184
185echo DEFDIR $DEFDIR
186echo SIMUDIR $SIMUDIR
187echo simul $simul
188
189if [ $reseau_local = 0 ] ; then mkdir DEF ; cd DEF ; $GET $DEFDIR/* . ; cd .. ; fi
190
191cp -f DEF/* .
192#---The following changes in .def files will only be visible in the running directory (on SCRATCH if $reseau_local = 0)
193# They concern variables that change during runtime : nday, dayref, anneeref, ndayh
194# The other "sed" were totally or partially moved in setup.sh, to be done in $MAINDIR/DEF/*.def, before creating $MAINDIR/$SIMU (more transparent)
195#sed -e 's/ok_guide=.*.$/ok_guide='$ok_guide'/' DEF/guide.def >| guide.def
196#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
197
198#=====!!!!!!!!====!!!!!!====!!!!+++====!!!!!!====!!!!!!!=====!!!!!!====z!!!====!!!!========!!!!!========!!!
199##POUR que des TESTS soyent tres RAPIDES (pour ex, verifier fichiers input), ON FORCE nday=1 jour  !!!
200#nday=1
201#=====!!!!!!!!====!!!!!!====!!!!+++====!!!!!!====!!!!!!!=====!!!!!!====z!!!====!!!!========!!!!!========!!!
202
203sed -e 's/nday=.*.$/nday='$nday'/' -e 's/dayref=.*.$/dayref='${dayref}'/' -e 's/anneeref=.*.$/anneeref='$year'/' DEF/run.def >| run.def
204sed -e 's/phys_out_filetimesteps=[[:space:]]*[0-9][0-9]day/phys_out_filetimesteps=  '$ndayh'day/'  DEF/config.def >| config.def
205#--- End of *.def changes in the $WWORKD only
206
207${GET} $SIMUDIR/start.$ym.nc start.nc
208${GET} $SIMUDIR/startphy.$ym.nc startphy.nc
209if [ $climato = 1 ] ; then
210   ${GET} $LIMITDIR/limit.nc limit.nc
211else
212   ${GET} $LIMITDIR/limit.$year.nc limit.nc
213fi
214
215
216echo '####################################################################'
217echo '# Imports des fichiers aerosols si flag_aerosol>0 dans config.def, '
218echo '# et si dans setup.sh on a "aerosols=clim" ou "aerosols=spla". '
219echo '# NOTE: Si "aerosols=n" dans setup.sh, script_SIMU met flag_aerosol=0 et on tourne SANS aerosols' 
220echo '####################################################################'
221if [ "`grep 'flag_aerosol=' config.def | head -1 | cut -d= -f2`" != 0 ] ; then
222  if [ $aerosols = clim ] ; then
223    # if [ $climato = 1 ] ; then suf=clim ; else suf=$year ; fi
224    suf=clim
225    # Le script pourrait être sophistique pour prendre des aerosols interannuels
226    ${GET} $LIMITDIR/aerosols.$suf.nc aerosols$year.nc
227    if [ ! -f aerosols1980.nc ] ; then ${GET} $LIMITDIR/aerosols.$suf.nc aerosols1980.nc ; fi
228    ${GET} $LIMITDIR/aerosols.nat.nc aerosols.nat.nc
229  fi
230
231  ## Ca doit etre la meme liste de fichiers rapatriee par setup.sh dans $LMDZ_INIT/SPLA_Init
232  ## et interpolee (setup.sh aussi) dans $SPLADIR
233  if [ $aerosols = spla ] ; then 
234    inputf="wth.dat cly.dat donnees_lisa.nc SOILSPEC.data \
235                carbon_emissions.nc sulphur_emissions_antro.nc  \
236                sulphur_emissions_nat.nc  sulphur_emissions_volc.nc"
237    for file in $inputf ; do ${GET} $INI/$file . ; done
238
239    change="dust.nc "
240    for file in $change ; do ${GET} $PERIOD/$file . ; done
241
242    # Le calcul d'emissions de sels marins utilise les vents ERA-10m interpoles sur grille_s (lonv,latu) avec le script era2gcm_uv10m.sh
243    # NB : GET=ln -s ; ERA10mDIR contient lui-meme le lien ERA10m vers le repertoire des vents interpoles $REA_uv10m (REA=ERA5, ERAI ou OPERA)
244    ventl="u10m.nc v10m.nc"
245    for file in $ventl ; do ${GET} $ERA10mDIR/${year}/${month}/$file . ; done
246  fi
247fi
248
249#----------------------------------------
250# Noveaux forcages a activer a l'avenir
251#   (commentes en attendant) :
252#----------------------------------------
253#for file in climoz_LMDZ.nc solarforcing.nc  taulwstrat.2D.nc  tauswstrat.2D.nc ; do
254#   ${GET} $LIMITDIR/$file $file
255#done
256#----------------------------------------
257
258${GET} $SIMUDIR/gcm.e gcm.e ; chmod  +x gcm.e
259
260
261if [ $VEGET = y ] ; then
262    set +e ; for t in stomate sechiba ; do cp $SIMUDIR/start_$t.$ym.nc ${t}_rest_in.nc ; done ; set -e
263    if [ "`grep RIVER_ROUTING orchidee.def |grep -i y`" ] ; then
264      set +e ; ln -s $LMDZ_INIT/routing_simple.nc . ; ln -s $LMDZ_INIT/routing.nc .
265               cp $SIMUDIR/start_routing.$ym.nc routing_start.nc ; set -e
266    fi
267
268#For Orchidee trunk (post-CMIP6), orchidee_pft.def must be copied in addition to orchidee.def
269    \cp -f DEF/orchidee*.def .
270
271# Test sur sechiba_rest_in.nc,
272#  supposant que les restarts pour sechiba, stomate, et routing le cas echeant,
273#  sont soit tous dispo, soit tous absents
274    if [ ! -f sechiba_rest_in.nc ] ; then
275       echo '#########################################################'
276       echo "Autoinitialisation d'orchidee au besoin"
277       echo '#########################################################'
278       get="ln -s $LMDZ_INIT/"
279       for file in cartepente2d_15min.nc \
280          lai2D.nc soils_param.nc soil_bulk_and_ph.nc alb_bg_modisopt_2D_ESA_v2.nc reftemp.nc ; do ${get}$file ; done
281
282       ln -sf alb_bg_modisopt_2D_ESA_v2.nc alb_bg.nc
283
284       echo ATTENTION : ON UTILISE LES FICHIERS DE L ANNEE 2000
285       ${get}PFTmap_15PFT.v1_2000.nc PFTmap.nc
286       ${get}woodharvest_2000.nc woodharvest.nc
287
288       sed -e 's/^SECHIBA_restart_in.*./SECHIBA_restart_in=NONE/' \
289           -e 's/^STOMATE_RESTART_FILEIN.*./STOMATE_RESTART_FILEIN=NONE/' \
290           -i orchidee.def
291
292      if [ $veget = 7994 ] ; then
293         get="ln -s $LMDZ_INIT/"
294         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
295      fi
296
297    fi
298
299fi
300
301
302echo '#################################################################'
303echo    'Repertoire contenant les fichiers de reanalyses'
304echo '#################################################################'
305
306if [ "$ok_guide" = "y" ] ; then
307   \rm -f u.nc v.nc T.nc hur.nc
308   if [ -f u.nc ] ; then
309      echo PROBLEME D EFFACEMENT DES FICHIERS DE REANALYSES
310      exit 1
311   fi
312   for var in u v T hur ; do $GET $ERADIR/$year/$month/$var.nc $var.nc ; done
313   echo Fin du rapatriement des fichiers de guidage
314fi
315
316echo '##################################################################'
317echo    'liste des fichiers avant le lancement de la simulation'
318echo '##################################################################'
319ls -lrt
320#diff DEF ./
321
322echo '##################################################################'
323echo    'Lancement de la simulation'
324echo '##################################################################'
325
326#@ADS if 1; then
327time $MPICMD $ntasks ./gcm.e > listing
328#@ADS else
329#@ADS srun --cpu-bind=none --mem-bind=none -- ./slurm_set_cpu_binding.sh ./gcm.e > listing
330#@ADS fi
331
332if [ ! -f restartphy.nc ] ; then
333echo PROBLEME PAS DE FICHIER RESTARTPHY
334exit
335fi
336
337echo '##################################################################'
338echo     'sauvegarde des fichiers de sortie'
339echo '##################################################################'
340
341# listing
342${PUT} listing ${SIMUDIR}/list$ym
343# if the listing for Orchidee is also needed, then uncomment the following line :
344#if [ $VEGET = y ] ; then ${PUT} out_orchidee_0000.0000 ${SIMUDIR}/out_orchidee$ym ; fi
345
346# restart(s)
347${PUT} restart.nc ${SIMUDIR}/start.$next.nc
348${PUT} restartphy.nc ${SIMUDIR}/startphy.$next.nc
349if [ $VEGET = y ] ; then for t in sechiba stomate ; do
350    f=${t}_rest_out.nc ; if [ -f $f ] ; then ${PUT} $f ${SIMUDIR}/start_$t.$next.nc ; fi ; done 
351    f=routing_restart.nc ; if [ -f $f ] ; then ${PUT} $f ${SIMUDIR}/start_routing.$next.nc ; fi
352fi
353
354# fichiers "histoires"
355# 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
356liste_out="histmth histday histhf histmthCOSP Xhistins XhistLES sechiba_history sechiba_history_4dim sechiba_out_2 stomate_history stomate_ipcc_history diag_routing dynzon"
357xios_used=0
358
359for fileout in $liste_out ; do
360  if [ -f  $fileout.nc ] ; then 
361     ${PUT} $fileout.nc ${SIMUDIR}/$fileout.$ym.nc
362     xios_used=1
363  fi
364done
365
366if [ $xios_used = 0 ] ; then
367  $GET $SIMUDIR/reb.sh
368  chmod +x reb.sh
369  ./reb.sh $ym $SIMUDIR $liste_out
370fi
371
372if [ -f guide_ins.nc ] ; then ${PUT} guide_ins.nc ${SIMUDIR}/guide_ins.$ym.nc ; fi
373
374echo '##################################################################'
375echo     'preparation et lancement de la simulation suivante'
376echo '##################################################################'
377
378# Gestion du fichier etat de controle de la simulation
379echo $ym OK >> etat
380echo $next a faire >> etat
381# ${PUT} etat $SIMUDIR/etat # Pas necessaire car etat est un lien vers $SIMUDIR/etat
382
383# set initialisation_iso to 0 for next run to read isotopes from restart files
384if [ $isotopes = y ] ; then
385   sed -i 's/^initialisation_iso=.*.$/initialisation_iso=0/' $SIMUDIR/DEF/iso.def
386fi
387set +e ; \rm out* sec* sta* list* rest* gcm.e aer* ; set -e
388
389# Arret si on est arrive au bout
390if [ $next =  $stopsim ] ; then
391   echo 'On arrive au bout, simulation next:'$next', stopsim:'$stopsim
392   # Cas particulier ou on veut chainer plusieurs simulations multi annuelles.
393   # pour le tuning automatique.
394   # Ici on passe de SCM_1-019 a SCM_1-029
395   if [ "${simul:0:3}" = "SCM" ] ; then
396      pre="SCM_1-"
397      num=`echo $simul | sed -e 's/'$pre'//'`
398      # (( num = $num + 10 )) change a cause d un probleme avec 008
399      num=`echo $num | awk ' { print $1 + 10 } '`
400      num=`printf "%03d\n" $num`
401      simul_new=$pre$num
402      cd $SCRIPTDIR
403      if [ $num -le 250 ] ; then
404         sed -e 's/^simul=.*.$/simul='$simul_new'/' -e 's/^\# @ job_nam.*.=.*.$/\# @ job_name = '$simul_new'/' tmp_$simul >| tmp_$simul_new
405         $SUBMITCMD tmp_$simul_new
406      fi
407   fi
408   exit
409fi
410
411
412echo '##################################################################'
413echo      'lancement de la simulation suivante tmp_'$simul' depuis :'
414echo '##################################################################'
415pwd
416
417
418cd $SCRIPTDIR
419$SUBMITCMD tmp_$simul
Note: See TracBrowser for help on using the repository browser.