#! /bin/bash
#--------------------------------------------------------------------#
#  Protocolo obsConv: Evaluation GSI System - GDAD/CPTEC/INPE - 2017 #
#--------------------------------------------------------------------#
#BOP
#
# !DESCRIPTION:
# obsConv: Ferramenta de diagnostico da assimilacao de dados de 
#          estacões convencionais na assimilacao de dados usando o GSI. 
#          Script para instalar a estrutura basica desse protocolo de 
#          avaliacão. Mais informacões ver arquivo eval/diag/obsConv/README.
#
# !INTERFACE:
#      ./config_obsConv.ksh <opcao> <GSI_system> <EXPE>
#
# !INPUT PARAMETERS:
#  Opcoes..: <opcao> vars_export -> faz export das variaveis de ambiente desse protocolo
#                    configurar  -> configura o protocolo (cria links e pastas em eval/diag/obsConv)
#                    testcase    -> prepara os dados do teste padrao do protocolo.
#                    ajuda       -> mostra uma lista de informacões de ajuda
#
#  Sistema usando o GSI..: <GSI_system> SMG -> Versao trunk do SMG (Sistema de modelagem Global) com BAM
#                                       RMS -> Versao trunk do RMS (Sistema de modelagem regional) com WRF
#                                       SMG_V0.0.0 -> Versao inicial V0.0.0 do SMG no ramo TAG. 
#
#  Experimento Label..: <EXPE> Nome de indentificacao do experimento em uso do sistema. Esse label é usado para
#                              organizar a saida dos dados evitando sobreescrever resultados melhor controlando-os.
 
#  Exemplos: ./config_obsConv.ksh vars_export SMG         testcase
#            ./config_obsConv.ksh configurar  RMS_V2.0.0  EXPE 
# 
# !REVISION HISTORY:
#
# 22 junho de 2017 - L. F. Sapucci - Versao modelo (dammy) apenas com a estrutura e componentes basicos.  
# 30 junho de 2017 - L. F. Sapucci - Versão mais completa com a organizacao dos dados no FTP/PUBLIC do tupa. 
# 22 Setembro de 2022 - L. F. Sapucci - Versao apta para rodar na EGEON usando o readDiag-1.0.0. 
##
# !REMARKS:
#
# O protocolo ainda não foi testado para os dados do RMS com os modelos WRF e BRAMS.
#
#
# !BUGS:
#   Nenhum ate o momento.
#
#EOP  
#--------------------------------------------------------------------#
#BOC

# Descomentar para debugar
#set -o xtrace

# Variaveis principais
vars_export(){

# Nome do sistema com a versao do GSI (SMG(BAM) ou SMR(BRAMS) ou RMS(WRF) por exemplo) via linha de argumento
  export nome_sys=$1
  
  # Exportando variaveis do eval
  if test ! -s ../../config_eval.sh ; then
      source  ../../../config_eval.sh vars_export $1 $2
    else
      source  ../../config_eval.sh vars_export $1 $2
  fi
  
# Verifica o argumento do label do experimento se nao setado usa padrão EXPE
  if [ -z "${2}" ]
  then
    export EXPE="EXPE"
  else
    export EXPE=${2}
  fi
 
# Raiz do sistema onde o GSI esta instalado
  export home_sys=${SUBMIT_HOME}/${nome_sys}
  export work_sys=${WORK_HOME}/${nome_sys}

# Raiz dos pacotes de evaluation e estatistica
  export eval_work=${work_sys}/evalu/${EXPE}
  export estat_home=${eval_home}/stat
  
# Raiz dos pacotes de diagnostico do GSI
  export diag_home=${eval_home}/diag
  export diag_work=${eval_work}/diag

# Diretorios principais do pacote obsConv
  export obsConv_home=${diag_home}/obsConv
  export obsConv_work=${diag_work}/obsConv
  export obsConv_src=${obsConv_home}/src
  export obsConv_run=${obsConv_home}/run
  export obsConv_bin=${obsConv_home}/bin

# Diretorios de running do pacote no scratchout   
  export obsConv_work_run=${obsConv_work}/run

# Diretorios de saida dos resultados 
  export obsConv_dataout=${obsConv_work}/dataout
  export obsConv_logs=${obsConv_dataout}/logfile
  export obsConv_tabe=${obsConv_dataout}/tabela
  export obsConv_figu=${obsConv_dataout}/figure
  export obsConv_bina=${obsConv_dataout}/binary

# Diretorios de exposicão dos resultados na PAGE 
  export diag_page=${eval_page}/diag
  export obsConv_page=${diag_page}/obsConv

  if [ 'x'$1 != 'xsilent' ]; then 

   echo -e ""
   echo -e "\033[36;1m Variaveis do obsConv carregadas com Sucesso! \033[m \033[m"
   echo -e "\033[34;1m > obsConv SUBM: \033[36;1m${obsConv_home}\033[m \033[m"
   echo -e "\033[34;1m > obsConv WORK: \033[36;1m${obsConv_work}\033[m \033[m" 
   echo -e ""
 
  fi

}

# Funcao ajuda
ajuda(){

  echo -e ""
  echo -e " Conteudo: obsConv: Ferramenta de diagnostico da assimilacao de dados de "
  echo -e "                    estacoes convencionais na assimilacao de dados usando o GSI"
  echo -e ""
  echo -e " Uso.....: ./config_obsConv.ksh <opcao> <GSI_system> <EXPE>"
  echo -e ""
  echo -e " Opcoes..: <opcao> configurar -> configura o obsConv (cria links e pastas)"
  echo -e "                   testcase -> descompacta os arquivos do TestCase"
  echo -e "                   ajuda -> mostra esta ajuda"
  echo -e ""
  echo -e " Sistema usando o GSI..: <GSI_system> SMG -> Versao trunk do SMG (GSI com BAM)"
  echo -e "                                      RMS -> Versao trunk do RMS (GSI com WRF)"
  echo -e "                                      SMG_V0.0.0 -> Versao V0.0.0 DO SMG no TAG."
  echo -e ""
  echo -e " Experimento Label..: <EXPE> Nome de indentificacao do experimento em uso do sistema. "
  echo -e "                             Esse label é usado para organizar a saida dos dados"
  echo -e "                             sem sobreescrever resultados e melhor controlando-os."
  echo -e "                             Caso nao setado usa o padrão EXPE."
  echo -e ""
  echo -e " Exemplos: ./config_obsConv.ksh ajuda "    
  echo -e "           ./config_obsConv.ksh configurar  SMG_V0.0.0  testcase "
  echo -e "           ./config_obsConv.ksh testcase    RMS         EXPE"
  echo -e ""
  echo -e " Testcase padrão: ./config_obsConv.ksh configurar SMG EXPE"
  echo -e "                  ./config_obsConv.ksh testcase   SMG EXPE"
  echo -e ""

}

copy_fixed_file(){

  #
  # Copiando arquivos fixos necessários para qualquer rodada, independente do período
  # estes arquivos não estão sob controle de versão pois são binários

  echo -e " "
  echo -e "\033[34;1m > Copia de arquivos desnecessário   \033[m"
  echo -e "\033[34;1m > Há dois experimento para teste do modulo \033[31;1m obsConv\033[m \033[34;1m. O primeiro sao as saidas do \033[m"
  echo -e "\033[34;1m > testcase do stat rodado com os dataout do GSI do sistema hospedeiro \033[m \033[m"
  echo -e " "
  echo -e "\033[32;1m A segunda opcao é usar os dados disponivel no Gdad/public \033[m"
  echo -e "\033[32;1m  o que interessante pois nao precisa rodar o testcase do sistema hospedeiro. \033[m"

echo -e "\033[32;1m Para a primeira opcao rode se argumentos e para a segunda use "tescase" como primeiro argumento do run_obsConv.sh \033[m"
}

# Funcao configurar
configurar(){

# Exportando variaveis
  vars_export $1 $2

  echo -e ""  
  echo -e""
  echo -e "\033[34;1m > Bem vindo ao pacote de dignostico do \033[31;1m obsConv \033[m \033[m"
  echo -e "\033[34;1m > o configurador do obsConv ira criar pastas \033[m"
  echo -e "\033[34;1m > nos discos scratchout abaixo. \033[m"
  echo -e  ""
  echo -e  "\033[34;1m > obsConv work: \033[31;1m${obsConv_work}\033[m \033[m" 
  echo -e ""
  echo -e "\033[34;1m > Deseja continuar? (S/N)\033[m"
  read resposta

  if [[ ${resposta} = "S" || ${resposta} = "s" ]]
  then

# Mensagem ao usuario
  echo -e ""
  echo -e  "\033[34;1m > Configurando o obsConv ... ${obsConv_work_run} \033[m"
  echo -e ""

# Criando estrutura de diretorios no scratchout

# Diretorios de saida no scratchout
  if test ! -s ${obsConv_work_run}; then mkdir -p ${obsConv_work_run}; fi
  if test ! -s ${obsConv_dataout}; then mkdir -p ${obsConv_dataout}; fi
  if test ! -s ${obsConv_logs}; then mkdir -p ${obsConv_logs}; fi
  if test ! -s ${obsConv_tabe}; then mkdir -p ${obsConv_tabe}; fi
  if test ! -s ${obsConv_figu}; then mkdir -p ${obsConv_figu}; fi
  if test ! -s ${obsConv_bina}; then mkdir -p ${obsConv_bina}; fi
# Diretorios de saida na PAGE 
  if test ! -s ${eval_page}; then mkdir -p ${eval_page}; fi
  if test ! -s ${diag_page}; then mkdir -p ${diag_page}; fi
  if test ! -s ${obsConv_page}; then mkdir -p ${obsConv_page}; fi

  echo -e ""
  echo -e "\033[34;1m > Configuracao obsConv completa \033[m"



elif [[ ${resposta} = N || ${resposta} = "n" ]]
then
  echo -e "\033[34;1m > Saindo do configurador. \033[m"
  exit 0
else
  exit 1
fi

}

# Funcao compilar
compilar(){

# Exportando variaveis
  vars_export $1 $2

# Exportando variaveis do eval
  source  ${eval_home}/config_eval.sh vars_export $1 $2

# Exportanto varaiveis do sistema em avaliacao
#  source ${home_sys}/config_${nome_syslowc:0:3}.ksh vars_export ${nome_sys}
  
# Verificando se esta logado no eslogin01
if [ ${HOSTNAME} != "eslogin01" -a ${HOSTNAME} != "eslogin02" ];then
     echo "#####################################################################"
     echo "#                                                                   #"
     echo "#               Voce esta logado no ${HOSTNAME}                       #"
     echo "#                                                                   #"
     echo "# Antes de proceder com a instalacao logar em um destes servidores: #"
     echo "#                                                                   #"
     echo "# $ ssh eslogin01 -XC                                               #"
     echo "#                                                                   #"
     echo "#  ou                                                               #"
     echo "#                                                                   #"
     echo "# $ ssh eslogin02 -XC                                               #"
     echo "#                                                                   #"
     echo "#####################################################################"

     exit
fi


#############################################################################
# Compilacao do obsConv
##############################################################################

  cd ${obsConv_src}

  echo 
  echo "%%%%%%%%%%%%%%%%%%%%%%%%%%%"
  echo " Compilando o obsConv:  "
  echo "%%%%%%%%%%%%%%%%%%%%%%%%%%%"
  echo
  
  # Chamar aqui um arquivo de compilacao quando for o caso do tipo:
#  ${obsConv_src}/compile_obsConv.sh 2>&1 | tee ${obsConv_src}/compile_obsConv.log

  if [ -e ${obsConv_src}/obsConv.x ]; then # mudar aqui para o nome do arquivo executavel  ${obsConv_bin}/obsConv.exe
    echo 
    echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
    echo "!                                                !"
    echo "!      Compilacao do obsConv com Sucesso         !"
    echo "!                                                !"
    echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
    echo 
    mv obsConv.x ../bin
  else 
    echo 
    echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
    echo "!                                                !"
    echo "!       Nada para compilar nesse protocolo.      !"
#    echo "! Compilacao do obsConv falhou !!!!              !"
#    echo "! Rever configuracoes ou espaço em disco!        !"
#    echo "! Mais informacao no arquivo compile_obsConv.log !"
    echo "!                                                !"
    echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
    echo 
    exit -9
  fi

  echo -e "\033[34;1m +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ \033[m"
  echo -e "\033[34;1m > Compilacao obsConv completa.  \033[m"
  echo -e "\033[34;1m > Verifique possiveis erros no arquivo compile_obsConv.log. \033[m"
  echo -e "\033[34;1m +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ \033[m"


  bannerobsConv

}

# Funcao testcase
testcase(){

  aloca_testcase $1 $2

  bannerobsConv

}

# Funcao aloca tescase
aloca_testcase(){

# Exportando variaveis
  vars_export $1 $2

# Exportando variaveis do eval
  source  ${eval_home}/config_eval.sh vars_export  $1 $2

# Exportanto varaiveis do sistema em avaliacao
#  source ${home_sys}/config_${nome_syslowc:0:3}.ksh vars_export ${nome_sys}

  #
  # copiando arquivos fixos (Já devem estar pois são copiados durante a configuracão)
  #
  echo "copy_fixed_file desse protocolo.."
  copy_fixed_file 

}

# Final
bannerobsConv(){

  echo -e ""
  echo -e "\033[34;1m > Para mais informacoes sobre esta distribuicao do obsConv, leia o arquivo: \033[m"
  echo -e "\033[34;1m > eval/diag/obsConv/README \033[m"
  echo -e ""

  exit 0

}

# Verifica os argumentos passados junto com o script
echo -e ""
echo -e "\033[36;1m >>> Config_obsConv.ksh --> \033[m"

if [[ $# = 0 ]]
then
  echo -e ""
  echo -e "\033[31;1m > Nao foi passado nenhum argumento! \033[m"
  ajuda
  bannerobsConv
elif [[	${1} =  "ajuda" ]]
then
  echo -e	""
  echo -e	"\033[34;1m > Opcao escolhida: \033[31;1m${1}\033[m \033[m"
  ajuda
  bannerobsConv
elif [[ $# < 2 ]]
then
  echo -e ""
  echo -e "\033[31;1m > Pelo menos dois argumentos sao requeridos! \033[m"
  ajuda
  bannerobsConv
elif [[ ${1} =	"configurar" ]]
then
  echo -e ""
  echo -e "\033[34;1m > Opcao escolhida: \033[31;1m${1}\033[m  \033[34;1m Argumentos:\033[m \033[31;1m${2} ${3}\033[m \033[m"
  configurar ${2} ${3}
  bannerobsConv
elif [[ ${1} = "compilar" ]]
then
  echo -e""
  echo -e "\033[34;1m > Opcao escolhida: \033[31;1m${1}\033[m  \033[34;1m Argumentos:\033[m \033[31;1m${2} ${3}\033[m \033[m"
  compilar ${2} ${3}
  bannerobsConv
elif [[ ${1} = "testcase" ]]
then
  echo -e ""
  echo -e "\033[34;1m > Opcao escolhida: \033[31;1m${1}\033[m  \033[34;1m Argumentos:\033[m \033[31;1m${2} ${3}\033[m \033[m"
  testcase ${2} ${3}
  bannerobsConv
elif [[ ${1} = "vars_export" ]]
then
  vars_export ${2} ${3}
else
  echo -e ""
  echo -e "\033[31;1m > Opcao desconhecida: \033[31;1m${1}\033[m \033[m"
  ajuda
  bannerobsConv
fi
