#!/bin/bash
#PBS -N ISIS_OCTOPUS_calibr
#PBS -q mpi_2
#PBS -l walltime=48:0:0
#PBS -S /bin/bash
#PBS -v DATAWORK,SCRATCH
#PBS -j oe
#PBS -o debug/debugPBS_OctoAut2017.log

# ATTENTION: j’utilise BASH pour créer des raccourcis en tant que fonctions,
# tandis que CSH ne permet pas de les créer.
# Donc ce script ne peut pas être réécrit pour CSH

###############################################################################

# aller dans le bon dossier
cd $PBS_O_WORKDIR

resume_previous_calibr=false

# nom simulation (pour utiliser dans R)
export SIMUL_BASENAME="Calib_OCTOPUS_2017_AUT_Prep"
# full simul name = base name + iteration

# simulation blanche de base (absolute path, see myIsis for reason)
export SIMUL_FILE=$PBS_O_WORKDIR/Inputs/$SIMUL_BASENAME.zip

# fichier contenant valeurs des param à calibrer (dans le dossier `master/`)
export PARAMS_FILE='q.csv'

# endroit où sauvegardés des simul (pour utiliser dans R)
export ISIS_BD=$DATAWORK/myISISdb
# de préférence sur DATAWORK ou SCRATCH

# exécutable ISIS (repo d’Éric Chatellier)
#export ISIS_BIN=/appli/emh-commun/isis-fish/isis-fish-4.4.8*.1*/isis-fish-4.4.8.1.jar
export ISIS_BIN=/appli/emh-commun/isis-fish/isis-fish-4.4.8.1/isis-fish-4.4.8.1.jar

# exécutable JAVA (repo d’Éric Chatellier)
export JAVA_BIN=/home3/datahome/echatell/jdk17/bin/java

# répertoire de Nicolas Barrier pour {calibrar}
export NICO_REPO=/home1/datawork/nbarrier/libs/R/lib
# changer en “R_LIBS_USER” pour éviter d’écrire library(…, lib.loc=…) à chaque fois

# shortcut to call ISIS from R
myIsis () {
	# ATTENTION: when this function is called, we are in RUN_*/i* folder
	# relative paths are a bit difficult, so I use absolute paths
	$JAVA_BIN -Xmx2G -XX:+UseSerialGC -jar $ISIS_BIN \
		--option launch.ui false \
		--option perform.vcsupdate false \
		--option perform.migration false \
		--option perform.cron false \
		--option isis.home.directory $ISIS_BD \
		--simulateWithSimulation $1 $SIMUL_FILE
		# 1st arg = full simul name (cf R script)
	# ces options viennent du code source ISIS > src/main/resources/templates/ssh/qsub-script.ftl
	# cf README pour la raison de fixer mémoire java à 2GB
}
export -f myIsis

# calculer le nombre de cœurs, car utiliser $NCPUS pas fiable (cf tout en bas)
export mpiproc=$(cat $PBS_NODEFILE | wc -l)
# normalement = 28 × nº queue MPI choisie

###############################################################################

# supprimer qq fichiers
rm -f debug/debugR_octopus2017.log debug/debugPBS_octopus2017.log
mkdir -p $ISIS_BD

if [ "$resume_previous_calibr" = false ] ; then
	rm -rf "RUN_${SIMUL_BASENAME}"
	# puis supprimer les simul précédentes
	find $ISIS_BD/isis-database/simulations -type d -name "${SIMUL_BASENAME}_i*" -prune -exec rm -rf {} +
	rm -f *.results *.restart *.simulated
	# générés par {calibrar}
fi

. /usr/share/Modules/3.2.10/init/bash
module purge
module load R/3.6.3-intel-cc-17.0.2.174
module list
# enlever la version pour avoir R plus récent, mais à vérfier si {snow} est installé

# shortcut to call R, for MPI only
myR () {
	mpiexec -np $mpiproc $(R RHOME)/library/snow/RMPISNOW --no-restore --no-save --quiet $@
	# shouldn’t use --vanilla because errors don’t stop execution
}

time myR -f calibr_run/calibr_run_octopus2017.R &> debug/debugR_octopus2017.log

###############################################################################

echo simul: $SIMUL_BASENAME
echo job id: $PBS_JOBID
echo job name: $PBS_JOBNAME
echo

echo job submitted: $(qstat -f $PBS_JOBID | grep qtime) $(date +'%Z')
echo job started: $(qstat -f $PBS_JOBID | grep stime) $(date +'%Z')
echo current dir: $(pwd)
echo originating queue: $PBS_O_QUEUE
echo executing queue: $PBS_QUEUE
echo current machine: $PBS_O_HOST
echo how many cores: $NCPUS
echo how many threads: $OMP_NUM_THREADS
echo how many MPI process: $mpiproc
echo
