Küresel seyrek sonlu elemanlar sertlik matrislerinde Dirichlet sınır koşullarının verimli bir şekilde uygulanması


9

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:

K=[5201024100016321037000203]and right-hand side vectorb=[b1b2b3b4b5]

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: x1=cK11

K=[1000004100016320037000203]and right-hand side vectorb=[cb22×cb30×cb4+1×cb50×c]

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:

K=[1000024100016321037000203]and right-hand side vectorb=[cb2b3b4b5]

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: K11

K=[1.0e64201024100016321037000203]and right-hand side vectorb=[c×1.0e64b2b3b4b5]

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).


2
Bunun sizi önemli ölçüde yavaşlattığına dair kanıtınız var mı?
Bill Barth

@BillBarth Evet, her zaman verimsiz bir şey yapma şansım olmasına rağmen. Gennadily, tam 2d diziler için açık yöntemin kolay olmasına rağmen, ".. bir matris kompakt biçimde olduğunda matris satırlarına ve sütunlarına erişmek her zaman kolay değildir." açık yöntemin verimli bir şekilde uygulanması daha zor olabilir. Kodum şu anda yazıldığından, açık yöntem gerçek çözümden daha fazla zaman alabilir.
James

1
Wolfgang'ın dediği gibi yapın ve montajdan önce element matrislerine sınır koşulları uygulayın.
Bill Barth

@BillBarth Evet sanırım bunu yapacağım. Videoları inanılmaz! Sadece her bir zaman diliminde küresel matrisleri yeniden birleştirmeniz gerekip gerekmediği hakkında bir yorum / soru bıraktım, daha sonra cevabını kabul edeceğimi düşünüyorum.
James

Yanıtlar:


11

Deal.II ( http://www.dealii.org - yasal uyarı: Bu kütüphanenin baş yazarlarından biriyim), tüm satırları ve sütunları ortadan kaldırıyoruz ve genel olarak çok pahalı değil. İşin püf noktası, seyreklik deseninin tipik olarak simetrik olduğu gerçeğini kullanmaktır, bu nedenle tüm bir sütunu ortadan kaldırırken hangi satırlara bakmanız gerektiğini bilirsiniz.

Bana göre daha iyi yaklaşım, küresel matrise eklenmeden önce, hücre matrislerindeki bu satır ve sütunları ortadan kaldırmaktır. Orada tam matrislerle çalışıyorsunuz, bu yüzden her şey etkili.

Büyük sayılar yaklaşımını hiç duymadım ve kullanmazdım, çünkü kesinlikle kötü koşullu sorunlara yol açacaktır.

Referans olarak, deal.II'de kullandığımız algoritmalar kavramsal olarak http://www.math.colostate.edu/~bangerth/videos.html adresindeki 21.6 ve 21.65 derslerinde açıklanmaktadır . Açıklamanızla yakından eşleşiyorlar.


2
Zamana bağlı bir sorun olması durumunda (ısı denklemi diyelim) küresel matrisi her zaman aralığında yeniden birleştiriyor musunuz? Sormamın nedeni, sıfır olmayan Dirichlet koşullarında, sağ tarafı değiştirirken orijinal global matristen bilgiye ihtiyaç duymanızdır, ancak bir önceki zaman aralığında bu sütunları sıfırladıysanız, bu bilgiler kaybolur (siz depolamazsanız) ek dizilerde). Eğer küresel matris her zamana göre yeniden bir araya getirilirse bu sorun olmayacaktı, bu da benim yapmayı düşündüğüm şey ve uyarlanabilir mesh kullanılıyorsa ne yapılması gerekiyordu.
James

1
Uygulamaya bağlıdır. Tüm "büyük" kodlar doğrusal olmayan zamana bağlı sorunları çözer ve bunlar için şu ya da bu şekilde yeniden bir araya getirmeniz gerektiği açıktır. Doğrusal kodlar için, orijinal matrisi saklayabilir ve her adımda başka bir yere kopyalayabilir, sınır koşullarını uygulayabilir ve daha sonra bunu çözücüde kullanabilirsiniz. Bu sadece daha fazla bellek gerektirir, ancak aksi takdirde ucuzdur.
Wolfgang Bangerth

1
Ah şüphelendiğim şey bu. Önerdiğin gibi uygulayacağım. Tamam yardımın için. Bu deallii öğretici videolar gerçekten iyi btw vardır!
James

2

Sıfır BC'ler kolaydır. Sıfır olmayan BC'ler için Lagrange çarpanlarını da kullanabilirsiniz. Örneğin, buraya bakın . LM'lerin bir avantajı, sistem sınırsız hale gelmesine rağmen herhangi bir kısıtlama denklemini kullanabilmenizdir, bu nedenle uygun bir çözücüye ihtiyacınız vardır.

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.