//-------------------------------------
// script python para determinar o número de processos (nProc) para alimentar o arquivo
// numberOfProcess.in e bashrc em caso de uso da rota Singularity e para determinar o
// número de nodes e processos por node (ppn) para alimentar o script Slurm ou PBS/torque.

import numpy as np

#- Dados lidos de arquivos do caso
cells = <valor a ser lido do arquivo meshCells.out>
minWellCells = <valor a ser lido do arquivo minWellCells.out>

#- Valor fixo configurado no admin da plataforma petrofoam válido para uma configuração de cluster
cellsPerProc = 30000

#- Cluster Wikki - petrofoam.wikki.com.br
clusterPpn   = 4
clusterNodes = 1

#- Cluster Petrobras - a confirmar
# clusterPpn   = 40
# clusterNodes = 100 # para prd, para tst e hmg: 20

#- Cálculo de nP (no poço), aqui bastava fazer well_nP = int(0.5*minWellCells) e
# aí não precisava carregar o numpy só pra essa conta ...
well_nP = np.floor(0.5*minWellCells)

#- Cálculo de reservoir_nP (valor inteiro arredondado)
reservoir_nP = round(cells/cellsPerProc)

#- Cálculo de nP, mínimo entre reservoir_nP e well_nP
nP = min(reservoir_nP, well_nP)

holdNode = round(1.5*clusterPpn)
clusterTotProcs = clusterPpn*clusterNodes

if nP < 2:
    nProc = 2
    nodes = 1
    ppn  = 2
elif nP >= 2 and nP <= clusterPpn:
    nProc = nP
    nodes = 1
    ppn  = nP
elif nP > clusterPpn and nP <= holdNode:
    nProc = clusterPpn
    nodes = 1
    ppn  = clusterPpn
elif nP >= (clusterTotProcs):
    nProc = clusterTotProcs
    nodes = clusterNodes
    ppn   = clusterPpn
else:
    ppn   = clusterPpn
    nodes = round(nP/ppn)
    nProc = nodes*ppn

print(int(nProc))
print(int(nodes))
print(int(ppn))
