วิธีการใช้เงื่อนไขขอบเขต Dirichlet อย่างมีประสิทธิภาพในเมทริกซ์ stiffnes องค์ประกอบ จำกัด กระจัดกระจายทั่วโลก


9

ฉันสงสัยว่าเงื่อนไขขอบเขตของ Dirichlet ในเมทริกซ์องค์ประกอบกระจัดกระจายทั่วโลกนั้นมีการใช้งานจริงได้อย่างมีประสิทธิภาพหรือไม่ ตัวอย่างเช่นสมมติว่าเมทริกซ์องค์ประกอบไฟไนต์โกลบอลของเราคือ:

K=[520-102410001632-1037000203]และเวกเตอร์ด้านขวา=[12345]

จากนั้นเมื่อต้องการใช้เงื่อนไข Dirichlet บนโหนดแรก ( ) เราจะทำให้แถวแรกเป็นศูนย์โดยใส่ 1 ที่และลบคอลัมน์แรกจากด้านขวามือ ตัวอย่างเช่นระบบของเราจะกลายเป็น: x1=K11

K=[1000004100016320037000203]และเวกเตอร์ด้านขวา=[2-2×3-0×4+1×5-0×]

ทั้งหมดนี้เป็นทฤษฎีที่ดีและดี แต่ถ้า K matrix ของเราถูกจัดเก็บในรูปแบบแถวที่ถูกบีบอัด (CRS) แล้วการย้ายคอลัมน์ไปทางด้านขวาจะกลายเป็นค่าใช้จ่ายสำหรับระบบขนาดใหญ่ (มีหลายโหนดที่เป็น dirichlet) อีกทางเลือกหนึ่งคือไม่ย้ายคอลัมน์ที่สอดคล้องกับเงื่อนไข Dirichlet ไปทางด้านขวามือนั่นคือระบบของเราจะกลายเป็น:

K=[100002410001632-1037000203]และเวกเตอร์ด้านขวา=[2345]

อย่างไรก็ตามสิ่งนี้มีการดึงกลับที่สำคัญในระบบที่ไม่สมมาตรอีกต่อไปดังนั้นเราจึงไม่สามารถใช้การไล่ระดับสีแบบคอนจูเกตแบบผันแปรได้อีกต่อไป (หรือตัวแก้สมมาตรอื่น ๆ ) ทางออกหนึ่งที่น่าสนใจที่ฉันเจอคือ "วิธีการของตัวเลขจำนวนมาก" ที่ฉันพบในหนังสือ "Programming Finite Elements in Java" โดย Gennadiy Nikishkov วิธีนี้ใช้ความจริงที่ว่าความแม่นยำสองเท่ามีความแม่นยำประมาณ 16 หลักเท่านั้น แทนที่จะใส่ 1 ในตำแหน่งเราวางจำนวนมาก ตัวอย่างเช่นระบบของเรากลายเป็น: K11

K=[1.0อี6420-102410001632-1037000203]และเวกเตอร์ด้านขวา=[×1.0อี642345]

ข้อดีของวิธีนี้คือการรักษาความสมมาตรของเมทริกซ์ในขณะที่ยังมีประสิทธิภาพมากสำหรับรูปแบบการจัดเก็บเบาบาง คำถามของฉันมีดังนี้:

เงื่อนไขขอบเขตของ Dirichlet โดยทั่วไปนำมาใช้ในรหัสองค์ประกอบ จำกัด สำหรับความร้อน / ของเหลวอย่างไร ผู้คนใช้วิธีการของคนจำนวนมากโดยปกติหรือพวกเขาทำอย่างอื่นหรือไม่? มีข้อเสียกับวิธีการของคนจำนวนมากที่มองเห็นได้หรือไม่? ฉันสมมติว่าอาจมีวิธีมาตรฐานที่มีประสิทธิภาพที่ใช้ในรหัสเชิงพาณิชย์และไม่ใช่เชิงพาณิชย์ส่วนใหญ่ที่แก้ปัญหานี้ (เห็นได้ชัดว่าฉันไม่ได้คาดหวังให้คนรู้ว่าผลงานภายในทั้งหมดของตัวแก้ไของค์ประกอบเชิงพาณิชย์ จำกัด แต่ปัญหานี้ดูเหมือนพื้นฐาน เพียงพอที่ใครบางคนน่าจะได้ทำงานในโครงการดังกล่าวและสามารถให้คำแนะนำ)


2
คุณมีหลักฐานว่าสิ่งนี้ทำให้คุณช้าลงอย่างมากหรือไม่?
Bill Barth

@BillBarth ใช่แม้ว่าจะมีโอกาสที่ฉันจะทำสิ่งที่ไม่มีประสิทธิภาพเสมอ เจนนาดิลลีเขียนเองว่าในขณะที่วิธีการที่ชัดเจนนั้นง่ายสำหรับอาร์เรย์ 2 มิติเต็มรูปแบบ ".. มันไม่ได้ง่ายเสมอไปที่จะเข้าถึงแถวและคอลัมน์เมทริกซ์เมื่อเมทริกซ์อยู่ในรูปแบบกะทัดรัด" ชี้ให้เห็นว่าวิธีการที่ชัดเจนอาจจะท้าทายในการใช้อย่างมีประสิทธิภาพ ขณะที่รหัสของฉันเขียนอยู่วิธีการที่ชัดเจนอาจใช้เวลานานกว่านั้นการแก้ปัญหาจริง
James

1
ทำเหมือน Wolfgang พูดและใช้เงื่อนไขขอบเขตกับเมทริกซ์องค์ประกอบก่อนที่คุณจะประกอบ
Bill Barth

@BillBarth ใช่ฉันคิดว่าฉันจะทำอย่างนั้น วิดีโอของเขายอดเยี่ยมมาก! ฉันเพิ่งออกความเห็น / คำถามสำหรับเขาเกี่ยวกับว่าคุณจำเป็นต้องรวบรวมเมทริกซ์ทั่วโลกอีกครั้งในแต่ละการประทับเวลาหลังจากนั้นฉันคิดว่าฉันจะยอมรับคำตอบของเขา
James

คำตอบ:


11

ใน deal.II ( http://www.dealii.org - ข้อจำกัดความรับผิดชอบ: ฉันเป็นหนึ่งในผู้เขียนหลักของห้องสมุดนั้น) เราจะกำจัดทั้งแถวและคอลัมน์ทั้งหมดและโดยรวมก็ไม่แพงเกินไป เคล็ดลับคือการใช้ความจริงที่ว่ารูปแบบ sparsity เป็นแบบสมมาตรดังนั้นคุณจึงรู้ว่าแถวไหนที่คุณต้องดูเมื่อกำจัดคอลัมน์ทั้งหมด

วิธีที่ดีกว่าในมุมมองของฉันคือการกำจัดแถวและคอลัมน์เหล่านี้ในเมทริกซ์ของเซลล์ก่อนที่จะถูกเพิ่มในเมทริกซ์โกลบอล ที่นั่นคุณทำงานกับเมทริกซ์เต็มดังนั้นทุกอย่างมีประสิทธิภาพ

ฉันไม่เคยได้ยินเกี่ยวกับแนวทางจำนวนมากและจะไม่ใช้มันเพราะแน่นอนว่ามันจะนำไปสู่ปัญหาที่ไม่ดีอย่างร้ายแรง

สำหรับการอ้างอิงขั้นตอนวิธีการที่เราใช้ใน deal.II จะมีการอธิบายแนวคิดในการบรรยาย 21.6 และ 21.65 ที่http://www.math.colostate.edu/~bangerth/videos.html ตรงกับคำอธิบายของคุณ


2
ในกรณีที่มีปัญหาขึ้นอยู่กับเวลา (พูดถึงสมการความร้อน) คุณรวบรวมเมทริกซ์ระดับโลกใหม่ในทุก ๆ การบันทึกเวลาหรือไม่? เหตุผลที่ฉันถามคือในกรณีของเงื่อนไข Dirichlet ที่ไม่เป็นศูนย์คุณต้องการข้อมูลจากเมทริกซ์โกลบอลดั้งเดิมเมื่อทำการแก้ไขด้านขวามือ แต่ถ้าคุณ zeroed คอลัมน์เหล่านั้นในช่วงเวลาก่อนหน้านี้ข้อมูลนี้จะสูญหาย (เว้นแต่คุณเก็บไว้ ในอาร์เรย์เพิ่มเติม) นี่จะไม่เป็นปัญหาหาก matrix ทั่วโลกถูกประกอบใหม่ทุกเวลา แต่นั่นคือสิ่งที่ฉันกำลังพิจารณาที่จะทำและสิ่งที่จะต้องทำต่อไปหากใช้ตาข่ายแบบปรับตัว
James

1
ขึ้นอยู่กับแอพพลิเคชั่น รหัส "ใหญ่" ทั้งหมดแก้ปัญหาไม่ขึ้นกับเวลาไม่เชิงเส้นและสำหรับสิ่งเหล่านี้เป็นที่ชัดเจนว่าคุณจำเป็นต้องรวบรวมอีกวิธีหนึ่งหรืออื่น ๆ สำหรับรหัสเชิงเส้นคุณสามารถจัดเก็บเมทริกซ์ดั้งเดิมและในทุกขั้นตอนให้ทำสำเนาที่อื่นใช้เงื่อนไขขอบเขตจากนั้นใช้มันในตัวแก้ปัญหา เพียงแค่ต้องใช้หน่วยความจำเพิ่มเติม แต่ราคาถูกกว่า
Wolfgang Bangerth

1
ฉันเห็นว่าเป็นสิ่งที่ฉันสงสัย ฉันจะนำไปใช้ตามที่คุณแนะนำ ตกลงนั่นคือสำหรับความช่วยเหลือของคุณ วิดีโอฝึกสอนของ deallii นั้นดีมาก btw!
James

2

ศูนย์ BCs ง่าย สำหรับ Non zero BC's คุณสามารถใช้ตัวคูณแบบลากรองจ์ได้ เช่นดูที่นี่ ข้อดีอย่างหนึ่งของ LMs คือคุณสามารถใช้สมการข้อ จำกัด ใด ๆ ได้แม้ว่าระบบจะไม่มีขีด จำกัด ดังนั้นคุณจึงต้องการตัวแก้ปัญหาที่เหมาะสม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.