Estou interessado em AMR local em malhas não estruturadas. Atualmente, estou trabalhando com a biblioteca OpenFOAM - ela suporta AMR local completamente não estruturada:
- critérios de refinamento de células determinam uma lista de células que são cortadas
- as células selecionadas são refinadas: a malha inteira é reconstruída
- um mapa é criado da malha antiga para uma nova
- a conectividade é recalculada (células da face, faces da borda etc.)
- campos são mapeados para a nova malha
Como as estruturas de dados envolvidas são basicamente vetores C ++, a malha é inflada e copiada.
Preciso aprender sobre abordagens alternativas que podem ser construídas sobre uma malha que usa estruturas de dados estáticas. Um deles é o AMR paralelo de Octree Forrest, presente em p4est e Dendro .
Alguém pode me indicar um artigo de revisão recente sobre estratégias locais de AMR adaptativas para malha não estruturada?
O aconselhamento com base na experiência seria ainda melhor: qual mecanismo de AMR local é a escolha ideal para malha não estruturada baseada em estrutura de dados fixa?
Preciso de uma visão geral antes de ler sobre o equilíbrio da comunicação entre árvores na primeira página de um artigo. :)
Respostas:
Pelos comentários acima, entendo que você deseja evitar copiar o vetor ao adicionar mais células. A abordagem mais fácil é reservar espaço para o número máximo de células que você deseja:
Seu vetor alocou espaço para a criação de células maxNoCells, mas nenhuma célula foi criada ainda. Agora você pode adicionar maxNoCells ao seu vetor, a cada operação no
O(1)
tempo, sem que o vetor se copie. No entanto, o padrão C ++ exige que a operação push_back seja amortizadaO(1)
. Se você adicionar mais do que maxNoCells, o vetor se copiará, reservando espaço para k-vezes quantas células anteriormente (implementações típicas escolhem ak entre 1,4 e 2), para que você possa continuar adicionando células ao vetor aO(1)
tempo. Esta operação de redimensionamento não éO(1)
.O(1)
O(1)
time ... desde que você reserve memória primeiro, você pode adicionar elementos no tempo O (1) também! Como o professor Bangerth mencionou acima, estruturas hierárquicas de dados, como árvores, também usam vetores internamente para armazenar seus dados.No entanto, acho melhor prática alocar memória no início da simulação. Você precisa saber quantas células você pode precisar para verificar se você possui memória suficiente disponível. Você não deseja que sua simulação em 200.000 processadores tenha que realocar sua estrutura de dados ou ficar sem memória e ter que trocar para o disco. Caso isso aconteça, minha opinião é que seu programa falhe alto devido a um erro de entrada do usuário.
fonte