Sei que esta pergunta já foi respondida, mas aqui está um armazenamento em loop baseado em uma única face, implementado na biblioteca OpenFOAM C ++:
Cada célula possui um índice (ID) em uma cellList. Duas listas são definidas para todas as faces: "proprietário interno da face" e "vizinho da face". O comprimento de ambas as listas de faces corresponde ao número de faces internas na malha. Um proprietário de rosto será a célula com o ID mais baixo na lista de células (ao contrário do vizinho do rosto). As faces de limite são escritas por último e possuem normais orientados para o exterior (do domínio da solução) e, é claro, apenas uma célula proprietária. A área da face normal é orientada de modo a olhar para fora da célula proprietária para a célula vizinha.
Isso funciona bem para, por exemplo, cálculo de fluxo. O fluxo é avaliado uma vez por face e é adicionado à soma do total de faces das células proprietárias e deduzido das células vizinhas (a soma / dedução é decidida com base na orientação da área da face normal). As faces de limite são classificadas e armazenadas na parte inferior da lista de faces, permitindo que as condições de contorno sejam definidas como fatias da lista de faces (etiqueta inicial, etiqueta final da amostra), simplificando assim a implementação das condições de fronteira, bem como como eficiência inhancing do processo de atualização para as condições de contorno, uma vez que depende da solução fornecida pelas operações nas faces internas.
Como as faces de limite são aglomeradas em patches, a comunicação entre processos é definida para patches acoplados (processadores) e predefinidos. Isso significa que, assim que houver um loop na malha de limite, as funções de acesso de nível superior acionam chamadas MPI agrupadas, tornando esse código "automaticamente" paralelizado, se depender da conectividade baseada em face explicada acima.