August 21, 2015

Linguagem de programação para desenvolvimento CFD

São vários os livros e sites que contém material sobre as metodologias de solução de um problema CFD. Em específico, os métodos numéricos aplicados para a solução de equações diferenciais parciais. Eu considero que isto é uma das mais importantes áreas na formação de um engenheiro que quer aprender bem CFD. Os problemas numéricos que podem ocorrer são muitos e estes devem ser conhecidos pelo profissional, tanto para evitá-los quanto para identificar sua ocorrência em meio a tantos detalhes que um resultado CFD fornece.

Apesar do conhecimento teórico estar disponível em várias fontes, muitas vezes falta a prática em desenvolvimento de códigos computacionais e, com isso, o aprendizado fica afetado. Pensando em conhecer mais essa área, tenho algumas sugestões para vocês.

Linguagem de programação

Temos uma alta oferta de linguagens de programação à disposição e a dúvida se limita a escolher uma delas para iniciar o aprendizado. Para começar a conversar, temos que definir a diferença entre linguagem de baixo (compilada) e alto (interpretada) nível.

Em linguagens de baixo nível, o código fonte precisa ser compilado, traduzindo os comandos implementados no código em linguagem de máquina e construindo um arquivo executável. Vale ressaltar que a linguagem de máquina se refere a um conjunto de instruções pré-definidos a ser executado diretamente pelo processador. Desta forma este processo visa primordialmente a eficiência na execução das instruções implementadas no código. Com a construção do aplicativo executável, os comandos implementados estão diretamente ligados ao hardware e ao processador, facilitando seu controle pelo programador. Dentre as linguagens de baixo nível disponíveis gratuitamente temos as mais conhecidas, C, C++, Basic, Pascal, Fortran etc.

Por sua vez, as linguagens de alto nível são interpretadas ao invés de compiladas. Isto significa que as instruções são executadas por um programa que interpreta os comandos implementados no código-fonte. Portanto, nesta abordagem o código não é transformado (ou traduzido) para linguagem de máquina e, assim, perde eficiência em sua execução. Mesmo assim, o interpretador fornece muito mais flexibilidade e facilidades ao programador, permitindo uma evolução muito maior no desenvolvimento do código. Para cálculos científicos, a linguagem interpretada gratuita com maior capacidade e popularidade é o Python. Em relação aos pacotes computacionais comerciais, temos uma ampla oferta, como MatLab, Maple, Mathematica, MathCad etc.

Bem, voltando ao assunto… Qual linguagem escolher?? Eu recomendo que escolha duas linguagens básicas, sendo uma compilada e outra interpretada. O motivo é bastante simples. Para o aprendizado, use as linguagens interpretadas para maior flexibilidade. Para implementações de códigos e problemas a nível profissional, use linguagem compilada. Em relação à linguagem compilada, minha recomendação seria aprender C (ou C++). Esta linguagem contém os conceitos básicos propagados e difundidos em várias outras linguagens de programação, como o uso de ponteiros por exemplo. Deixo algumas referências para quem quiser começar a aprender C (ou C++):

  • Linguagem de programação C, da Profa. Isabel Massour (clique aqui): um curso completo da linguagem C, mas com fins voltados à aplicações de informática.
  • Curso de C, da Intelectuale (clique aqui): apesar de ser um curso pago, o site tem várias dicas sobre conceitos básicos da linguagem e tutoriais sobre a instalação do compilador.
  • Wikilivros, Programar em C (clique aqui) e Programar em C++ (clique aqui): clique e faça bom uso.
  • Programação descomplicada (clique aqui): video aulas e muito material!!

Sem dúvida alguma, Python é a linguagem interpretada mais indicada para quem quer aprender a realizar cálculos científicos. Já existem diversos códigos implementados em Python para o desenvolvimento científico, como o NumPy e o SciPy, construção de gráficos, Matplotlib, etc. Como referência para o aprendizado de Python, deixo as referências abaixo:

  • Codeacademy (clique aqui): um site para aprendizado de diferentes linguagens de programação (Python, inclusive). A aboradagem é bem didática e foi neste site que eu comecei a aprender Python. Não cheguei a terminar as lições pois, como já tinha conhecimento de outras linguagens, me senti confiante a tentar códigos mais avançados e aplicados à computação científica.
  • Learn Python the hard way (clique aqui): esta referência é um livro virtual com várias lições sobre o uso básico da linguagem. Não é o mais didático, mas tem bastante material.
  • Learn Python (clique aqui): um site bem interessante para quem quer aprender os conceitos da linguagem.
  • Scientific Python Lectures Notes (clique aqui): um curso bem voltado para o desenvolvimento científico, explicando comandos para implementação de operações com NumPy, SciPy e Matplotlib. Vale a pena, mas é preciso algum conhecimento prévio.

A parte ruim das referências para o aprendizado de Python é que os cursos básicos são mais voltados para desenvolvimento Web. Mas servem para o aprendizado básico.

Sem dúvida alguma existem outras fontes de informação e tutoriais sobre estas linguagens. Se você tem alguma sugestão, por favor, deixe nos comentários do post.

Aprendendo desenvolvimento CFD

Invariavelmente, quando falamos em desenvolvimento CFD envolvemos a implementação de modelos fenomenológicos aplicando os métodos numéricos de solução. Em CFD, normalmente são usados os métodos das diferenças finitas ou volumes finitos e, portanto, seria interessante ler e estudar a metodologia.

Uma ótima fonte de informação e material para estudo são os softwares CFD de código aberto, como o OpenFOAM e o Elmer. Você pode abrir os códigos e estudar a implementação (e alterar o que quiser). Mas abrir pela primeira vez os códigos-fonte sem conhecimento de algoritmos e detalhes numéricos pode ser assustador para os iniciantes. Mas pudera, são códigos maduros e de alta capacidade. Por isso, vou focar em dicas para os iniciantes.

De modo geral, vocês podem encontrar bastante material sobre CFD no site CFD Revolutions. Muitas referências, inclusive para iniciantes em códigos CFD.

Contudo, de longe, a melhor dica para desenvolvimento de códigos é seguir o site da Profa. Lorena Barba. Ela montou um curso de CFD com as aulas invertidas. Neste âmbito, ela gravou em vídeo todas as suas aulas, que ficam disponíveis gratuitamente em seu canal no YouTube (veja aqui).

Com esta visão, a Profa. Barba também criou um site chamado CFD Python: 12 steps to Navier-Stokes. O site apresenta os fundamentos da discretização das equações de transporte e a sua implementação em Python para diferentes casos. Ela começa com casos simples 1D e vai aumentando a complexidade até chegar à solução 2D de escoamentos simples (fluido incompressível e newtoniano). Seguindo a mesma linha, ela também criou o site AeroPython para aulas de aerodinâmica. Também vale a visita.

Os códigos em Python ficam disponíveis para estudar e modificar à vontade. Como o site tem comentários sobre a teoria e a implementação, é uma ótima fonte de informação para quem está començando a aprender sobre desenvolvimento CFD.

Espero que as dicas ajudem aos interessados no tema. Qualquer dúvida ou discussão, não hesite em deixar um comentário!

July 6, 2015

Avaliação da qualidade da malha

No post passado, vimos que o fluxo das propriedades conservadas pode ser afetado diretamente pela disposição e forma dos volumes da malha. Isto afeta a acurácia da solução, a taxa de convergência numérica e o tempo computacional necessário. Desta forma, a geração de uma malha de alta qualidade se torna de suma importância na solução de um problema CFD. Mas surge uma dúvida: o que caracteriza a qualidade de uma malha?

Parâmetros de qualidade

Em março de 2011, o site Desktop Engineering publicou a pérola (que tem seu fundamento):

"Uma regra prática em geração de malhas seria que o formato dos elementos seja agradável aos olhos."

De fato, não existe um único parâmetro ou regra que defina a qualidade de uma malha. Vale avaliar diferentes aspectos relacionado à malha, algumas regras de construção (best practices) e muita experiência acumulada.
São diferentes parâmetros que avaliam certas características dos volumes de controle na malha. A grande maioria está associada ao formato geometrico do volume e a conectividade com seus vizinhos. Outros com a densidade (quantidade) de volumes e a transição entre estes em dada região do domínio de solução. Estes parâmetros usalmente são chamados de métrica da malha.
Neste post, gostaria de apresentar e comentar sobre algumas destas métricas:

  • Aspect ratio ou razão de aspecto;
  • Skewness ou assimetria (distorção);
  • Smothness ou suavização;
  • Orthogonality ou ortogonalidade.


Razão de aspecto

A razão de aspecto é a razão entre a maior e a menor aresta do elemento. Idealmente, o valor da razão de aspecto deveria ser 1 para garantir os melhores resultados. Valores muito altos de razão de aspecto podem levar a erros inaceitáveis na aproximação numérica dos fluxos nas faces. Este fator aumenta em soluções tridimensionais.

Razão de aspecto by Shyam2791

Por exemplo, vamos avaliar a razão de aspecto na malha abaixo utilizando o software Pointwise.

Pode-se perceber que os maiores valores de razão de aspecto estão na parte inferior da malha, onde existe maior diferença no tamanho das arestas. Conforme a camada de volumes evolui, a altura dos volumes aumenta e com isso a razão de aspecto diminui. Como recomendação geral, altos valores de razão de aspecto não são desejados, mas o valor ideal (ou máximo aplicável) vai depender do solver numérico utilizado.

Mesmo assim, existem casos onde uma razão de aspecto alta pode ser usada sem medo de ser feliz. Por exemplo, para malhas quad/hexaédricas os volumes podem ser esticados onde o escoamento seja completamente desenvolvido e essencialmente unidimensional.

Skewness

O skewness representa o desvio do vetor que conecta o centro dos volumes vizinhos e o centro da face. Apresentado na figura abaixo, a distância δ representa a distorção ou skewness entre dois volumes.

Esta métrica está diretamente relacionada ao desvio do vetor que liga os centros dos volumes e o vetor normal à face e, portanto, afeta diretamente a acurácia da aproximação numérica dos fluxos. Com isso, altos valores de skewness podem facilmente degradar a solução numérica.

Existem três métodos para calcular a distorção dos volumes em uma malha:

  • Baseado no volume equilátero: pode ser aplicado apenas a triângulos e tetraedros, sendo a metodologia padrão para este tipo de volume;

Cálculo de skewness baseado no volume equilátero:

  • Baseado na normalização de um ângulo equilátero: pode ser aplicado independente da topologia da face e volume, sendo aplicado a qualquer tipo de volume. Para prismas e pirâmides, este é o método padrão;

Cálculo de skewness baseado na normalização do ângulo:

  • Baseado no desvio equiangular: semelhante ao item anterior, tambem pode ser utilizado para mensurar a qualidade da malha para qualquer tipo de volume.

Para as duas metodologias acima, θmax e θmin representam o maior e menor ângulo nas faces do volume. Por sua vez, θe é o ângulo para a face equiangular, ou seja, 60o para o triângulo e 90o para um quadrilátero.

Pelas expressões apresentadas acima, o valor de skewness está entre 0 e 1, sendo 0 é o melhor valor possível enquanto 1 representa a pior situação. Para esta métrica, existem algumas recomendações práticas para uma boa malha. Para qualquer tipo de malha, a solução numérica pode ficar muito comprometida com valores de skewness superiores a 0,85 (quadriláteros, triângulos e hexaédros) ou 0,90 (tetraedros). Contudo, ressalto que isso depende do solver numérico utilizado e, para tal, vale olhar as recomendações do manual.

Smothness

Esta métrica está relacionada com a transição no tamanho dos volumes adjacentes na malha. Esta transição deve ser suave para evitar erros de truncamento nas aproximações numéricas para cálculo dos fluxos sobre as superfícies do volume.

Transição no tamanho de volumes adjacentes na malha, tendo variação suave e brusca


No momento de criação da malha, preocupe-se em diminuir a variacão do tamanho dos volumes adjacentes. Como regra prática, evite variações com razão entre volumes maiores que 20%. Note que isso pode afetar diretamente outras métricas, como a razao de aspecto.

Ortogonalidade

A ortogonalidade se refere ao desvio do ângulo entre o vetor que conecta o centro dos volumes adjacentes e o vetor normal à superfície entre eles.

Ortogonalidade entre os vetores normal à face e que conecta os centros dos volumes


A ocorrência de não-ortogonalidade afeta a acurácia da aproximação numérica dos fluxos, em especial a discretização do operador gradiente. Malhas com alta não ortogonalidade podem sofrer com a difusão numérica de erros na solução do problema.

Existem técnicas iterativas de correção do fluxo devido à não ortogonalidade. Contudo, é muito melhor não precisar fazer uso destas técnicas tendo o cuidado de construir uma malha de boa qualidade.

Considerações finais

De fato, existem muitas outras métricas para avaliar determinados aspectos da malha. Pode ser que alguma destas métricas seja mais importante para o solver numérico que você esteja usando. Desta forma, avalie com cuidado as métricas e vá ajustando a sua malha aos poucos. Como regra geral, existe um botão muito importante nos softwares de geração de malha chamado “Salvar” ou “Save”. Usem sem parcimônia e, inclusive, podem até salvar malhas intermediárias para recuperar alguma etapa da construção de malha.

E aí? Como você usa as métricas para avaliar a qualidade da malha? Deixe seu comentário!

June 28, 2015

Geração de malhas: um grande problema

As equações diferenciais de transporte aplicadas ao escoamento de fluidos, ao serem discretizadas, formam um sistema linear de equações. Contudo, fica a dúvida. O quão acurada é a aproximação das equações diferenciais representada pelo sistema algébrico? A resposta vem do fundamento da metodologia numérica empregada e como o domínio de cálculo é discretizado.

Formulação e discretização do domínio

Para uma dada propriedade conservada em um volume de controle, as equações de tranporte são válidas para qualquer ponto infinitesimal dentro deste volume. Vale notar que a região do contorno afeta o comportamento da propriedade conservada. Para a solução numérica, o domínio passa a ser discretizado sendo, portanto, composto de vários subdomínios.

Discretização de domínio no espaço e tempo

Este processo é chamado de geração da malha computacional. A forma geométrica dos elementos de malha (subdomínios) afetam diretamente quão bem o domínio está representado e a acurácia da aproximação numérica da discretizacão das equações a serem resolvidas no espaço.

Entendendo a formulação

Para descrever o processo, vamos considerar que queremos resolver o problema de escoamento bidimensional com expansão abrupta. O domínio geométrico é bastante simples.

Canal com expansão abrupta

Para simplificar a formulação, vamos considerar a conservação de uma propriedade genérica transportada pelos mecanismos de advecção e difusão. Com isso, a equação de transporte deve ter a forma como colocada abaixo:

A discretização do domínio geométrico pode ser bastante simples, com elementos quadriláteros por exemplo.

Utilizando a técnica dos volumes finitos, a equação diferencial passa a ser válida para cada elemento discreto. Por sua vez, os operadores diferenciais (divergente e laplaciano/gradiente) passam a ser obtidos pelo fluxo de propriedade que atravessa as superfícies/faces dos elementos. Com isso, a equação para um elemento discreto genérico P, composto de faces f, se torna:

Na metodologia de volumes finitos, é usual (mas não obrigatório) que as variáveis estejam alocadas no centro dos volumes. Assim, os fluxos nas faces são estimados através das variáveis nos centros dos volumes. Note que estes fluxos são normais às faces dos volumes e, portanto, o ideal é que a aproximação numérica mantenha esta característica.

Os problemas na aproximação numérica

Dependendo do formato dos elementos de malha, a aproximação dos fluxos normais às faces fica comprometida. Para a malha gerada no canal com expansão abrupta, podemos organizar o equacionamento para um dado volume P de acordo com seus volumes vizinhos.

Por exemplo, para equacionar os fluxos que atravessam as faces do volume P, utiliza-se uma aproximação numérica envolvendo seus vizinhos E, W, N, S. Desta forma, a equação para o volume P usualmente envolve os valores dos vizinhos.
Mas a principal questão envolve a forma de representar o fluxo normal à face e o formato dos elementos da malha. O ideal seria que o vetor que liga os centros dos volumes fosse paralelo ao vetor normal à face. Desta forma, uma aproximação numérica usando o valor da variável no centro dos volumes já estaria respeitando a direção do fluxo normal à face. Isso facilita a vida, não?
Caso não o seja, a aproximação numérica precisaria ser corrigida ou adaptada para considerar o desvio do fluxo normal à face. São diferentes formas de correção do fluxo e irei discutir isso em futuros posts.

A ajuda da malha na representação do fluxo de propriedade

Vale notar que o formato geométrico dos volumes afeta diretamente a conectividade entre seus centros. Deste modo, afeta como será o cálculo da aproximação numérica. Este é o principal motivo dos profissionais de CFD buscarem a “malha perfeita” para seus problemas. E este é um dos tópicos que pretendo focar daqui em diante.
Espero que o texto tenha esclarecido algumas dúvidas. Se ainda sobrou algo, fique à vontade para comentar no post.

Um abraço e até a próxima!

June 26, 2015

Reativando o blog

Depois de muito, mas muito tempo ausente, decidi reativar as postagens sobre Fluidodinâmica Computacional, fenômenos de transporte e assuntos correlatos aqui no Notas em CFD. A decisão não foi difícil, mas complicada pelas atividades do dia a dia.

Atividades paralelas

De fato, o principal motivo pela queda na publicação de posts foram as atividades dos autores. Durante o período de atividades do Notas em CFD, todos defenderam as suas teses e hoje já são felizes detentores de títulos de doutorado. Mas suas atividades não pararam por aí... Por exemplo, o João Felipe Mitre hoje é professor na Universidade Federal Fluminense e em plena forma de suas atividades didáticas. O mesmo destino ocorreu com a Livia Jatobá, que hoje é professora na Universidade Estadual do Rio de Janeiro. Por sua vez, o Fábio Santos é pesquisador associado ao Instituto Nacional de Matemática Pura e Aplicada, IMPA. Por fim, o Jovani se encontra como pesquisador contratado em projetos de pesquisa na UFRJ e mantém atividades como sócio na empresa de consultoria em CFD, Wikki Brasil.

E você, Luiz F.?

Bem, eu já tinha assumido o cargo de professor na Escola de Química da Universidade Federal do Rio de Janeiro e tentei manter as postagens no Notas. Mas as atividades de professor novo são, em um bom carioquês, sinistras. Desde 2009, eu preparei vários cursos de graduação e pós-graduação, orientei projetos finais, dissertações de mestrado e teses de doutorado. Essa é a parte divertida, mas tem toda a parcela burocrática entranhada no sistema. E isso me toma um tempo absurdo. Em especial quando assumi o cargo de chefe do departamento. Aí o tempo livre chegou quase à escala negativa. A hora de ir ao banheiro tinha que ser agendada com uma semana de antecedência…

Reativação do Notas

Depois da correria do início de carreira, muitos cursos já estão preparados, orientações encaminhadas (ou não…) e os macetes sobre a burocracia e suas regras aprendidas. Pensei nas atividades que eu considerava importantes e prioritárias na função de docente e educador em engenharia. E me lembrei do carinho que sempre tive pelo Notas em CFD. Realmente gostava de escrever os posts, ter o retorno dos leitores e poder contribuir com a propagação do uso de CFD, sua teoria e ferramentas. Portanto, aqui estou de volta.
Espero que gostem dos posts (já tenho alguns planejados) e das novidades que devo implementar aqui… Curioso? Bem, atingi meu objetivo.
Até a próxima semana!