Aqui vão algumas explicações sobre como editar o arquivo de compilação do ANSYS para ativar o debug e como conectar o debbuger (ou depurrador, wtf?) do Visual Studio ao ANSYS. Esse tutorial aborda apenas os passos para debuggar UPFs programadas em FORTRAN compiladas na forma .dll
, através do arquivo ANSUSERSHARED.bat
. Para debuggar UPFs que compõem um novo executável o procedimento é semelhante, entretanto devem ser alterados outros arquivos que compõem a compilação e linkagem, em caso de duvida basta entrar em contato. 😄
Estou disponibilizando aqui algumas versões do arquivo de compilação com o debug ativado para certas versões (as que tive acesso), quem trabalhar com outras versões pode me enviar seu ANSUSERSHARED.bat
que faço as alterações e anexo aqui (também aceito as versões editadas). Quem for usar um desses arquivos prontos pode pular diretamente para a parte 2 do tutorial.
Para ativar o debug algumas bandeiras de compilação e linkagem das UPFs devem ser alteradas, tais alterações envolvem desativar a otimização do código compilado e outras, reduzindo a eficiencia do código compilado. É recomendado então manter uma versão original do arquivo para realização das análises, após desenvolvimento da UPF.
-
Abrir a cópia do arquivo
ANSUSERSHARED.bat
em um editor de texto. -
Encontrar as chamadas do compilador Intel Fortran (
ifort
): dependendo da versão do ANSYS o comandoifort
estará em um laçoIF
ouDO
, independentemente disso logo apósifort
devem ser adicionado os seguintes comandos/debug /Zi /warn:all /check:all /traceback /Qfp-stack-check /Od /wrap-margin-
, mantendo os demais comandos, por exemplo:-
Original (v194):
if exist *.F ( ifort %COMMACS% %FMACS% %COMSWITCH% %FSWITCH% %MACS64% *.F >>compile.log 2>&1 )
. -
Novo (v194):
if exist *.F ( ifort /debug /Zi /warn:all /check:all /traceback /Qfp-stack-check /Od /wrap-margin- %COMMACS% %FMACS% %COMSWITCH% %FSWITCH% %MACS64% *.F >>compile.log 2>&1 )
.
Obs.:
/wrap-margin-
é opcional, serve para que a escrita de arquivos de texto do FORTRAN não tenha limite de colunas. -
-
Removendo chamada de otimizador: originalmente o código é compilado de forma otimizada, entretanto isso pode produzir problemas durante o debug, o trecho
/Od
no passo anterior desativa a otimização, entretanto deve ser removido trecho em que a otimização é originalmente ativada, evitando conflitos, para isso as ocorrências de/O2
no arquivo devem ser removidas, por exemplo:- Original (v194):
set "COMSWITCH=/O2 /MD /c"
- Novo (v194):
set "COMSWITCH=/MD /c"
- Original (v194):
-
Desativando a exclusão automática do arquivo
compile_error.txt
: as bandeiras inseridas no compilador anteriormente irão emitir todo e qualquer aviso de compilação,por mais inutil que seja, assim é útil manter o arquivo que isola os erros, para isso remova qualquer ocorrência dedel /Q compile_error.txt
realizada após o comandoifort
, caso seja também removida a ocorrencia anterior aifort
serão acumulados erros entre diferentes execuções. -
Adicionando flag de debug no linker: o arquivo
ANSUSERSHARED.bat
cria um arquivo.lrf
com comandos do linker, para encontrar a criação desse arquivo deve ser encontrado o trecho onde diversas linhas começam no formatoecho -[...]>>[...]
, como por exemploecho -dll>>%LRFFILE%
. Entre quaisquer duas linhas nesse trecho deve ser criada uma nova linha com o comando-debug
, diferentes versões do ANSYS usam diferentes formatos para a criação do arquivo.lrf
, assim recomendo que seja copiada a linha com o comando-dll
e este seja trocado por-debug
. Na versão 194, por exemplo, a linha a ser inserida éecho -debug>>%LRFFILE%
, enquanto na versão 170 eraecho -debug>>%UPFFILE%.lrf
.
Observações gerais:
Após a compilação da UPF através do novo arquivo ANSUSERSHARED.bat
serão gerados diversos arquivos na pasta de trabalho que não apareciam anteriormente (.obj, .mod, .f90, .pdb, .ilk
), alguns destes contem informações relevantes ao debbuger, então devem ser mantidos durante o processo de debug.
Após compilar a UPF através do arquivo gravado na Parte 1 o processo de debug deve ser realizado da seguinte forma:
-
Iniciar o ANSYS, sem executar nenhum comando, por enquanto.
-
Abrir Visual Studio e anexar o ANSYS ao debbuger do programa:
2.1) A lista de processos pode ser aberta através do comando
Ctrl+Alt+P
ou conforme apresentado nas figuras a seguir:2.2) Na lista de processos deve ser selecionado o processo
ANSYS.exe
, além de garantir que os demais itens estejam de acordo com a imagem a seguir:2.3) Com o processo anexado deve ser verificado se os simbolos de debug foram carregados: na aba Output do Debug do Visual Studio haverá uma lista de 'partes do ANSYS' carregadas pelo sistema, em uma destas linhas haverá o diretório onde está a UPF compilada e seu nome, sendo a linha finalizada por
Symbols loaded.
, caso a linha seja finalizada comoModule was built without symbols.
o arquivo de compilação deve estar incompleto ou está faltando algum arquivo.pdb
na pasta de execução da UPF. Na figura a seguir é ilustrado carregamento da UPFUserMat
na pastaC:\ANSYS\UPF Compilar\usermat-ansys\
. -
Abrir o arquivo fonte da UPF em questão no Visual Studio, este deve estar na pasta da
dll
criada. -
O processo de debug agora pode ser realizada de forma usual,
primeiramentedevem ser criados os breakpoints no código da UPF e então devem ser executados os comandos de análise do ANSYS de maneira tradicional, no momento em que o programa estiver usando a UPF em questão e atingir algum breakpoint o Visual Studio passará ao primeiro plano da tela.
Obs.: Usando a versão 17 do Visual Studio (ANSYS 194) existe um bug entre o Visual Studio e o Intel Fortran onde não é possível acesssar matrizes/vetores durante o debug e o Visual Studio fecha em alguns momentos. A Intel lançou um patch de correção pra isso, se for o seu caso clique aqui para maiores informações.
Bonus: o comando cubo
que rodei na animação no inicio do tutorial é apenas um arquivo APDL (normal) chamado cubo.mac
. O ANSYS entende arquivos com a extensão .mac
como macros então facilita bastante a vida. Como um bom macro ainda podem ser usados parametros, esses são importados no código APDL como ARG1
,ARG2
(existe um limite, acho que ARG19
), a seguir um exemplo:
Arquivo cubo.mac
:
fc = ARG1
As = ARG2
fy = ARG3
...código APDL normal usando variáveis fc, As, fy...
A sintaxe do comando dentro do ANSYS, considerando fc=2, As=4 e fy=50, será então cubo,2,4,50
.
Abraço