Sou desenvolvedor web a aproximadamente 2 anos, e a pouco tempo me fascinei por física computacional, mais especificamente (pelo menos por enquanto) a CFD (Computational Fluid Dynamics).
Atualmente tenho o conhecimento voltado a tudo que envolve desenvolvimento web com ênfase nas linguagens Python, GoLang e TypeScript e estou no terceiro semestre do bacharelado em Engenharia de Software.
O interesse a CFD veio por conta desse vídeo: https://www.youtube.com/watch?v=y9hhHIzg_QM e também pela vontade de mexer com programação de baixo nível.
O desafio dessa jornada é o seguinte:
- Não lembro de nada de física, nem o que aprendi no ensino médio.
- Basicamente minha matemática se resume a contas de padaria.
- Só sei me comunicar em inglês por texto. Isso é um problema pois imagino que (como a maioria das coisas no Brasil) o mercado de trabalho para desenvolvedores no ramo de física computacional deve ser escasso.
- Vi que comumente é utilizado as linguagens C++, Fortran e Python. Desses três só tive contato com Python.
Na busca de um roadmap, utilizei o ChatGPT. Basicamente pedi que gerasse um plano de estudo para codar um solver CFD do zero utilizando C++ e foi isso que ele me retornou:
Roadmap para Criar um Solver de CFD em C++
1. Aprender Fundamentos de C++
• Focar em conceitos essenciais como ponteiros, alocação dinâmica, templates e funções inline.
• Entender classes, objetos, polimorfismo e herança para estruturar o solver.
• Aprender o uso de bibliotecas padrão como a Standard Template Library (STL), especialmente contêineres como `vector`, `deque` e iteradores.
2. Revisar Fundamentos de Matemática Numérica
• Estudar álgebra linear numérica (decomposição LU, métodos iterativos como Gradiente Conjugado).
• Entender discretização de equações diferenciais parciais (EDPs) usando métodos como Diferenças Finitas (FDM) e Volumes Finitos (FVM).
• Revisar métodos de integração numérica e discretização temporal (métodos explícitos e implícitos, como Euler e Runge-Kutta).
3. Estruturas de Dados para CFD
• Implementar malhas (2D e 3D) para representar o domínio espacial. Escolher entre malhas estruturadas ou não estruturadas, dependendo da aplicação.
• Implementar estruturas de dados eficientes para armazenar variáveis de estado (pressão, velocidade, temperatura) associadas a cada célula da malha.
• Estudar algoritmos de interpolação e tratamento de fronteiras (condições de contorno de Dirichlet, Neumann, etc.).
4. Implementação dos Solvers Numéricos
• Começar implementando um solver de Diferenças Finitas (FDM) para problemas simples (como condução de calor 1D e 2D).
• Expandir para o Método dos Volumes Finitos (FVM) para resolver escoamentos incompressíveis, usando as equações de Navier-Stokes.
• Implementar esquemas numéricos para tratamento de advecção e difusão, como UPWIND e Lax-Friedrichs.
5. Solvers Iterativos para Sistemas Lineares
• Implementar métodos iterativos como Gradiente Conjugado (CG) e GMRES para resolver sistemas lineares grandes, que surgem da discretização das equações de Navier-Stokes.
• Explorar a utilização de pré-condicionadores para acelerar a convergência dos métodos iterativos.
6. Modelos de Turbulência
• Estudar e implementar modelos de turbulência como o RANS (Reynolds-Averaged Navier-Stokes) para simulações mais realistas.
• Explorar Large Eddy Simulation (LES) para capturar mais detalhes de escoamentos turbulentos.
7. Paralelismo e Otimização
• Aprender sobre paralelismo em C++ usando OpenMP para dividir a computação em múltiplos núcleos.
• Explorar o uso de MPI (Message Passing Interface) para distribuir a carga de trabalho entre múltiplos nós em clusters de computadores.
• Otimizar o uso de memória e CPU, ajustando estruturas de dados e algoritmos para melhorar a performance do solver.
8. Visualização dos Resultados
• Integrar bibliotecas para visualização de dados científicos, como VTK ou Paraview, para analisar os resultados das simulações.
• Aprender a exportar os dados gerados pelo solver em formatos compatíveis com ferramentas de visualização, como VTK ou CSV.
9. Validação e Testes
• Validar o solver implementando testes com casos benchmark conhecidos de CFD (como escoamento ao redor de um cilindro ou condução de calor em uma placa).
• Comparar os resultados com soluções analíticas ou simulações feitas por software comercial (ANSYS Fluent, OpenFOAM).
10. Expansões Futuras
• Considerar a implementação de simulações de escoamentos compressíveis e o uso de esquemas numéricos para ondas de choque.
• Explorar acoplamento fluido-estrutura para modelar interações entre fluidos e sólidos, usando métodos como Immersed Boundary.
• Iniciar a implementação de um solver baseado em malha não estruturada para simular geometria complexa.
Bem... começarei por C++ então 🤷.