Mengimplementasikan Fungsi Objek. Ketika objek fungsi mengimplementasikan perhitungan yang umumnya berguna, masuk akal untuk mengemas perhitungan objek fungsi dalam sebuah kelas terpisah dan menggunakan kembali di dalam objek fungsi. Terkadang, pemisahan perhitungan dari kemampuan pemrosesan waktu nyata menghasilkan implementasi yang lebih bersih dengan kepedulian yang terpisah: kelas yang menghitung sesuatu dipisahkan dari kelas objek fungsi yang menangani eksekusi waktu nyata.
Seperti yang dijelaskan di atas, fungsi anggota objek fungsi dipanggil di tempat-tempat tertentu dalam loop simulasi di OpenFOAM:
° start: dieksekusi di awal loop waktu, ° execute: dieksekusi saat waktu bertambah, ° end: dieksekusi saat loop waktu berakhir (waktu telah mencapai nilai endTime).
Melihat kode dalam editor teks mungkin membantu memahami contoh yang dijelaskan di bawah ini.
Untuk memulai pemrograman perpustakaan, buatlah sebuah direktori bernama ofPrimer-FunctionObjects untuk perpustakaan objek fungsi baru dan buat objek fungsi dari template menggunakan foamNewFunctionObject:
Editlah file Make/files sehingga objek fungsi dikompilasi ke dalam perpustakaan baru.
Jika menggunakan tag git OpenFOAM-v2012, perbaiki kesalahan tanda kurung di baris konstruktor.
mengkompilasi perpustakaan
kemudian mengujinya pada test case tetesan jatuh
dengan menambahkan entri berikut ke system/controlDict
INFO Implementasi objek fungsi dijelaskan di bawah ini dan mengasumsikan beberapa pengetahuan sebelumnya tentang bahasa pemrograman C++: kelas / enkapsulasi, deklarasi vs definisi, fungsi virtual, pewarisan, dll.
Nama objek fungsi yang digunakan untuk Runtime Type Selection (RTS) di OpenFOAM dibuat oleh foamNewFunctionObject sebagai ”nama” + ”FunctionObject”, di mana ”nama” adalah argumen yang diberikan kepada foamNewFunctionObject. Nama tipe objek fungsi yang dihasilkan dapat diubah di phaseCellsFunctionObject.H, dari
Ke
Perubahan ini memerlukan pengompilan ulang dari perpustakaan dan modifikasi atribut tipe dalam sub-dictionary objek fungsi di system/controlDict.
foamNewFunctionObject menerapkan makro OpenFOAM yang diperlukan untuk seleksi tipe waktu jalur (RTS): satu-satunya hal yang dapat dimodifikasi adalah nama tipe objek fungsi yang disebutkan di atas. Objek fungsi dipilih dengan memberikan entri tipe dalam kamus sub-dict sistem/controlDict yang sesuai.
Setelah inisialisasi atribut, perhitungan sebenarnya diimplementasikan dalam phaseCellsFunctionObject::execute
Member function calcWettedCells menandai sel-sel yang "basah",
dengan ketentuan
Persentase sel yang "basah" oleh fase spesifik dihitung sebagai
Laporan dibuat ke aliran keluaran standar dengan
Karena objek fungsi berisi anggota data yang dapat dicatat selama simulasi untuk inspeksi lebih lanjut, fungsi write() diimplementasikan sebagai
Ini memastikan bahwa bidang phaseCells hanya ditulis ke disk pada frekuensi penulisan yang ditentukan oleh pengguna simulasi dan dikendalikan oleh Foam::Time.
Berikut sub-kamus dari kamus fungsi di dalam sistem/controlDict yang mengaktifkan objek fungsi:
Ini mendefinisikan entri kamus konstruktor (lihat listing 78), dan pustaka terkait yang terhubung secara dinamis dari objek fungsi. Menjalankan Allrun di cases/chapter11/falling-droplet-2D menghasilkan faseCells yang ditulis ke disk dan tambahan berikut pada output solver.