Je suis intéressé par un conseil pour des structures de données efficaces pour la navigation cellulaire dans les CFD à volume fini à base de cellules non structurées.
Un exemple que j'ai rencontré (dans le code dolfyn cfd) va comme ceci (je vais montrer le segment pertinent) Nous avons donc un tableau NFaces où le nombre de faces pour chaque cellule est stocké. Ensuite, un tableau CFace qui mappe le numéro de face local à cellule au numéro de face global.
Le code est basé sur le visage, il existe donc un type de données de visage qui stocke le numéro de série de deux cellules, il se situe entre Face (k)% cell1 et Face (k)% cell2.
Tout commentaire à ce sujet ou suggestions pour une approche alternative sont les bienvenus.
la source
Je sais que cette question a déjà reçu une réponse, mais voici un stockage en boucle basé sur une seule face similaire qui est implémenté dans la bibliothèque OpenFOAM C ++:
Chaque cellule a un index (ID) dans un cellList. Deux listes sont définies pour toutes les faces: "face interne propriétaire" et "face voisin". La longueur des deux listes de faces correspond au nombre de faces internes dans le maillage. Un propriétaire de visage sera la cellule dont l'ID est le plus bas dans la cellule (en face pour le voisin de visage). Les faces frontières sont écrites en dernier, et elles ont des normales orientées vers l'extérieur (du domaine de la solution), et bien sûr, une seule cellule propriétaire. La zone du visage normale est orientée de façon à ce qu'elle regarde vers l'extérieur de la cellule propriétaire vers la cellule voisine.
Cela fonctionne bien, par exemple pour le calcul de flux. Le flux est évalué une fois par face, et il est ajouté à la somme des faces totales pour les cellules propriétaires, et déduit des cellules voisines (la sommation / déduction est décidée en fonction de l'orientation normale de la zone du visage). Les faces limites sont triées et stockées au bas de la liste des faces, ce qui permet de définir les conditions aux limites comme des tranches de la liste des faces (étiquette de début, étiquette de fin du patch de limite), simplifiant ainsi la mise en œuvre des conditions aux limites. comme une amélioration de l'efficacité du processus de mise à jour des conditions aux limites, puisqu'il s'appuie sur la solution apportée par les opérations sur les faces internes.
Étant donné que les faces limites sont agglomérées en patchs, la communication interprocessus est définie pour les patchs couplés (processeur) et prédéfinie. Cela signifie que dès qu'il y a une boucle sur le maillage de limite, les fonctions d'accès de niveau supérieur envoient des appels MPI enveloppés, rendant ce code parallélisé "automatiquement", s'il s'appuie sur la connectivité basée sur le visage expliquée ci-dessus.
la source