infistream

Registri Objek dan regIOobjek

Karena bidang dan mesh digunakan dalam bentuk variabel global dalam aplikasi pemecah masalah OpenFOAM, melacak semua ini dan meneruskan panggilan ke fungsi anggota mereka secara eksplisit akan melibatkan banyak pengulangan kode yang tidak perlu. Contoh dari pengiriman panggilan yang terkelompok adalah permintaan pemecah masalah untuk menulis semua bidang ke disk keras. Dalam kasus menggunakan objek secara langsung, nama objek akan tertanam secara kaku dan mengubah nama akan memperkenalkan serangkaian perubahan dalam kode aplikasi. Selain itu, kode yang mengimplementasikan panggilan seperti itu perlu disalin di beberapa tempat. Sebagai contoh, kode yang sama yang bertanggung jawab atas output bidang kemudian akan disalin ke setiap aplikasi yang bergantung pada kumpulan bidang yang sama dengan nama variabel yang sama. Menggunakan file header yang disertakan seperti yang dibahas di bagian 9.1 akan memungkinkan untuk keluarga pemecah masalah yang bergantung pada variabel bidang yang sama. Tetapi mengubah satu variabel bidang akan membuat file header tersebut tidak dapat digunakan untuk seluruh keluarga pemecah masalah. Pendekatan ini oleh karena itu mewakili desain perangkat lunak yang kaku, atau desain perangkat lunak yang tidak dapat diubah. Desain perangkat lunak yang kaku atau tidak dapat diubah adalah desain yang memerlukan modifikasi kode yang ada untuk setiap perluasan, dan selanjutnya, modifikasi sering terjadi di beberapa tempat dalam basis kode yang ada.

Karena masalah ini, logika di balik koordinasi operasi untuk beberapa objek telah dienkapsulasi ke dalam sebuah kelas, yang kemudian dapat digunakan kembali di banyak tempat dalam kode OpenFOAM. Untuk tujuan ini, sebuah registri objek telah diimplementasikan: sebuah objek yang mendaftarkan objek lain ke dirinya sendiri dan kemudian meneruskan panggilan ke fungsi anggota mereka ke objek yang terdaftar. Registrasi objek adalah implementasi dari Pola Pengamat dari OOD dan ini dijelaskan secara lebih detail di bagian 8.4. Selain itu, ada tinjauan yang bagus tentang registri objek serta kelas objek yang terdaftar di halaman Wiki OpenFOAM.

Sebuah contoh penggunaan registrasi objek adalah suatu kondisi batas
Implementasi kondisi batas di mana kondisi batas yang beroperasi pada satu bidang memerlukan akses ke bidang lainnya. Kondisi batas tekanan total (totalPressureFvPatchScalarField) adalah salah satu kondisi batas yang memerlukan akses ke beberapa bidang untuk memperbarui bidang yang ditugaskan padanya.

LATIHAN
Cari tahu untuk apa kondisi batas totalPressureFvPatchScalarField digunakan. Fungsi anggota manakah yang melakukan penghitungan sebenarnya? Bagaimana perhitungan alternatif diterapkan? Dapatkah Anda memikirkan implementasi alternatif yang dapat dipilih runtime untuk penghitungan alternatif?

Kondisi batas tekanan total memperbarui bidang yang telah ditetapkan seperti yang dilakukan oleh semua kondisi batas lainnya dalam OpenFOAM, menggunakan fungsi anggota updateCoeffs seperti yang ditunjukkan dalam listing 36. Namun, updateCoeffs() mendispatch perhitungan ke updateCoeffs yang dioverload. Argumen kedua dari pemanggilan updateCoeffs yang ditunjukkan dalam listing 36 mengakses atribut referensi konstan fvPatch dari bidang batas menggunakan fungsi anggota patch(). Di sisi lain, kelas fvPatch menyimpan referensi konstan ke mesh volume hingga, yang mewarisi dari objectRegistry dan karena itu merupakan registri objek. lookupPatchField didefinisikan sebagai fungsi anggota template dari kelas template fvPatch dalam file fvPatchFvMeshTemplates.H dan ditunjukkan dalam listing 37. Deklarasi tipe pengembalian fungsi tergantung pada parameter template GeometricField dan oleh karena itu memerlukan kata kunci typename, untuk membuat compiler menyadari bahwa PatchFieldType adalah sebuah tipe. Bagian yang lebih penting dari template fungsi anggota adalah pernyataan pengembalian yang jelas menggunakan fungsionalitas registri objek, yang diwarisi ke fvMesh.
Dari kelas objek registry objectRegistry. Karena fvPatch adalah sebuah template kelas, pemanggilan ke fungsi anggota kelas dasar agak rumit. lookupObject adalah sebuah fungsi anggota template dari kelas dasar objectRegistry, dan ini harus ditentukan di tempat pemanggilan fungsi anggota menggunakan kata kunci template. Melalui semua kode template C++, patch batas mesh volume hingga mengakses seluruh mesh batas, kemudian mesh volume yang sesuai dan meminta mesh volume untuk mencari sebuah bidang dengan nama spesifik (nama). Jalur pemanggilan ini melalui kelas-kelas yang terlibat seperti yang dijelaskan untuk contoh ini memungkinkan kondisi batas tekanan total untuk mengakses sebuah bidang dari sebuah mesh, berdasarkan parameter nama bidang.
Open chat
Infichat
Hello 👋
Thank you for text me
Can we help you?