Bu sorunun zaten cevaplandığını biliyorum, ancak burada OpenFOAM C ++ kütüphanesinde uygulanan benzer bir tek yüz tabanlı döngü depolama:
Her hücrenin, cellList içinde bir dizin (ID) vardır. Tüm yüzler için iki liste tanımlanmıştır: "yüz dahili sahibi" ve "yüz komşusu". Her iki yüz listesinin uzunluğu, kafes içindeki iç yüzlerin sayısına karşılık gelir. Bir yüz sahibi, cellList öğesinde daha düşük ID'ye sahip olan hücre olacaktır (yüz komşusunun tersi). Sınır yüzleri en son yazılır ve dışa dönük normallere (çözelti alanından) ve elbette sadece bir sahip hücreye sahiptirler. Normal yüz alanı, sahip olan hücreden komşu hücreye doğru bakacak şekilde yönlendirilir.
Bu, akı hesaplaması için iyi çalışır. Akı, yüz başına bir kez değerlendirilir ve sahip hücreler için toplam yüzlerin toplamına eklenir ve komşu hücrelerden çıkarılır (toplama / çıkarım, normal yüz alanının yönüne göre belirlenir). Sınır yüzleri, yüz listesinin altında sıralanır ve saklanır, böylece sınır koşullarının yüz listesinin dilimleri (başlangıç etiketi, sınır yamasının bitiş etiketi) olarak tanımlanması sağlanır, böylece sınır koşullarının uygulanması da basitleştirilir. sınırlama koşulları için güncelleme sürecinin arttırıcı verimliliği olarak, çünkü iç yüzlerdeki işlemlerin sağladığı çözüme dayanmaktadır.
Sınır yüzleri yamalar halinde toplandığından, çiftler arası (işlemci) yamalar için süreçler arası iletişim tanımlanır ve önceden tanımlanır. Bu, sınır ağı üzerinde bir döngü olduğu anda, üst düzey erişim işlevlerinin, yukarıda açıklanan yüz tabanlı bağlantıya dayanması durumunda, bu kodu "otomatik olarak" paralel hale getirerek sarılmış MPI çağrılarını içerdiği anlamına gelir.