#!/bin/bash

#
# Script
#
#    g4cParallelEnvSetup.sh
#
#    predispone l'ambiente per l'esecuzione parallela dei job
#    che realizzano la simulazione
#      (1) crea all'interno della working directory tante sub-directory
#          quanti i job che realizzano la simulazione parallela,
#          denominando quella associata al job i-esimo con il nome
#          della working directory seguito da "-i"   
#      (2) copia nella directory assegnata all'i-esimo job il file di
#          macro parametro della simulazione, previa sostituizione al
#          suo interno della coppia di valori x e y forniti per il seed
#          del generatore casuale di eventi, con x+i-1 e y+i-1
#

#
# Parametri
#
# <verbose>
#   i valori ammessi per il parametro sono 0 o 1.
#   Se 1 attiva la modalita' verbose di esecuzione dello script
# <macroFileAbsolutePath>
#   path assoluto del file di macro a partire dal quale vengono generati
#   quelli per le simulazioni eseguite dai singoli job
# <setSeedsString>
#   stringa che nel file di macro individua la direttiva che setta
#   il seed per il generatore casuale di eventi
# <workingDirectoryRelativePath>
#   path relativo alla directory g4cParallelSimulation di quella
#   di lavoro che contiene le subdirectory assegnate ai job che
#   realizzano la simulazione, il file con le informazioni relative
#   ai loro istanti di sottomissione e di completamento e il file di
#   output per la modalita' verbose
# <totalNumberOfJobs>
#   numero totale dei job che realizzano la simulazione parallela.
#   Deve preferibilmente essere minore o uguale del numero di host
#   impegnati moltiplicato per il minimo numero di core che su ogni
#   host vengono riservati alla simulazione
# <verbRelativePath>
#   path relativo alla directory g4cParallelSimulation 
#   di quella che contiene gli script di gestione 
#   della modalita' verbose
# <verbOutputFileRelativePath>
#   path relativo alla directory g4cParallelSimulation del file
#   di output per la modalita' verbose
#

# Estrae i parametri dello script dalla sua chiamata
verbose=$1
macroFileAbsolutePath=$2
setSeedsString=$3
workingDirectoryRelativePath=$4
totalNumberOfJobs=$5
verbRelativePath=$6
verbOutputFileRelativePath=$7

# Accede al nome dello script correntemente in esecuzione
currentScript=$(basename $0)

# Verbose
#   memorizza nel file di output per la modalita' verbose, se attiva, 
#   l'inizio della esecuzione dello script
$verbRelativePath/verbScriptStarting.sh $verbose \
                                        $currentScript \
                                        $verbOutputFileRelativePath

# Verbose									
#   memorizza nel file di output per la modalita' verbose, se attiva,
#   il valore dei parametri specificati per il setup dell'ambiente
#   di simulazione
$verbRelativePath/verbParallelEnvSetupParam.sh $verbose \
                                               $currentScript \
                                               $macroFileAbsolutePath \
											   $setSeedsString \
                                               $workingDirectoryRelativePath \
                                               $totalNumberOfJobs \
                                               $verbOutputFileRelativePath

# Estrae dal file di macro parametro della simulazione, la coppia 
# di valori forniti per il seed del generatore casuale di eventi
randString=$(grep "$setSeedsString" $macroFileAbsolutePath)
read seedCmd seedValue_1 seedValue_2 <<< $randString

# Estrae il nome della working directory dal suo path
workingDirectoryName=$(basename $workingDirectoryRelativePath)

# Scandisce i job che realizzano la simulazione
for index in $(seq 1 $totalNumberOfJobs)
do
   # Per il job i-esimo
   
   # Crea all'interno della working directory una (sub)directory
   # denominandola con il nome della working directory seguito da "-i"
   mkdir  $workingDirectoryRelativePath\/$workingDirectoryName"-$index"
done

# Estrae il nome del file di macro dal suo path assoluto
macroFileName=$(basename $macroFileAbsolutePath)

# Scandisce i job che realizzano la simulazione
for index in $(seq 1 $totalNumberOfJobs)
do
   # Per il job i-esimo
   
   # Copia il file di macro parametro della simulazione nella directory
   # associata al job
   cp $macroFileAbsolutePath $workingDirectoryRelativePath\/$workingDirectoryName"-$index"

   # All'interno di tale file sostituisce la coppia di valori x e y,
   # forniti per il seed del generatore casuale di eventi, con x+i-1
   # e y+i-1
   randStringNew="$seedCmd $seedValue_1 $seedValue_2"
   sed -i \
          "s|$randString|$randStringNew|g" \
          $workingDirectoryRelativePath\/$workingDirectoryName"-$index/$macroFileName"

   # Genera la coppia di valori da assegnare al seed del generatore
   # casuale di eventi per il job i+1-esimo
   seedValue_1=$(expr $seedValue_1 + 1)
   seedValue_2=$(expr $seedValue_2 + 1)
done

# Verbose									
#   memorizza nel file di output per la modalita' verbose, se attiva,
#   il nome delle directory, all'interno di quella di lavoro, 
#   insieme alla coppia di valori specificati per il seed per la
#   generazione casuale di eventi assegnati ad ogni job
$verbRelativePath/verbEnvSimulationsAndSeeds.sh  $verbose \
                                                 $currentScript \
                                                 $macroFileAbsolutePath \
                                                 $workingDirectoryRelativePath \
                                                 $totalNumberOfJobs \
                                                 $setSeedsString \
                                                 $verbOutputFileRelativePath

#  Verbose
#     memorizza nel file di output per la modalità verbose, se attiva, 
#     l'uscita dallo script
$verbRelativePath/verbScriptCompletion.sh $verbose \
                                          $currentScript \
                                          $verbOutputFileRelativePath
exit 0



