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:
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 ]
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:
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:
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).
Jawaban:
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.
sumber
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.
sumber