#!/bin/bash ## Headers managed by sed #@JZ#JeanZay #@JZ#SBATCH --job-name=NOM_SIMU # nom du job #@JZ# Nombre de processus MPI : #@JZ#SBATCH --ntasks=8 #@JZ##### number of MPI processes per node : 40(procs/node on Jean-Zay) / cpus-per-task (ex : =5 for 8 OMP) #@JZ####SBATCH --ntasks-per-node=5 # if specified, also add "#SBATCH --nodes= ..." with nodes=ntasks/(ntasks-per-node) #@JZ# nombre de threads OpenMP #@JZ#SBATCH --cpus-per-task=8 #@JZ# de Slurm "multithread" fait bien reference a l'hyperthreading. #@JZ#SBATCH --hint=nomultithread # 1 thread par coeur physique (pas d'hyperthreading) #@JZ#SBATCH --time=00:30:00 # Temps d execution maximum demande (HH:MM:SS) #@JZ#SBATCH --output=outNOM_SIMU%j # Nom du fichier de sortie #@JZ#SBATCH --error=outNOM_SIMU%j # Nom du fichier d'erreur (ici commun avec la sortie) #@JZ# To submit to test queue ; "time" (above) must be max 30 min #@JZ#TESTQ#SBATCH --qos=qos_cpu-dev #@SP#Spirit #@SP#SBATCH --job-name=NOM_SIMU #@SP#SBATCH --ntasks=8 #@SP#SBATCH --cpus-per-task=8 #@SP#SBATCH --time=00:30:00 #@SP#SBATCH --output=outNOM_SIMU%j #@SP#SBATCH --error=outNOM_SIMU%j #@ADS#Adastra #@ADS#SBATCH --job-name=NOM_SIMU #@ADS#SBATCH --ntasks=8 #@ADS#SBATCH --cpus-per-task=8 #@ADS#SBATCH --ntasks-per-node=8 #@ADS#SBATCH --time=00:30:00 #@ADS#SBATCH --output=outNOM_SIMU%j #@ADS#SBATCH --error=outNOM_SIMU%j #@ADS#SBATCH --exclusive set -eux # Number of MPI processes : ntasks=8 # number of OpenMP threads nthreads=8 export OMP_NUM_THREADS=$nthreads #@JZ#export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK # For Jean-Zay (replacing the next 3 lines, commented out) # private memory for each thread export OMP_STACKSIZE=800M #@JZ#export OMP_PLACES=cores # "binding" present in old script_SIMU, but terribly reduces performance on Spirit... ulimit -s unlimited #@SP ulimit -Ss 8192 simul=NOM_SIMU reseau_local=0 #veget=y veget=CMIP6 if [[ $veget = "none" ]] ; then VEGET=n ; else VEGET=y ; fi isotopes=n # If isotopes=y, initialisation_iso will be changed to 0 in iso.def after the 1st run period, to read isotopes in restart files # Choice of aerosols : n / clim / spla aerosols=clim stopsim=201101 ok_guide=y # y/n guidage ou non climato=1 echo '##############################################################' echo '# Gestion des repertoires de lancement ' echo '##############################################################' # Repertoires de la simulation SCRATCHD=$SCRATCH STORED=$STORE MAINDIR=LMDZOR96x95x79 SIMU_dir=$MAINDIR/$simul SIMUDIR=$STORED/$SIMU_dir # Repertoires de travail WWORKD=$SCRATCHD/$simul$$ if [[ -d $WWORKD ]]; then # useful when running on local computer, where jobs aren't submitted #rm -rf "$WWORKD" mv $WWORKD $WWORKD$$ fi mkdir -p $WWORKD cd $WWORKD SCRIPTDIR=$SCRATCHD cp "$STORED/$MAINDIR/lmdz_env.sh" .; . lmdz_env.sh cp "$STORED/$MAINDIR/slurm_set_cpu_binding.sh" . ERADIR=$STORED/$MAINDIR/GUIDE if [ "$aerosols" = "spla" ] ; then ERA10mDIR=$STORED/$MAINDIR/ERA10m ; fi LIMITDIR=$STORED/$MAINDIR/LIMIT DEFDIR=$SIMUDIR/DEF GET='ln -s' PUT='mv ' echo '##################################################################' echo 'Gestion des mois et annees' echo '##################################################################' $GET $SIMUDIR/etat year=`tail -1 etat | awk ' { print $1 } ' | cut -c1-4` month=`tail -1 etat | awk ' { print $1 } ' | cut -c5-` echo year $year month $month if [ "$month" = "" ] ; then paran=1 ym=$year next=`expr $ym + 1` else paran=0 if [ $month = 12 ] ; then nextmonth=1 nextyear=`expr $year + 1` else nextmonth=`expr $month + 1` nextyear=$year fi if [ `echo $nextmonth | wc -m` = 2 ] ; then nextmonth=0$nextmonth fi ym=$year$month next=$nextyear$nextmonth fi echo ym $ym echo mois ancien : $ym echo mois nouveau : $next echo '#################################################################' echo 'Modification de run.def et gcm.def pour prendre en compte la duree du' echo 'du mois en question.' echo 'le dayref est modifie pour tricher avec le calendrier (ecrit pour' echo 'une annee de 260 jours dans le modele).' echo 'On passe donc comme jour de reference le numero du jour du mois dans' echo 'une annee en 360 jours.' echo '#################################################################' # Choix du calendrier #AS: La condition if "$climato" = "0" suffit, car "$ok_guide" = "y" est interdit avec $climato" = "1" dans setup.sh (exit ligne 160) ##calend=earth_360d ##if [ "$ok_guide" = "y" -o "$climato" = "0" ] ; then calend=gregorian ; fi if [ "$climato" = "0" ] ; then calend=gregorian ; else calend=earth_360d ; fi bisextile=0 if [[ $(( year % 4 )) = 0 && $calend = gregorian ]] ; then bisextile=1 ; fi if [ $paran = 0 ] ; then if [ "$calend" = "gregorian" ] ; then ndays=( 31 28 31 30 31 30 31 31 30 31 30 31 ) if [ $bisextile = 1 ] ; then ndays[1]=29 ; fi else ndays=( 30 30 30 30 30 30 30 30 30 30 30 30 ) fi #Constants with a leading 0 are interpreted as octal numbers. # You can remove the leading zero by parameter expansion: hour=${hour#0} nday=${ndays[(( ${month#0} - 1 ))]} ndayh=$nday dayref=1 ; mm=1 ; while [ $mm -lt ${month#0} ] ; do (( dayref = $dayref + ${ndays[(( $mm - 1 ))]} )) ; (( mm = $mm + 1 )) ; done else dayref=1 if [ "$calend" = "gregorian" ] ; then if [ $bisextile = 0 ] ; then nday=365 ; else nday=366 ; fi else nday=360 ; ndayh=30 # nday=3 ; ndayh=1 # Pratique pour des tests rapides fi fi echo CALENDRIER $calend : longueur du mois vrai $year $month $nday dayref=$dayref echo '####################################################################' echo '# On va chercher les fichiers necessaires a la simulation' echo '####################################################################' #Reminder : we are in $WWORKD = $SCRATCHD/$SIMU_dir = $SCRATCHD/$MAINDIR/$simul echo DEFDIR $DEFDIR echo SIMUDIR $SIMUDIR echo simul $simul if [ $reseau_local = 0 ] ; then mkdir DEF ; cd DEF ; $GET $DEFDIR/* . ; cd .. ; fi cp -f DEF/* . #---The following changes in .def files will only be visible in the running directory (on SCRATCH if $reseau_local = 0) # They concern variables that change during runtime : nday, dayref, anneeref, ndayh # The other "sed" were totally or partially moved in setup.sh, to be done in $MAINDIR/DEF/*.def, before creating $MAINDIR/$SIMU (more transparent) #sed -e 's/ok_guide=.*.$/ok_guide='$ok_guide'/' DEF/guide.def >| guide.def #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 #=====!!!!!!!!====!!!!!!====!!!!+++====!!!!!!====!!!!!!!=====!!!!!!====z!!!====!!!!========!!!!!========!!! ##POUR que des TESTS soyent tres RAPIDES (pour ex, verifier fichiers input), ON FORCE nday=1 jour !!! #nday=1 #=====!!!!!!!!====!!!!!!====!!!!+++====!!!!!!====!!!!!!!=====!!!!!!====z!!!====!!!!========!!!!!========!!! sed -e 's/nday=.*.$/nday='$nday'/' -e 's/dayref=.*.$/dayref='${dayref}'/' -e 's/anneeref=.*.$/anneeref='$year'/' DEF/run.def >| run.def sed -e 's/phys_out_filetimesteps=[[:space:]]*[0-9][0-9]day/phys_out_filetimesteps= '$ndayh'day/' DEF/config.def >| config.def #--- End of *.def changes in the $WWORKD only ${GET} $SIMUDIR/start.$ym.nc start.nc ${GET} $SIMUDIR/startphy.$ym.nc startphy.nc if [ $climato = 1 ] ; then ${GET} $LIMITDIR/limit.nc limit.nc else ${GET} $LIMITDIR/limit.$year.nc limit.nc fi echo '####################################################################' echo '# Imports des fichiers aerosols si flag_aerosol>0 dans config.def, ' echo '# et si dans setup.sh on a "aerosols=clim" ou "aerosols=spla". ' echo '# NOTE: Si "aerosols=n" dans setup.sh, script_SIMU met flag_aerosol=0 et on tourne SANS aerosols' echo '####################################################################' if [ "`grep 'flag_aerosol=' config.def | head -1 | cut -d= -f2`" != 0 ] ; then if [ $aerosols = clim ] ; then # if [ $climato = 1 ] ; then suf=clim ; else suf=$year ; fi suf=clim # Le script pourrait ĂȘtre sophistique pour prendre des aerosols interannuels ${GET} $LIMITDIR/aerosols.$suf.nc aerosols$year.nc if [ ! -f aerosols1980.nc ] ; then ${GET} $LIMITDIR/aerosols.$suf.nc aerosols1980.nc ; fi ${GET} $LIMITDIR/aerosols.nat.nc aerosols.nat.nc fi if [[ $aerosols = "spla" ]]; then get_input_files ln_from_pub SPLA_WA/emissions ln -s dust$mo.nc dust.nc # Le calcul d'emissions de sels marins utilise les vents ERA-10m interpoles sur grille_s (lonv,latu) avec le script era2gcm_uv10m.sh # NB : GET=ln -s ; ERA10mDIR contient lui-meme le lien ERA10m vers le repertoire des vents interpoles $REA_uv10m (REA=ERA5, ERAI ou OPERA) echo WORK IN PROGRESS FOR SPLA ; exit 1 ventl="u10m.nc v10m.nc" for file in $ventl ; do ${GET} $ERA10mDIR/${year}/${month}/$file . ; done fi fi #---------------------------------------- # Noveaux forcages a activer a l'avenir # (commentes en attendant) : #---------------------------------------- #for file in climoz_LMDZ.nc solarforcing.nc taulwstrat.2D.nc tauswstrat.2D.nc ; do # ${GET} $LIMITDIR/$file $file #done #---------------------------------------- ${GET} $SIMUDIR/gcm.e gcm.e ; chmod +x gcm.e if [ $VEGET = y ] ; then set +e ; for t in stomate sechiba ; do cp $SIMUDIR/start_$t.$ym.nc ${t}_rest_in.nc ; done ; set -e #For Orchidee trunk (post-CMIP6), orchidee_pft.def must be copied in addition to orchidee.def \cp -f DEF/orchidee*.def . # If no sechiba restart is found, the restart files for sechiba, stomate, # and routing are created on line in the simulation, requiring Orchidee input files if [ ! -f sechiba_rest_in.nc ] ; then get_input_files ln_from_pub Orchidee # linking all orchidee input files ln -sf alb_bg_modisopt_2D_ESA_v2.nc alb_bg.nc echo ATTENTION : ON UTILISE LES FICHIERS DE L ANNEE 2000 ln -s PFTmap_15PFT.v1_2000.nc PFTmap.nc ln -s woodharvest_2000.nc woodharvest.nc sed -e 's/^SECHIBA_restart_in.*./SECHIBA_restart_in=NONE/' \ -e 's/^STOMATE_RESTART_FILEIN.*./STOMATE_RESTART_FILEIN=NONE/' \ -i orchidee.def fi # Input files for routing are always needed if [ "`grep RIVER_ROUTING orchidee.def |grep -i y`" ] ; then set +e ln_from_pub 3DInputData/Orchideee routing.nc ln_from_pub 3DInputData/Orchideee routing_simple.nc cp $SIMUDIR/start_routing.$ym.nc routing_start.nc set -e fi fi echo '#################################################################' echo 'Repertoire contenant les fichiers de reanalyses' echo '#################################################################' if [ "$ok_guide" = "y" ] ; then \rm -f u.nc v.nc T.nc hur.nc if [ -f u.nc ] ; then echo PROBLEME D EFFACEMENT DES FICHIERS DE REANALYSES exit 1 fi for var in u v T hur ; do $GET $ERADIR/$year/$month/$var.nc $var.nc ; done echo Fin du rapatriement des fichiers de guidage fi echo '##################################################################' echo 'liste des fichiers avant le lancement de la simulation' echo '##################################################################' ls -lrt #diff DEF ./ echo '##################################################################' echo 'Lancement de la simulation' echo '##################################################################' #@ADS if 1; then time $MPICMD $ntasks ./gcm.e > listing #@ADS else #@ADS srun --cpu-bind=none --mem-bind=none -- ./slurm_set_cpu_binding.sh ./gcm.e > listing #@ADS fi if [ ! -f restartphy.nc ] ; then echo PROBLEME PAS DE FICHIER RESTARTPHY exit fi echo '##################################################################' echo 'sauvegarde des fichiers de sortie' echo '##################################################################' # listing ${PUT} listing ${SIMUDIR}/list$ym # if the listing for Orchidee is also needed, then uncomment the following line : #if [ $VEGET = y ] ; then ${PUT} out_orchidee_0000.0000 ${SIMUDIR}/out_orchidee$ym ; fi # restart(s) ${PUT} restart.nc ${SIMUDIR}/start.$next.nc ${PUT} restartphy.nc ${SIMUDIR}/startphy.$next.nc if [ $VEGET = y ] ; then for t in sechiba stomate ; do f=${t}_rest_out.nc ; if [ -f $f ] ; then ${PUT} $f ${SIMUDIR}/start_$t.$next.nc ; fi ; done f=routing_restart.nc ; if [ -f $f ] ; then ${PUT} $f ${SIMUDIR}/start_routing.$next.nc ; fi fi # fichiers "histoires" # 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 liste_out="histmth histday histhf histmthCOSP Xhistins XhistLES sechiba_history sechiba_history_4dim sechiba_out_2 stomate_history stomate_ipcc_history diag_routing dynzon" xios_used=0 for fileout in $liste_out ; do if [ -f $fileout.nc ] ; then ${PUT} $fileout.nc ${SIMUDIR}/$fileout.$ym.nc xios_used=1 fi done if [ $xios_used = 0 ] ; then $GET $SIMUDIR/reb.sh chmod +x reb.sh ./reb.sh $ym $SIMUDIR $liste_out fi if [ -f guide_ins.nc ] ; then ${PUT} guide_ins.nc ${SIMUDIR}/guide_ins.$ym.nc ; fi echo '##################################################################' echo 'preparation et lancement de la simulation suivante' echo '##################################################################' # Gestion du fichier etat de controle de la simulation echo $ym OK >> etat echo $next a faire >> etat # ${PUT} etat $SIMUDIR/etat # Pas necessaire car etat est un lien vers $SIMUDIR/etat # set initialisation_iso to 0 for next run to read isotopes from restart files if [ $isotopes = y ] ; then sed -i 's/^initialisation_iso=.*.$/initialisation_iso=0/' $SIMUDIR/DEF/iso.def fi set +e ; \rm out* sec* sta* list* rest* gcm.e aer* ; set -e # Arret si on est arrive au bout if [ $next = $stopsim ] ; then echo 'On arrive au bout, simulation next:'$next', stopsim:'$stopsim # Cas particulier ou on veut chainer plusieurs simulations multi annuelles. # pour le tuning automatique. # Ici on passe de SCM_1-019 a SCM_1-029 if [ "${simul:0:3}" = "SCM" ] ; then pre="SCM_1-" num=`echo $simul | sed -e 's/'$pre'//'` # (( num = $num + 10 )) change a cause d un probleme avec 008 num=`echo $num | awk ' { print $1 + 10 } '` num=`printf "%03d\n" $num` simul_new=$pre$num cd $SCRIPTDIR if [ $num -le 250 ] ; then sed -e 's/^simul=.*.$/simul='$simul_new'/' -e 's/^\# @ job_nam.*.=.*.$/\# @ job_name = '$simul_new'/' tmp_$simul >| tmp_$simul_new submitcmd tmp_$simul_new fi fi exit fi echo '##################################################################' echo 'lancement de la simulation suivante tmp_'$simul' depuis :' echo '##################################################################' pwd cd $SCRIPTDIR submitcmd tmp_$simul #$SUBMITCMD tmp_$simul