domingo, 10 de outubro de 2010

Como fazer a tela de gráficos do FLUENT parar de piscar?

Estava trabalhando e, durante uma simulação, conforme os gráficos de resíduo se atualizavam a janela gráfica do FLUENT piscava sem parar, deixando até a rodada mais lenta. Depois, na hora do pós-processamento, a cada clique novo para ajustar a imagem, novamente várias piscadas a mais até tudo aparecer. Um pouco (...) chato isso.
Depois de procurar um pouco achei como resolver esse problema. O segredo (se é que é segredo) é abrir o FLUENT e, antes de qualquer coisa, ir na seção "Graphics and Animations" na árvore lateral (mostrada na imagem abaixo), clicar no botão "Options" e, na janela que aparece em seguida (também mostrada na imagem abaixo), marcar a opção "Double Buffering".


Isso faz com que o FLUENT use o buffer da placa de vídeo no processo de atualização da janela gráfica, tornando a coisa toda muito mais suave e sem a "piscassada" insuportável. Até agora tudo indo bem e sem piscar aqui.
A documentação do FLUENT apenas alerta que caso o hardware disponível (placa de vídeo) não consiga realizar essa operação o "Double Buffering" irá usar um pouco mais do processador e um pouco mais de memória. Como o uso do pós-processador nativo do FLUENT vem reduzindo, graças à integração com o CFD-Post, isso não vai impactar em nada. Se impactar (muito improvável), compre uma placa de vídeo melhor.

Saudações.

domingo, 12 de setembro de 2010

Dados de contorno "híbridos" e "conservativos" no ANSYS CFD-Post.


Quando pós-processamos simulações do ANSYS CFX no ANSYS CFD-Post, em muitos painéis aparece o item "Boundary Data" com as opções "Hybrid" e "Conservative", com a opção híbrida sendo a padrão na maioria dos casos. Isso é visto na figura abaixo. Agora, o que são essas opções e de onde surgem? 


 Para entender essas opções é preciso conhecer um pouco melhor como o CFX trata a parede em simulações com modelagem de turbulência (ou seja, em praticamente todos os casos). Assim, para explicar essa ideia vou usar como exemplo a função de parede escalável do CFX (padrão quando se usa algum modelo de turbulência baseado na equação de épsilon).
A função de parede escalável, em termos gerais, define que a parede definida geometricamente não é a parede do domínio do fluido. O CFX considera que a parede do domínio fluido está deslocada um pouco "para fora" do domínio definido pela malha. Sem entrar em muitos detalhes sobre modelagem de parede, isto é feito para que, mesmo refinando muito a malha próximo à parede, o resultado utilizando lei de parede (logarítmica) seja o mais adequado possível. Dessa forma o CFX considera que o ponto sobre a parede está em y+=11,06, no limite de validade da lei de parede logarítmica.
Alguns podem ficar apreensivos sobre esse deslocamento de parede gerar erros na simulação. Não se preocupem com isso. Para o escoamento de água em um duto com 1m de diâmetro a 1m/s de velocidade (Reynolds aproximadamente 1,0e+06) esse "deslocamento virtual" da parede, para y+=11,06, é da ordem de apenas 1,0e-04m (um décimo de milímetro), muito provavelmente o próprio modelo de turbulência, alguma incerteza no valor da condição de contorno, etc., geram erros bem maiores do que esse.
Bom, agora fica simples entender o que são as opções híbrida e conservativa que aparecem no Post para simulações do CFX. A opção conservativa mostra a velocidade no domínio calculada pelo Solver, incluindo a solução para os nós na parede geométrica que, como não são considerados a parede do domínio fluido, tem velocidades diferentes de zero. Como se pode ver na figura abaixo (quem conhece esse caso?).


A opção híbrida mostra os resultados calculados pelo Solver no interior do domínio mesclada (daí o nome híbrido) com os valores de condição de contorno definidos no CFX-Pre. Como no CFX-Pre as paredes são definidas usando a condição de não deslizamento e, na maioria dos casos, termo paredes com velocidade nula, a condição de contorno de parede é com velocidade zero na parede. Então, misturando a solução do Solver para o domínio com as condições de contorno temos uma exibição com velocidade zero nas paredes, como mostrado na figura abaixo.


Assim, na hora de fazer o pós-processamento da simulação, estamos interessados no dado híbrido, que nos dá as condições esperadas da solução. Até porque vai mostrar para o chefe que não entende nada de simulação essa figura com velocidade diferente de zero na parede! Usualmente apenas quem está interessado nas questões numéricas vai queres visualizar os dados conservativos. Então, na grande maioria dos casos, híbrido neles!

Qualquer dúvida ou sugestão de post, por favor mandem nos comentários. 

Saudações.

quarta-feira, 1 de setembro de 2010

Malhas estruturadas e não-estruturadas vs. malhas tetraédricas e hexaédricas

Um erro muito corriqueiro, mas muito mesmo, em artigos, apresentações, relatórios, etc., é se referir a malhas hexaédricas (ou quadriláteras) como "malhas estruturadas". Quando se trata de ANSYS FLUENT ou ANSYS CFX esse erro é ainda mais evidente. Já explico o porquê. Primeiro vamos ver a definição de malha estruturada e malha não estruturada. 
Para explicar o conceito, peguei duas figuras emprestadas do livro do prof. Maliska:


Imaginando que se deseja simular a transferência de calor, ou o escoamento ao redor de um tubo (por exemplo), pode-se utilizar qualquer uma das malhas abaixo:


A primeira malha é "usualmente" dita estruturada e a segunda é dita não estruturada. Quanto a segunda ser não estruturada, tudo bem, ela realmente é, mas isso é uma das características dela, é uma malha composta por volumes (ou elementos) triangulares não estruturada.
Quanto a primeira ser estruturada, daí depende. A única coisa que se pode dizer ao certo, apenas de olhar, é que é uma malha composta por volumes (ou elementos) quadriláteros, nada mais!
Para essa malha ser estruturada, a numeração dos volumes (ou elementos) deve seguir uma "estrutura fixa" de forma que o número de cada volume seja consecutivo ao seu vizinho. Um exemplo disso está na figura abaixo (analisando um quarto da primeira malha).


Como se pode observar, a primeira camada de volumes está numerada consecutivamente e assim por diante para as camadas (na direção radial) mais internas. Dessa forma todos os vizinhos de cada volume são conhecidos e obtidos de uma forma bem simples, uma conta algébrica trivial. 
Por exemplo, para o volume 17: o vizinho radial externo é 17-15=2; o vizinho de um lado é 17-1=16; do outro é 17+1=18 e; o vizinho radial interno é o 17+15=32. E isso vale para qualquer outro elemento da malha. O fato de "conhecer seus vizinhos" através de expressões simples traz um número enorme de vantagens na hora de programar um código. Facilita o cálculo dos balanços, diminui o número de acessos à memória, diminui a própria quantidade de memória necessária, e assim vai. A malha acima é dita então estruturada composta por elementos quadriláteros.
Agora, quem disse que essa malha é numerada assim? Ela pode ter sido gerada (por algum motivo qualquer, dependendo do software e do método utilizado na geração) assim:


Se os volumes estiverem numerados dessa forma, já era a malha estruturada. Claramente não há mais como conhecer os vizinhos de qualquer elemento da malha por simples conta algébrica. Dessa forma a "mesma" malha (com volumes e nós exatamente nas mesmas posições da anterior) deixa de ser estruturada. Agora é necessário se ter na memória, matrizes (ou vetores) de "conectividade". Essas matrizes são listas dizendo, para cada volume, quem são seus vizinhos. Isso é então uma malha não estruturada composta de elementos quadriláteros.
O uso da malha não estruturada faz com que o código a ser programado seja mais complexo. Também impõe que se tenha que acessar a matriz de conectividade várias vezes, aumentando o número de operações na máquina em relação à malha estruturada. Essas são algumas desvantagens. Além dessas, geralmente o uso de malhas não estruturadas gera vizinhos "muito distantes" (em termos da numeração deles, como o 5 que é vizinho do 92 acima), isso também prejudica questões de alocação de memória (principalmente).
A vantagem da malha não estruturada é que, em geometrias complexas, consegue-se gerar uma malha com relativa facilidade. Fazer uma malha estruturada não é tão simples e, em casos bastante complicados, chega a ser impossível.
Dessa forma fica evidente que uma malha composta por volumes quadriláteros (ou hexaédricos) não é necessariamente uma malha estruturada. Da mesma forma uma malha composta por elementos triangulares ou tetraédricos pode ser uma malha estruturada. Imagine simplesmente se dividir em 2 triângulos cada volume quadrilátero da malha estruturada acima, ainda assim poderemos saber quem são os vizinhos de cada volume através de expressões algébricas bastante simples. Assim teríamos uma malha estruturada composta por elementos triangulares.
No início do post eu falei que quando se trabalha com ANSYS FLUENT ou ANSYS CFX o "erro" de se chamar malhas hexaédricas de estruturadas é ainda mais evidente. Isso é porque nenhum dos dois códigos é escrito para trabalhar com malhas estruturadas! Isso quer dizer que, mesmo que a numeração dos volumes esteja sequencial, eles vão precisar de matrizes de conectividade. Tratando a "malha estruturada" como não estruturada. 
De qualquer forma, muitas malhas hexaédricas feitas, por exemplo, no ICEM, não são estruturadas (independendo do solver a ser utilizado). Quando se usa uma abordagem de blocos no ICEM para gerar uma malha hexaédrica, na maioria das vezes, por questões de complexidade geométrica, a malha não fica "estruturada", mas sim "estruturada por blocos" (dentro de cada bloco a numeração é sequencial). Na hora de transformar o pre-mesh do ICEM em malha (para CFX ou FLUENT) qual a opção usada? "Convert to unstructured mesh"! Fica claro não?
As malhas hexaédricas são trabalhosas de serem feitas, mas tem uma série de vantagens sobre as tetraédricas (mesmo com camadas de prismas) quando se tratam problemas de fluidodinâmica computacional. Porém, em muitos casos, não a de serem "estruturadas". Particularmente eu acho relaxante fazer malhas usando o blocking do ICEM, mas para a fluidodinâmica computacional esse fato é desprezível.
Bom, por hoje era isso então. 
Saudações.

segunda-feira, 30 de agosto de 2010

Modelagem de dispersão turbulenta em simulações Euler-Euler no ANSYS FLUENT.

Quando se modela escoamentos com uma fase contínua e uma fase dispersa, a interação entre as partículas/gotas/bolhas dessa fase dispersa e a turbulência (vórtices) da fase contínua gera um efeito chamado "dispersão turbulenta" (dependendo de uma série de fatores, obviamente). Esse efeito é até tratado, com certa frequência, quando se modela a fase dispersa utilizando uma abordagem lagrangeana. Pode-se incluir esse efeito também quando se usa uma abordagem Euler-Euler para o problema. O único inconveniente (se é que podemos chamar assim) de fazê-lo no FLUENT é que esse modelo deve ser incluído na modelagem via TUI (Text User Interface).
Para incluí-lo, deve-se preparar o set-up, pelo menos até a etapa de seleção do modelo de turbulência para o problema (κ-ε contínuo-disperso, por exemplo, como mostrado na figura abaixo).


Então, na própria janela do FLUENT, na área de texto (o TUI), deve-se entrar com o seguinte comando:

/define/models/viscous/multiphase-turbulence/ multiphase-options

Respondendo-se yes às duas perguntas que se seguem (como mostrado abaixo) se ativa o modelo de dispersão turbulenta para simulações contínuo-dispersas Euler-Euler no FLUENT.


Saudações.

sexta-feira, 27 de agosto de 2010

Compilador de C para criação de UDFs no FLUENT em Windows x64.

Uma questão recorrente é qual compilador de C utilizar para a geração de UDFs no ANSYS FLUENT em Windows 64 bits (XP, Vista ou 7). Além de como proceder para configurar o compilador com o FLUENT. Vamos lá.
Uma das opções de compilador é o próprio compilador de C++ da Microsoft. Ele tem versões distribuídas gratuitamente com o Microsoft Visual Studio 2010 Express (para sistemas 32 bits) e com o Microsoft Windows SDK (para sistemas 32 e 64 bits).
Antes de instalar o compilador propriamente dito, em máquinas x64 deve-se antes instalar o Microsoft .NET Framework 4. O instalador está disponível gratuitamente no link abaixo: 


Concluída essa instalação, pode-se instalar o compilador, que é parte do pacote do SDK. No link abaixo se encontram as imagens de DVD para todas as versões do Winsows 7 (32 e 64 bits). Nenhuma grande configuração é necessária durante essa instalação. Quem não quiser ficar escolhendo componentes na mão pode fazer a instalação com a configuração padrão do instalador que funciona.


Para quem quiser, aqui vai o link do Microsoft Visual Studio 2010 Express para C++. Quando se instala o compilador para Windows x86 esse pacote tem a interface gráfica e o compilador.


Para usar o compilador, uma bateria de variáveis de ambiente e configurações adicionais devem ser feitas, para fugir delas pode-se simplesmente iniciar o FLUENT via linha de comando de dentro do prompt que é instalado pelo compilador no menu Iniciar do Windows. A figura abaixo mostra a o conteúdo da pasta do menu Iniciar do Windows SDK.


Quando se dispara o prompt acima, a seguinte janela surge:


Digitando o comando acima na janela se inicia o FLUENT com todas as configurações do compilador prontas. Uma forma de evitar digitar todo esse caminho é acrescentar o caminho para o executável do FLUENT à variável de ambiente Path do Windows. Feito isso basta apenas digitar fluent no prompt e o software é carregado.
Com isso o FLUENT está pronto para compilar normalmente UDFs. Apenas mais um ponto aqui, como se pode ver na figura do prompt do compilador, esse prompt padrão está com as configurações Debug. Isso é bom quando se está desenvolvendo as UDFs (porque facilita a localização de erros no programa), mas deixa mais lenta sua execução quando o código está pronto. Para resolver isso pode-se criar um novo item de prompt, duplicando o que já vem com o compilador com outro nome, como mostrado abaixo:


Aqui criei um novo item (copia do prompt padrão) com um "- Release" no nome. Para tornar o link realmente um prompt na versão Release (de execução mais rápida) deve-se editar a definição do link (botão direito no link - Propriedades) acrescentando no item "Destino" o argumento "/Release" no final. Como mostrado na figura abaixo.


Pronto. Quando executado o prompt na versão Release a seguinte janela surge, onde tanto o texto quanto a cor indicam sucesso na alteração.


Executando o FLUENT de dentro desta janela (com o caminho completo ou simplesmente como acima caso o caminho do executável esteja no Path) abre uma seção do software pronta para compilar UDFs para execução.

Saudações.

quinta-feira, 26 de agosto de 2010

Expressões em CEL para interrupção de simulações no ANSYS CFX

Fui utilizar a opção de controle de parada do ANSYS CFX via expressões em CEL e, em uma busca bem fraca, não encontrei exemplos. Aqui segue um então.
Esse controle de parada é bem útil pois, em muitos casos, temos que definir um número de passos de tempo ou um número de iterações muito grande por que não temos como calcular de antemão o tempo necessário de simulação para que o fenômeno que esperamos ocorra.
Nesse exemplo eu queria fazer a simulação parar assim que uma zona atingisse uma temperatura máxima eu defini.
O controle de interrupção fica na janela do Solver Control, como mostrado nessa figura:

A expressão pode estar definida na guia Expressions do CFX (como no exemplo acima), ou pode ser escrita diretamente no item Logical Expression. Essa expressão para controle de parada é bem simples, fazendo apenas uma compação. No caso que fiz, usei a expressão definida como:

stop criteria = maxVal(Temperature)@heat zone>310.0[C]

Essa expressão fez com que a simulação parasse assim que a temperatura máxima em uma região (chamada de heat zone) passasse dos 310ºC. No caso de eu não querer gerar uma expressão para isso na guia Expressions do CFX-Pre eu poderia ter escrito diretamente a condição de parada no Logical Expression.
Uma ferramenta interessante disse controle é que podem-se definir vários critérios de parada, o primeiro que for "atingido" pára a simulação.
Nesse meu caso o controle de interrupção via expressão funcionou muito bem.

Saudações.