#!/bin/bash                        ## Depende do s:ell que voce utiliza: /bin/sh, /bin/csh, /bin/bash
# Uso do Script Moab com o IntelMPI
## As tags abaixo sao pertinentes ao escalonador do Job. Deve ser colocada na forma #PBS parm
#PBS -l nodes=1:ppn=8        	## Total de nodes fisicos escolhidos (cada um tem 8 cores)
				## Voce pode diagramar sua alocacao com nodes=N:ppn=P, sendo N = nodes e P= processos/threads
				## alocados por core. 
				## Todo processo executa em modo exclusivo no node. Ou seja, se ppn < 8, os cores sobrando ficarao
				## idle para processos de usuario
				## O total de cores alocados por default e 8
				## ppn > 8 havera sobrecarda do node, reduzindo drasticamente o desempenho
#PBS -l walltime=10:00:00       ## Tempo total do Job. Inclui E/S e CPU
#PBS -N RegCM           	## Nome de Referencia para o Job.
#PBS -M felipenrs@gmail.com 	## Tipicamente seu endereco eletronico 
#PBS -q geofisica	    	## Sua Fila padrao. Recomendo nao alterar. Essa fila roteia para a fila correta
#PBS -V                     	## Verbose mode (nao remover!)
#PBS -k oe		    	## Mantem os logs no diretorio de execucao

cd $PBS_O_WORKDIR		## Essa variavel contem o diretorio padrao de trabalho. Normalmente o home
				## atencao: dependendo de como voce organiza os trabalhos, voce pode ficar
				## fora do diretorio desejado. Certifique-se de qual diretorio voce esta
				## submetendo o job!
                            	## Voce pode incluir path relativo ou absoluto ( $PBS_O_WORKDIR/local/Onde/VOCE/quer/Ir)
				## Faca uso de $HOME

cat $PBS_NODEFILE > hostfile 	## Lista de  nodes fornecido pelo sistema
                             	## Atencao: 
				## 	1) no MPI o hostfile deve ser indicado corretamente. Se for 
                             	## 	colocado em outro diretorio, o caminho para este deve ser explicitado
				##	2) Dependendo de como voce solicitar os nodes, a lista podera conter hostnames
				## 	duplicados - um para cada core

# Algumas magicas numericas simples sao feitas para alocacao de nodes/Cores
# A mais simples , com base no pedido -l nodes, e a seguinte
CORES=8    		    ## Total de cores desejados

NUM_NODES=`cat $PBS_NODEFILE | wc -l`  	## Total de nodes  SOLICITADO e recebido. Por exemplouando usamos -l nodes=2:ppn=8
                                       	## essa variavel fica com 16 entradas, 8 com o nome do primeiro node e
                                      	## 8 com o nome do segundo node


@NUM_PROCS=$((NUM_NODES * CORES))       ## essa Operacao matematica depende do shell utilizado e, claro
                                       ## da request -l nodes=NN:ppn=PP
#mpdboot -r ssh -n $NUM_NODES --file=./hostfile 	## Atencao:
						## 1) Nao use & para colocar o seu mpdboot em background e passar 
                                       		## para o proximo comando.  Isso fara com que o proximo comando 
                                       		## seja executado e, muitas vezes,
                                       		## o mpdboot pode nao ter sido disparado ainda nos nodes adjacentes,
                                       		## ocasionando a falha no startup.
./exec
#mpiexec -n $NUM_PROCS ./exec
#mpdallexit                             ## Fundamental! alguns processo MPI acabam tendo problemas no termino
# Ao final os resultados direcionados a tela serao apresentados em um arquivo texto, com o nome 
# nomedoJob.eNumero(e=erro) e nomedoJob.oNumero (o=saida)
# para submeter o job pela linha de comando, use o utilitario  msub:  msub arquivojob
# nao usa o qsub, pois ele esta com um bug nao resolvido.

# Maiores detalhes nos videos em /usr/local/docs/Introducao_MOAB_PORTAL.
