Closed cfbastarz closed 1 year ago
Conversando com o @joaogerd, foi discutida a possibilidade de se atribuir valores específicos para as situações em que a instrução STOP
ocorre. Para isso, serão verificadas as situações em que há, e.g., falta de arquivos, erro na leitura de namelists etc, e serão atribuídos valores distintos para cada situação, a fim de se evitar que o comando echo $?
seja sempre 0. Conversando também com o Luiz Flávio, ele comentou sobre a forma como o MONAN deverá tratar o uso da diretiva STOP
(utilizada a partir de uma única rotina), o que deverá ser considerado pelo SCANTEC também. A modificação proposta no escopo dessa issue, deverá ser lançada na versão 2.1.0 do SCANTEC (https://github.com/GAM-DIMNT-CPTEC/SCANTEC/milestone/7).
STOP
no código do SCANTECAs rotinas a seguir fazem uso da instrução STOP
(todas sem um código específico). Em geral geral, os escopos onde esta instrução é utilizada, correspondem a verificação de existência de arquivos (eg., namelists), verificação de carregamento de arquivos e testes de alocação de arrays. Na rotina m_inpak.F90
, há três subrotinas (die0_
, die2_
e die4_
) que supostamente deveriam fazer o papel de parar o programa principal, mas não estão sendo chamadas em nenhuma parte do programa. Solcito ao @joaogerd confirmar esta informação.
scan_coreMOD.f90
scan_dataMOD.f90
scan_ModelPlugin.f90
scan_readModel.f90
scantec_module.f90
varType.f90
MathExpress.f90
m_inpak90.F90
scan_UtilsMOD.f90
: essa rotina será modificada para que tenha um STOP
também.STOP
está sendo utilizadaEsta tabela deverá ser incluída no manual de uso do SCANTEC para que os usuários tenham mais clareza quanto aos erros e em que parte do código eles podem ocorrer. Na tabela abaixo, são relacionados os códigos decimais da instrução STOP
e do comando echo $?
com os seus respectivos códigos hexadecimais. Observe que o "lowest byte" do código hexadecimal da instrução STOP
é exatamente o código hexadecimal do comando echo $?
. Dessa forma pode-se fazer a correspondência, apesar de haver dependência quanto ao compilador, sistema operacional e processador utilizado. Os códigos foram gerados utilizando-se o GNU bash, version 5.2.2(1)-release (x86_64-pc-linux-gnu) do Ubuntu 22.10 (kernel Linux 5.19.0-23-generic), compilador GNU Fortran (Ubuntu 9.5.0-1ubuntu3) 9.5.0 e processador Intel Core i7-4790.
Código STOP (decimal) |
Código STOP (hexadecimal) |
Código echo $? (decimal) |
Código echo $? (hexadecimal) |
Mensagem ou Motivo | Função/Subrotina/Rotina |
---|---|---|---|---|---|
99000 | 182B8 | 184 | B8 | Erro 'ERROR: Analisys Time Step should be less or equal to Forecast Time Step' |
rotina scan_coreMOD.f90 |
99001 | 182B9 | 185 | B9 | Erro carregamento scanVarsConf |
subrotina data_config em scan_dataMOD.f90 |
99002 | 182BA | 186 | BA | Arquivo scantec.table não encontrado |
rotina scan_ModelPlugin.f90 |
99003 | 182BB | 187 | BB | Arquivo de definição do modelo não encontrado | rotina scan_ModelPlugin.f90 |
99004 | 182BC | 188 | BC | Erro leitura label (i90_label , GDef%DName ) |
rotina scan_ModelPlugin.f90 |
99005 | 182BD | 189 | BD | Erro leitura gint (i90_gint , GDef%num ) |
rotina scan_ModelPlugin.f90 |
99006 | 182BE | 190 | BE | Erro leitura mapping (i90_gtoken , gdef%mapping ) |
rotina scan_ModelPlugin.f90 |
99007 | 182BF | 191 | BF | Erro leitura start_coord (i90_gfloat , gdef%start_coord ) |
rotina scan_ModelPlugin.f90 |
99008 | 182C0 | 192 | C0 | Erro leitura incr_coord (i90_gfloat , gdef%incr_coord ) |
rotina scan_ModelPlugin.f90 |
99009 | 182C1 | 193 | C1 | Erro alocação array GDef%coord(GDef%num) |
rotina scan_ModelPlugin.f90 |
99010 | 182C2 | 194 | C2 | Erro subrotina GetLinCoords |
rotina scan_ModelPlugin.f90 |
99011 | 182C3 | 195 | C3 | Erro alocação array GDef%coord(GDef%num) |
rotina scan_ModelPlugin.f90 |
99012 | 182C4 | 196 | C4 | Erro subrotina GetLevelsCoord |
rotina scan_ModelPlugin.f90 |
99013 | 182C5 | 197 | C5 | Arquivo de definição do modelo não encontrado | rotina scan_readModel.f90 |
99014 | 182C6 | 198 | C6 | Erro carregamento do arquivo de definição do modelo (i90_LoadF ) |
rotina scan_readModel.f90 |
99015 | 182C7 | 199 | C7 | Erro leitura label (i90_label ) |
subrotina GetDef em scan_readModel.f90 |
99016 | 182C8 | 200 | C8 | Erro leitura num (GDef%num) | subrotina GetDef em scan_readModel.f90 |
99017 | 182C9 | 201 | C9 | Erro leitura mapping i90_GToken(GDef%mapping,ierr) | subrotina GetDef em scan_readModel.f90 |
99018 | 182CA | 202 | CA | Erro leitura start_coord (Gdef%start_coord ) |
subrotina GetDef em scan_readModel.f90 |
99019 | 182CB | 203 | CB | Erro leitura incr_coord (Gdef%incr_coord ) |
subrotina GetDef em scan_readModel.f90 |
99020 | 182CC | 204 | CC | Erro alocação array GDef%coord(GDef%num) |
subrotina GetDef em scan_readModel.f90 |
99021 | 182CD | 205 | CD | Erro chamada GetLinCoords |
subrotina GetDef em scan_readModel.f90 |
99022 | 182CE | 206 | CE | Erro alocação array GDef%coord(GDef%num) |
subrotina GetDef em scan_readModel.f90 |
99023 | 182CF | 207 | CF | Erro chamada GetLevelsCoord |
subrotina GetDef em scan_readModel.f90 |
99024 | 182D0 | 208 | D0 | Erro 'Model Name or Model Type not found!' |
função getModel_ em scantec_module.f90 |
99025 | 182D1 | 209 | D1 | Erro 'unknow Experient Name' |
função getField_ em scantec_module.f90 |
99026 | 182D2 | 2010 | D2 | Erro 'unknow Experiment Name' , |
função getBitMap_ em scantec_module.f90 |
99027 | 182D3 | 211 | D3 | Erro 'Dimension not found in' .model |
função getDimVec_ em scantec_module.f90 |
99028 | 182D4 | 212 | D4 | Erro 'ERROR: wrong type, should be of scalartype ' |
subrotina get0d em varType.f90 |
99029 | 182D5 | 213 | D5 | Erro 'ERROR: wrong type, should be of array1Dtype ' |
subrotina get1d em varType.f90 |
99030 | 182D6 | 214 | D6 | Erro 'ERROR: wrong type, should be of array1Dtype ' |
subrotina get2d em varType.f90 |
99031 | 182D7 | 215 | D7 | Erro 'ERROR: wrong type, should be of array1Dtype ' |
subrotina get3d em varType.f90 |
99032 | 182D8 | 216 | D8 | Erro 'not initialized' |
subrotina infix2postfix em MathExpress.f90 |
99033 | 182D9 | 217 | D9 | Erro 'not initialized' |
subrotina evalPostFixS_ em MathExpress.f90 |
99034 | 182DA | 218 | DA | Erro 'not initialized' |
subrotina evalPostfixA_ em MathExpress.f90 |
99035 | 182DB | 219 | DB | STOP |
subrotina die0_ em m_inpack.F90 |
99036 | 182DC | 220 | DC | STOP |
subrotina die2_ em m_inpack.F90 |
99037 | 182DD | 221 | DD | STOP |
subrotina die4_ em m_inpack.F90 |
99038 | 182DE | 222 | DE | Erro arquivo scantec.conf não encontrado |
rotina scan_UtilsMOD.f90 |
Durante os testes com os códigos das diretivas STOP
no SCANTEC, foi identificado que a execução do código é interrompido na rotina scan_UtilsMOD.f90
quando o namelist scantec.conf
não existe/não é encontrado, embora o código não seja explícito quanto a isso:
Para que fique coerente com a proposta desta issue, será adicionado a instrução STOP 99038
para gerar o código de erro 222 no terminal.
Sobre a escolha dos valores no intervalo de 99000 a 99038, foram encontrados exemplos em algumas referências (a seguir) para os quais os valores hexadecimais correspondentes são discerníveis e de fácil identificação.
O @Garcia-INPE identificou que em situações em que o SCANTEC falha, o código de erro do Shell é 0 (indicando sucesso na execução do binário do SCANTEC). É necessário estudar uma forma de incluir códigos de erros para falhas comuns como erro na leitura dos arquivos dos modelos, erro na leitura das tabelas, namelist etc.