Làm thế nào để thực hiện hiệu quả các điều kiện biên Dirichlet trong ma trận phần tử hữu hạn thưa thớt toàn cầu


9

Tôi đang tự hỏi làm thế nào các điều kiện biên Dirichlet trong ma trận phần tử hữu hạn thưa thớt toàn cầu thực sự được thực hiện một cách hiệu quả. Ví dụ: giả sử ma trận phần tử hữu hạn toàn cầu của chúng tôi là:

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

Sau đó, để áp dụng điều kiện Dirichlet trên nút đầu tiên ( ), chúng tôi sẽ loại bỏ hàng đầu tiên, đặt 1 tại K 11 và trừ cột đầu tiên từ phía bên tay phải. Ví dụ: hệ thống của chúng tôi sẽ trở thành: K = [ 1 0 0 0 0 0 4 1 0 0 0 1 6 3 2 0 0 3 7 0 0 0 2 0 3 ]x1=cK11

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

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

K11

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

Ưu điểm của phương pháp này là nó duy trì tính đối xứng của ma trận trong khi cũng rất hiệu quả đối với các định dạng lưu trữ thưa thớt. Câu hỏi của tôi như sau:

Các điều kiện biên Dirichlet thường được triển khai như thế nào trong các mã phần tử hữu hạn cho nhiệt / chất lỏng? Có phải mọi người thường sử dụng phương pháp số lượng lớn hoặc họ làm gì khác? Có bất kỳ bất lợi cho phương pháp số lượng lớn mà ai đó có thể nhìn thấy? Tôi giả định rằng có lẽ có một số phương pháp hiệu quả tiêu chuẩn được sử dụng trong hầu hết các mã thương mại và phi thương mại để giải quyết vấn đề này (rõ ràng tôi không mong mọi người biết tất cả các hoạt động bên trong của mọi người giải quyết phần tử hữu hạn thương mại, nhưng vấn đề này có vẻ cơ bản / cơ bản đủ để ai đó có khả năng đã làm việc trong các dự án như vậy và có thể cung cấp hướng dẫn).


2
Bạn có bằng chứng rằng điều này thực sự làm bạn chậm lại?
Bill Barth

@BillBarth Vâng, mặc dù luôn có cơ hội là tôi đang làm gì đó không hiệu quả. Chính Gennadily viết rằng trong khi phương thức tường minh dễ dàng cho các mảng 2d đầy đủ, ".. không phải lúc nào cũng dễ dàng truy cập các hàng và cột ma trận khi một ma trận ở định dạng nhỏ gọn." gợi ý rằng phương pháp rõ ràng có thể khó thực hiện hơn. Vì mã của tôi hiện đang được viết, phương thức rõ ràng có thể mất nhiều thời gian hơn sau đó giải quyết thực tế.
James

1
làm như Wolfgang nói và áp dụng các điều kiện biên cho ma trận phần tử trước khi bạn lắp ráp.
Bill Barth

@BillBarth Có tôi nghĩ tôi sẽ làm điều đó. Video của anh ấy thật tuyệt vời! Tôi chỉ để lại một bình luận / câu hỏi cho anh ấy về việc bạn có cần lắp ráp lại các ma trận toàn cầu ở mỗi dấu thời gian hay không, sau đó tôi nghĩ tôi sẽ chấp nhận câu trả lời của anh ấy.
James

Câu trả lời:


11

Trong deal.II ( http://www.dealii.org - từ chối trách nhiệm: Tôi là một trong những tác giả chính của thư viện đó), chúng tôi loại bỏ toàn bộ các hàng và cột và nó không quá đắt về tổng thể. Mẹo nhỏ là sử dụng thực tế là mô hình thưa thớt thường đối xứng, vì vậy bạn biết những hàng nào bạn cần xem xét khi loại bỏ toàn bộ một cột.

Cách tiếp cận tốt hơn, theo quan điểm của tôi, là loại bỏ các hàng và cột này trong ma trận ô, trước khi chúng được thêm vào ma trận toàn cục. Ở đó bạn làm việc với ma trận đầy đủ, vì vậy mọi thứ đều hiệu quả.

Tôi chưa bao giờ nghe về cách tiếp cận số lượng lớn và sẽ không sử dụng nó bởi vì chắc chắn nó sẽ dẫn đến các vấn đề tồi tệ về điều hòa.

Để tham khảo, các thuật toán chúng tôi sử dụng trong deal.II được mô tả khái niệm trong các bài giảng 21.6 và 21,65 tại http://www.math.colostate.edu/~bangerth/ideo.html . Họ phù hợp chặt chẽ với mô tả của bạn.


2
Trong trường hợp xảy ra sự cố phụ thuộc thời gian (giả sử phương trình nhiệt), bạn có lắp ráp lại ma trận toàn cầu ở mọi dấu thời gian không? Lý do tôi hỏi là trong trường hợp điều kiện Dirichlet khác không, bạn cần thông tin từ ma trận toàn cầu ban đầu khi sửa đổi phía bên phải, nhưng nếu bạn loại bỏ các cột đó trong dấu thời gian trước đó thì thông tin này sẽ bị mất (trừ khi bạn lưu trữ nó trong mảng bổ sung). Đây sẽ không phải là vấn đề nếu ma trận toàn cầu được lắp ráp lại mỗi dấu thời gian mặc dù đó là điều tôi đang xem xét và dù sao cũng phải làm gì nếu sử dụng lưới thích ứng.
James

1
Nó phụ thuộc vào ứng dụng. Tất cả các mã "lớn" giải quyết các vấn đề phụ thuộc thời gian phi tuyến và đối với những điều này rõ ràng là bạn cần phải lắp ráp lại bằng cách này hay cách khác. Đối với mã tuyến tính, bạn chỉ có thể lưu trữ ma trận gốc và trong mỗi lần sao chép nó ở một nơi khác, áp dụng các điều kiện biên và sau đó sử dụng nó trong bộ giải. Điều này chỉ cần nhiều bộ nhớ hơn, nhưng nếu không thì rẻ.
Wolfgang Bangerth

1
Ah tôi thấy đó là những gì tôi nghi ngờ. Tôi sẽ thực hiện như bạn đề xuất. Ok đó là sự giúp đỡ của bạn. Những video hướng dẫn deallii là btw thực sự tốt!
James

2

Không có BC là dễ dàng. Đối với Non zero BC, bạn cũng có thể sử dụng hệ số nhân Lagrange. Ví dụ, xem ở đây . Một lợi thế của LM là bạn có thể sử dụng bất kỳ phương trình ràng buộc nào, mặc dù hệ thống trở nên vô định nên bạn cần một người giải thích hợp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.