#! /bin/ksh
#--------------------------------------------------------------------#
#  Protocolo obsGnss: Evaluation GSI System - GDAD/CPTEC/INPE - 2017 #
#--------------------------------------------------------------------#
#BOP
#
# !DESCRIPTION:
# obsGnss: Ferramenta de diagnostico da assimilacao de dados de 
#          radio ocultacao GPS 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/obsGnss/README.
#
# !INTERFACE:
#      ./config_obsGnss.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/obsGnss)
#                    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_obsGnss.ksh vars_export SMG         TESTCASE
#            ./config_obsGnss.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. 
#
# !REMARKS:
#
# O protocolo ainda não foi testado para os dados do RMS com os modelos WRF e BRAMS.
#
# Como é o padrão dos sistemas de modelagem da DMD os label do GSI_system iniciam-se por tres letras, com as quais 
# se monta o arquivo de configuracao do sistema que organiza as varaiveis de ambiente do sistema hospedeiro do eval. 
#
# !BUGS:
#   Nenhum ate o momento.
#
#EOP  
#--------------------------------------------------------------------#
#BOC

# Descomentar para debugar
#set -o xtrace

# Variaveis principais
vars_export(){

# Caminho padrao no sistema
  export usuario=${USER}             # Padrao do Sistema
  export HOME=${HOME}                # Padrao do Sistema Tupa, caso nao esteja na tupa mude o caminho
  export SUBMIT_HOME=${SUBMIT_HOME}  # Padrao do Sistema Tupa, caso nao esteja na tupa mude o caminho
  export WORK_HOME=${WORK_HOME}      # Padrao do Sistema Tupa, caso nao esteja na tupa mude o caminho

# 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
 
 # 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_home=${home_sys}/eval
  export eval_work=${work_sys}/eval/${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 obsGnss
  export obsGnss_home=${diag_home}/obsGnss
  export obsGnss_work=${diag_work}/obsGnss
  export obsGnss_src=${obsGnss_home}/src
  export obsGnss_run=${obsGnss_home}/run
  export obsGnss_bin=${obsGnss_home}/bin

# Diretorios de running do pacote no scratchout   
  export obsGnss_work_run=${obsGnss_work}/run

# Diretorios de saida dos resultados 
  export obsGnss_dataout=${obsGnss_work}/dataout
  export obsGnss_logs=${obsGnss_dataout}/logfile
  export obsGnss_tabe=${obsGnss_dataout}/tabela
  export obsGnss_figu=${obsGnss_dataout}/figure
  export obsGnss_bina=${obsGnss_dataout}/binary

# Diretorios de exposicão dos resultados na PAGE 
  export eval_page=${TRANSFER_HOME}/PUBLIC/${nome_sys}/eval/${EXPE}
  export diag_page=${eval_page}/diag
  export obsGnss_page=${diag_page}/obsGnss

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

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

}

# Funcao ajuda
ajuda(){

  echo -e ""
  echo -e " Conteudo: obsGnss: Ferramenta de diagnostico da assimilacao de dados de "
  echo -e "                    radio ocultacao GPS na assimilacao de dados usando o GSI"
  echo -e ""
  echo -e " Uso.....: ./config_obsGnss.ksh <opcao> <GSI_system> <EXPE>"
  echo -e ""
  echo -e " Opcoes..: <opcao> configurar -> configura o obsGnss (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_obsGnss.ksh ajuda "    
  echo -e "           ./config_obsGnss.ksh configurar  SMG_V0.0.0  TESTCASE "
  echo -e "           ./config_obsGnss.ksh testcase    RMS         EXPE"
  echo -e ""
  echo -e " Testcase padrão: ./config_obsGnss.ksh configurar SMG EXPE"
  echo -e "                  ./config_obsGnss.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 obsGnss\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_obsGnss.sh \033[m"
}

# Funcao configurar
configurar(){

# 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
  ${home_sys}/config_${nome_syslowc:0:3}.ksh vars_export ${nome_sys}

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

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

# Mensagem ao usuario
  print ""
  print "\033[34;1m > Configurando o obsGnss ... \033[m"
  print ""

# Criando estrutura de diretorios no scratchout

# Diretorios de saida no scratchout
  if test ! -s ${obsGnss_work_run}; then mkdir -p ${obsGnss_work_run}; fi
  if test ! -s ${obsGnss_dataout}; then mkdir -p ${obsGnss_dataout}; fi
  if test ! -s ${obsGnss_logs}; then mkdir -p ${obsGnss_logs}; fi
  if test ! -s ${obsGnss_tabe}; then mkdir -p ${obsGnss_tabe}; fi
  if test ! -s ${obsGnss_figu}; then mkdir -p ${obsGnss_figu}; fi
  if test ! -s ${obsGnss_bina}; then mkdir -p ${obsGnss_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 ${obsGnss_page}; then mkdir -p ${obsGnss_page}; fi

  print ""
  print "\033[34;1m > Configuracao obsGnss completa \033[m"



elif [[ ${resposta} = N || ${resposta} = "n" ]]
then
  print "\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 obsGnss
##############################################################################

  cd ${obsGnss_src}

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

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

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


  bannerobsGnss

}

# Funcao testcase
testcase(){

  aloca_testcase $1 $2

  bannerobsGnss

}

# 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
bannerobsGnss(){

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

  exit 0

}

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

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