Yapılandırılmamış hücre merkezli FVM CFD kodu için bazı iyi veri türleri nelerdir?


12

Yapılandırılmamış hücre tabanlı sonlu hacimli CFD'de hücre taraması için verimli veri yapıları için bir tavsiye ile ilgileniyorum.

Karşılaştığım bir örnek ( dolfyn cfd kodunda) şöyle gider (ilgili segmenti göstereceğim) Yani her hücre için yüz sayısının saklandığı bir dizi NFaces var. Ardından, yerel hücreden yüz numarasına global yüz numarasına eşlenen CFace dizisi.

\begin{listing}do ip=1,Ncel         ...         do j=1,NFaces(ip)           k   = CFace(ip,j)           ipp = Face(k)%cell1           inn = Face(k)%cell2           if( inn > 0 )then             ! internal\end{listing}

Kod yüz tabanlıdır, bu nedenle Yüz (k)% hücre1 ve Yüz (k)% hücre2 arasında bulunduğu iki hücrenin seri numarasını depolayan bir yüz veri türü vardır.

Bu konuda herhangi bir yorum veya alternatif yaklaşım önerileri kabul edilir.

Yanıtlar:


9

Gösterdiğiniz yapı, ortak bir seçimdir ve sınır yüzündeki hayalet hücreler özel bir yerde olacak şekilde hücre yüzünün bitişiklerini bir CSR matris biçiminde depolamaya eşdeğerdir. Bununla birlikte, FV yöntemlerinin, her yüzün sadece bir kez ziyaret edildiği tamamen veya neredeyse tamamen yüz traversalinden oluşacak şekilde formüle edilebileceğini unutmayın (her iki taraftan yüz merkezine / kareleme noktasına bakacak şekilde yeniden yapılandırın, Riemann problemini çözün, akı hücrelere kalıntıya geri dağıtın ). Hücre tabanlı geçişinizi kullanarak ve seyrek matristeki "diyagonal" in altındaki iki hücreyi atlayarak "taklit edebilirsiniz", ancak popüler bir alternatif depolamaktır.(leftCell, rightCell) = support(face)bu durumda yüzler birinci sınıf varlık haline gelir. Bu yararlıdır çünkü tipik olarak yüz dördünleme noktalarını (centroids), yüz normallerini depolamak için bir yere ihtiyacınız vardır. Yeniden yapılandırma parçalarını (en az kareler gibi) yüz tabanlı veri yapılarına da koyabilirsiniz. Tüm boyutlar düzenli olduğu için yüz geçişi görünüşte vektörleştirme dostudur, ancak öte yandan, üst üste binen çıktılar vardır, bu nedenle iç döngüye koymaktan kaçınmak için geçişi organize etmeniz gerekir. Bu daha yüz odaklı veri yapısı ile, her bir sınır koşulu tipinin bitişik bir yüz geçişi (ayrıca vektörizasyon dostu) kullanılarak uygulanabilmesi için yüz numaralarını sipariş etmek doğaldır.

Bu veri yapısını seçerseniz, yüzleri, geçişin önbellekteki hücre verilerini olabildiğince tekrar kullanacak şekilde sıralamayı unutmayın. Yüz sıralaması ve ilgili optimizasyonların performans analizi için PETSc-FUN3D belgelerinden herhangi birine bakın.


Yüzlerin üzerinden geçerseniz, akıları hesaplamak için bir sol Hücre ve sağ Hücre'den bilgi almanız gerekir, yüz 1'in sol Hücre 1 ve sağ Hücre 10, yüz 2 sol Hücre 6 ve sağ Hücre 31'e sahip olduğunu varsayalım ... . Vectorization nasıl kolay olurdu?
chris

Yukarıda belirtildiği gibi (ve PETSc-FUN3D kağıtlarında tartışılmıştır), yüzlerin önbelleği yeniden kullanmasını istersiniz. Sonuç, her yüzün yalnızca bir kez ziyaret edildiği "tek taraflı" bir hücre geçişi gibidir.
Jed Brown

3

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.


Sorun değil, bu açıklamanın birisi için yararlı olduğunu gördüğüme sevindim .. :) Siz de OpenFOAM ile mi çalışıyorsunuz?
tmaric

Eskiden biraz geçmişte. Genellikle kabul edilen trendlerden uzak durmaya ve tekerleği yeniden keşfetmeye çalışırım. Bu benim Tao'm.
Johntra Volta

1
Tao'nuz Bilgisayar Bilimi Tao'nun tersidir: "Tekerleği yeniden icat etme". Ama anlayabiliyorum, sıfırdan bir şeyler yapmak çekici! :)
tmaric
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.