Atualmente, estou desenvolvendo um método de decomposição de domínio para a solução do problema de espalhamento. Basicamente, estou resolvendo um sistema de Helmholtz BVPs iterativamente. Discreto as equações usando o método dos elementos finitos sobre malhas triangulares ou tetraédricas. Estou desenvolvendo o código para minha tese de doutorado. Estou ciente de algumas das bibliotecas de elementos finitos existentes no mercado, como deal.ii ou DUNE, e embora elas sejam ótimas, com design inspirador e API, para fins de aprendizado, eu queria desenvolver meu próprio aplicativo a partir do zero.
Estou em um ponto em que tenho minhas versões seriais em execução e agora quero paralelizá-las. Afinal, é um dos pontos fortes da estrutura de decomposição de domínio formular algoritmos fáceis de paralelizar, pelo menos em princípio. Na prática, porém, há muitos detalhes que se deve considerar. O gerenciamento de malha é um deles. Se os aplicativos atingirem alta resolução enquanto escalam bem para muitas CPUs, a replicação de uma malha inteira em cada CPU é ineficiente.
Eu queria perguntar aos desenvolvedores que trabalham em aplicativos semelhantes em ambientes de computação de alto desempenho como eles lidam com esse problema.
Existe uma biblioteca p4est para gerenciamento de malha distribuída. Eu não preciso de AMR, portanto pode ser um exagero, pois estou interessado apenas em usar malhas uniformes e não tenho certeza se ele pode refinar malhas triangulares. Eu também poderia simplesmente criar uma malha uniforme, depois alimentá-la em um dos particionadores de malha e fazer algum processamento posterior da saída.
A abordagem mais simples parece criar um arquivo separado para cada partição que contém informações de malha relevantes apenas para essa partição específica. Esse arquivo seria lido por uma única CPU, responsável pela montagem do sistema discreto naquela parte da malha. Obviamente, algumas informações de conectividade / vizinhança da partição global também precisariam ser armazenadas em um arquivo lido por todas as CPUs para comunicação entre processos.
Que outras abordagens existem por aí? Se alguns de vocês pudessem compartilhar, quais são algumas das metodologias mais usadas no setor ou nas instituições governamentais de pesquisa relacionadas ao tratamento desse problema? Eu sou muito novo na programação de um solucionador de elementos finitos paralelo e queria ter uma idéia se estou pensando ou não sobre esse problema corretamente e como os outros estão se aproximando. Qualquer conselho ou indicação de artigos de pesquisa relevantes seria muito apreciado!
Desde já, obrigado!