Küresel seyrek sonlu eleman matrislerindeki Dirichlet sınır koşullarının gerçekten nasıl verimli bir şekilde uygulandığını merak ediyorum. Örneğin, küresel sonlu elemanlar matrisimizin şöyle olduğunu söyleyelim:
Daha sonra ilk düğüme bir Dirichlet koşulu uygulamak için ( ) ilk satırı sıfırlar, 1 koyar ve ilk sütunu sağ taraftan çıkarırız. Örneğin sistemimiz şöyle olur:
Teoride bu iyi ve iyidir, ancak K matrisimiz sıkıştırılmış satır formatında (CRS) saklanırsa, sütunları sağ tarafa taşımak büyük sistemler için pahalı hale gelir (birçok düğüm dirichlettir). Alternatif olarak, bir Dirichlet koşuluna karşılık gelen sütunları sağ tarafa , yani sistemimiz şu şekilde olur:
Bununla birlikte, sistemin artık simetrik olmadığı ve bu nedenle artık önceden koşullandırılmış eşlenik gradyanı (veya diğer simetrik çözücüleri) kullanamadığımız için büyük bir dezavantajı vardır. Karşılaştığım ilginç bir çözüm, Gennadiy Nikishkov'un "Java'da Sonlu Elemanları Programlama" kitabında bulduğum "Büyük Sayılar Yöntemi" dir. Bu yöntem, çift duyarlığın sadece yaklaşık 16 basamak doğruluk içerdiğini kullanır. konumuna 1 koymak yerine, çok sayıda yerleştiriyoruz. Örneğin sistemimiz:
Bu yöntemin avantajları, seyrek depolama formatları için de çok verimli olmakla birlikte matrisin simetrisini sürdürmesidir. Sorularım şu şekilde:
Dirichlet sınır koşulları tipik olarak ısı / sıvılar için sonlu eleman kodlarında nasıl uygulanır? İnsanlar genellikle çok sayıda yöntemi kullanıyorlar mı yoksa başka bir şey yapıyorlar mı? Birinin görebileceği büyük sayıların yönteminde herhangi bir dezavantaj var mı? Muhtemelen bu sorunu çözen çoğu ticari ve ticari olmayan kodda kullanılan bazı standart verimli bir yöntem olduğunu varsayıyorum (açıkçası insanların her ticari sonlu eleman çözücünün tüm iç işlerini bilmelerini beklemiyorum, ancak bu sorun temel / temel görünüyor muhtemelen biri bu tür projeler üzerinde çalışmış ve rehberlik sağlayabilir).