Bagaimana cara menerapkan kondisi batas Dirichlet secara efisien dalam matriks global elemen terbatas yang terbatas

9

Saya bertanya-tanya bagaimana kondisi batas Dirichlet dalam matriks elemen hingga global jarang benar-benar diterapkan secara efisien. Misalnya, katakanlah matriks elemen hingga global kami adalah:

K=[520-102410001632-1037000203]dan vektor sisi kananb=[b1b2b3b4b5]

Kemudian untuk menerapkan kondisi Dirichlet pada simpul pertama ( ) kita akan nol dari baris pertama, letakkan 1 di , dan kurangi kolom pertama dari sisi kanan. Misalnya sistem kami akan menjadi: K 11 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]dan vektor sisi kananb=[cb2-2×cb3-0×cb4+1×cb5-0×c]

Ini semua baik dan bagus dalam teori, tetapi jika matriks K kami disimpan dalam format baris terkompresi (CRS) maka memindahkan kolom ke sisi kanan menjadi mahal untuk sistem besar (dengan banyak node menjadi dirichlet). Alternatifnya adalah dengan tidak memindahkan kolom yang sesuai dengan kondisi Dirichlet ke sisi kanan, yaitu sistem kami akan menjadi:

K=[100002410001632-1037000203]dan vektor sisi kananb=[cb2b3b4b5]

Namun ini memiliki kelemahan utama dalam sistem tidak lagi simetris dan jadi kita tidak bisa lagi menggunakan gradien konjugat terkondisi (atau pemecah simetris lainnya). Salah satu solusi menarik yang saya temui adalah "Metode Angka Besar" yang saya temukan dalam buku "Pemrograman Elemen Hingga di Jawa" oleh Gennadiy Nikishkov. Metode ini menggunakan fakta bahwa ketelitian ganda hanya mengandung akurasi sekitar 16 digit. Alih-alih menempatkan 1 di posisi kita menempatkan banyak. Misalnya sistem kami menjadi: K11

K=[1.0e6420-102410001632-1037000203]dan vektor sisi kananb=[c×1.0e64b2b3b4b5]

Kelebihan dari metode ini adalah mempertahankan simetri matriks dan juga sangat efisien untuk format penyimpanan yang jarang. Pertanyaan saya adalah sebagai berikut:

Bagaimana kondisi batas Dirichlet biasanya diterapkan dalam kode elemen hingga untuk panas / cairan? Apakah orang-orang menggunakan metode jumlah besar biasanya atau mereka melakukan sesuatu yang lain? Apakah ada kerugian dengan metode angka besar yang bisa dilihat seseorang? Saya berasumsi bahwa mungkin ada beberapa metode standar efisien yang digunakan dalam sebagian besar kode komersial dan non-komersial yang memecahkan masalah ini (jelas saya tidak mengharapkan orang untuk mengetahui semua cara kerja dalam setiap pemecah elemen hingga komersial, tetapi masalah ini tampaknya mendasar / mendasar cukup bahwa seseorang mungkin telah bekerja pada proyek-proyek seperti itu dan dapat memberikan panduan).

James
sumber
2
Apakah Anda memiliki bukti bahwa ini secara substansial memperlambat Anda?
Bill Barth
@ BillBarth Ya, meskipun selalu ada kemungkinan saya melakukan sesuatu yang tidak efisien. Gennadily sendiri menulis bahwa walaupun metode eksplisit mudah untuk array 2d penuh, "..tidak selalu mudah untuk mengakses baris dan kolom matriks ketika sebuah matriks berada dalam format yang ringkas." menunjukkan bahwa metode eksplisit mungkin lebih menantang untuk diterapkan secara efisien. Karena kode saya saat ini ditulis, metode eksplisit dapat mengambil lebih banyak waktu daripada penyelesaian yang sebenarnya.
James
1
lakukan seperti yang dikatakan Wolfgang dan terapkan kondisi batas pada elemen matriks sebelum Anda berkumpul.
Bill Barth
@ BillBarth Ya saya pikir saya akan melakukannya. Video-videonya luar biasa! Saya baru saja meninggalkan komentar / pertanyaan untuknya tentang apakah Anda perlu merakit ulang matriks global di setiap catatan waktu, setelah itu saya pikir saya akan menerima jawabannya.
James

Jawaban:

11

Dalam deal.II ( http://www.dealii.org - disclaimer: Saya salah satu penulis utama perpustakaan itu), kami menghilangkan seluruh baris dan kolom, dan itu tidak terlalu mahal secara keseluruhan. Caranya adalah dengan menggunakan fakta bahwa pola sparsity biasanya simetris, sehingga Anda tahu baris mana yang perlu Anda perhatikan saat menghapus seluruh kolom.

Pendekatan yang lebih baik, dalam pandangan saya, adalah menghilangkan baris dan kolom ini dalam matriks sel, sebelum ditambahkan ke matriks global. Di sana Anda bekerja dengan matriks penuh, jadi semuanya efisien.

Saya belum pernah mendengar pendekatan jumlah besar dan tidak akan menggunakannya karena pasti itu akan menyebabkan masalah yang sangat buruk.

Sebagai referensi, algoritma yang kami gunakan dalam deal.II dijelaskan secara konseptual dalam kuliah 21.6 dan 21.65 di http://www.math.colostate.edu/~bangerth/videos.html . Mereka sangat cocok dengan deskripsi Anda.

Wolfgang Bangerth
sumber
2
Dalam kasus masalah yang tergantung waktu (katakanlah persamaan panas) apakah Anda merakit kembali matriks global di setiap catatan waktu? Alasan saya bertanya adalah dalam kasus kondisi Dirichlet yang tidak nol Anda memerlukan informasi dari matriks global asli ketika memodifikasi sisi kanan, tetapi jika Anda memusatkan kolom tersebut selama catatan waktu sebelumnya maka informasi ini hilang (kecuali Anda menyimpannya dalam array tambahan). Ini tidak akan menjadi masalah jika matriks global dirakit ulang setiap timestep meskipun yang sedang saya pertimbangkan lakukan dan apa yang harus tetap dilakukan jika menggunakan mesh adaptif.
James
1
Tergantung aplikasinya. Semua "besar" kode memecahkan masalah tergantung waktu nonlinear, dan untuk ini jelas bahwa Anda perlu merakit ulang satu cara atau yang lain. Untuk kode linier, Anda bisa menyimpan matriks asli, dan dalam setiap langkah menyalinnya di tempat lain, menerapkan kondisi batas, dan kemudian menggunakannya dalam pemecah. Ini hanya membutuhkan lebih banyak memori, tetapi sebaliknya murah.
Wolfgang Bangerth
1
Ah saya melihat itu yang saya duga. Saya akan menerapkan seperti yang Anda sarankan. Ok itu untuk bantuanmu. Video tutorial deallii itu benar-benar bagus!
James
2

Nol BC mudah. Untuk Non nol BC, Anda juga dapat menggunakan pengganda Lagrange. Misalnya, lihat di sini . Salah satu keunggulan LM adalah Anda dapat menggunakan persamaan kendala apa pun, meskipun sistem menjadi tidak terbatas sehingga Anda memerlukan pemecah yang tepat.

stali
sumber