Contoh kondisi batas kendali resirkulasi, disajikan metode bagaimana sebuah kondisi batas yang ada dapat diperluas dengan perhitungan tambahan (fungsionalitas) selama runtime. Bayangkan sebuah kondisi batas yang memperbarui nilai-nilai medan batas dengan cara tertentu saat simulasi berjalan. Pada suatu titik, berdasarkan hasil simulasi, kondisi-kondisi simulasi (misalnya, tekanan di batas lain) menunjukkan bahwa sebuah operasi batas tambahan diperlukan. Ketika ini terjadi, kondisi batas baru yang diperluas memungkinkan perhitungan tambahan saat runtime, dan memodifikasi nilai-nilai medan batas sesuai.
Sebagai contoh teknis yang bagus, bayangkan sebuah wadah tertutup yang dipanaskan yang diisi dengan gas ideal. Ketika aliran panas masuk ke dalam wadah, tekanan di dalam wadah meningkat. Kondisi batas yang diperluas akan mengukur tekanan di tutup wadah, dan membuka tutupnya ketika tekanan mencapai nilai tertentu. Secara numerik, kondisi batas ini akan mengubah tipe-nya selama simulasi, dari dinding yang tidak dapat ditembus, menjadi kondisi batas keluar, berdasarkan tekanan di tutupnya.
Dalam contoh yang disajikan dalam bab ini, sirkulasi ulang diukur di sebuah batas. Ketika sirkulasi ulang terjadi, perhitungan tambahan mengubah sifat kondisi batas menjadi kondisi aliran masuk. Akibatnya, sirkulasi ulang tersebut didorong keluar oleh aliran masuk.
INFO Contoh kondisi batas sirkulasi ulang mungkin tidak berfungsi dalam eksekusi paralel, tergantung pada apakah batas yang dimodifikasi merupakan bagian dari domain pemrosesan. Tujuan dari contoh ini adalah untuk menunjukkan bagaimana mesh, registrasi objek, dan bidang saling terhubung, bukan bagaimana cara memparallelkan pembaruan kondisi batas.
Hypotetis, ekstensi semacam itu bisa dicapai hanya dengan menggunakan pewarisan. Namun, itu akan membutuhkan perluasan dari setiap kondisi batas dalam OpenFOAM untuk memperhitungkan perhitungan tambahan yang diaktifkan RTS yang perlu dilakukan. Memperluas setiap kondisi batas dengan menggunakan pewarisan ganda akan mengakibatkan modifikasi kondisi batas yang ada, hanya untuk memperhitungkan kemungkinan perluasan (yaitu kontrol sirkulasi ulang) yang mungkin, atau mungkin tidak, digunakan saat runtime, tergantung pada pilihan pengguna. Jelas, ini sama sekali bukan metode yang serbaguna dan membuat perluasan sulit dicapai selama runtime tanpa memodifikasi kode yang ada. Ketika fungsionalitas baru perlu ditambahkan selama runtime ke hierarki kelas yang sudah ada tanpa memodifikasi model dari hierarki tersebut, pola desain berorientasi objek Pola Penghias dapat digunakan. Detail tentang Pola Penghias dan pola OOD lainnya diberikan dalam buku oleh [1]. Gambar 10.4 mengilustrasikan prinsip kerja delegasi perhitungan ketika suatu kondisi terpenuhi.
Gambar 10.4: Prinsip kerja dari kondisi batas yang didekorasi. Kondisi batas beroperasi dengan cara standar sampai kondisi tertentu terpenuhi sehingga perhitungan yang diperluas diperlukan dan ditugaskan kepada dekorator. Pada titik tersebut, kondisi batas bertindak seolah-olah beralih ke jenis dekorator.
Menambahkan fungsionalitas ke BC menggunakan Pola Dekorator
Sebuah dekorator kondisi batas adalah sebuah kondisi batas itu sendiri, karena ia memodifikasi bidang batas juga. Oleh karena itu, dekorator mewarisi dari kelas abstrak fvPatchField dari semua kondisi batas di OpenFOAM. Selain mewarisi dari fvPatchField, dekorator menggabungkan objek dari kelas dasarnya sendiri (fvPatchField).
Untuk memperjelas hal-hal tersebut, diagram kolaborasi kelas Bahasa Pemodelan Bersatu (UML) dari Pola Dekorator yang diterapkan pada hierarki kondisi batas ditunjukkan dalam gambar 10.5. Seperti yang ditunjukkan dalam diagram tersebut, dekorator adalah bagian dari hierarki kelas seperti kondisi batas lainnya. Oleh karena itu, untuk kondisi batas di OpenFOAM, menetapkan hubungan is-a seperti itu dengan kelas dasar abstrak fvPatchField membuat dekorator kondisi batas bertindak sebagai kondisi batas bagi kode klien OpenFOAM lainnya. Ini sama persis dengan prinsip warisan sederhana, hanya dengan perluasan penyimpanan instansi dari objek yang diwarisi.
Dekorator harus mengimplementasikan semua metode virtual murni yang ditentukan oleh kelas abstrak fvPatchField. Karena ia juga menggabungkan kondisi batas biasa, dekorator akan mendelegasikan pemanggilan fungsi ke kondisi batas yang dihias, berdasarkan kondisi yang ditentukan oleh pemrogram. Ekstensi yang diberikan oleh dekorator dapat dirancang sesuai keinginan pemrogram. Dengan menggabungkan baik warisan maupun komposisi seperti yang ditunjukkan dalam gambar 10.5, adalah mungkin bagi sebuah kondisi batas yang dihias untuk beralih tipe sendiri selama runtime, karena ia mendelegasikan perhitungan ke dekorator.
Menambahkan kontrol resirkulasi ke kondisi batas
Sebagai contoh dari penambahan fungsionalitas runtime ke kondisi batas apa pun di OpenFOAM, kami telah memilih aliran sirkulasi kembali sebagai parameter kontrol dan kecepatan aliran masuk sebagai tindakan yang diberlakukan oleh kondisi batas. Sirkulasi aliran diketahui dengan tanda bergantian pada fluks volumetrik di batas. Tanda bergantian dalam fluks volumetrik pada batas domain menandakan bahwa pusaran (vortex) melintasi batas. Oleh karena itu, fluida mengalir ke dalam domain melalui sebagian batas, dan mengalir keluar dari bagian batas lainnya.
Untuk kasus simulasi contoh ini, kondisi batas memeriksa apakah aliran di batas yang diperluas memiliki sirkulasi kembali dan berusaha mengontrol kondisi batas yang dihias untuk menguranginya. Jenis dekorator kondisi batas ini kemungkinan besar akan diatur untuk beberapa kondisi batas di mana aliran keluar diharapkan. Kontrol dalam contoh ini dilakukan dengan cara yang cukup langsung: dengan memodifikasi kondisi batas yang dihias sehingga lapangannya ditimpa dengan nilai aliran masuk yang meningkat.
Tentu saja, contoh ini khusus untuk situasi aliran masuk/keluar, tetapi tujuan dari contoh ini bukan untuk menangani pengendalian aliran. Dekorator kondisi batas pengendalian sirkulasi kembali berbeda dengan kondisi batas standar di OpenFOAM. Ini memodifikasi nilai lapangan yang dihitung oleh kondisi batas lain secara langsung, terlepas dari jenis kondisi batas yang dihias. Kondisi batas pengendalian sirkulasi kembali yang selesai sudah tersedia dalam repositori kode contoh. Untuk mempermudah pemahaman contoh yang disajikan, deskripsi harus diikuti dengan kode kondisi batas pengendalian sirkulasi kembali dari repositori kode contoh yang dibuka dalam editor teks. Dalam diskusi berikut, nama-nama yang sama digunakan untuk file dan kelas seperti yang ada dalam repositori kode contoh.
INFO Kondisi batas harus dikompilasi sebagai pustaka bersama. Mereka tidak boleh diimplementasikan langsung ke dalam kode aplikasi, karena hal ini secara signifikan membatasi kegunaan mereka serta berbagi dengan pemrogram OpenFOAM lainnya.
Perpustakaan tempat kondisi batas dikompilasi akan dihubungkan secara dinamis dengan aplikasi solver selama runtime. Pada awal tutorial, direktori perpustakaan perlu dibuat:
dan file kelas dari kondisi batas yang sudah ada perlu disalin, yang akan kita gunakan sebagai file kerangka untuk kondisi batas kontrol sirkulasi ulang:
Semua contoh string "zeroGradient" harus diganti menjadi "recirculationControl" dalam nama file serta dalam nama kelas. Setelah nama-nama dimodifikasi, keluar dari direktori recirculationControl, dan buat folder konfigurasi kompilasi Make:
dan ubah file Make/files untuk memperhitungkan bahwa sebuah perpustakaan akan dikompilasi, bukan sebuah aplikasi, sehingga baris tersebut menjadi:
perlu diganti dengan jalur
Perhatikan bahwa skrip wmakeFilesAndOptions akan memasukkan semua file *.C ke dalamnya
file Make/files, yang berarti baris
Untuk mengatasi masalah redefinisi kelas saat kompilasi karena definisi template kelas untuk kondisi batas kontrol resirkulasi, Anda perlu memastikan bahwa definisi template hanya disertakan sekali dalam keseluruhan program. Ini seringkali menjadi masalah saat menggunakan template kelas dalam C++ karena kesalahan penanganan preprocessor atau pengaturan include.
Setelah file recirculationControlFvPatchField.C dihapus dari Make/files, perpustakaan siap untuk diuji kompilasi pertama kali. Kompilasi dapat dimulai dengan menjalankan perintah
Dari dalam direktori primerBoundaryConditions, Listing 49 berisi versi akhir dari Make/files dan listing 50 berisi versi akhir dari file Make/options. Dengan berhasilnya kompilasi, sebuah implementasi kerangka dari perpustakaan kondisi batas bersama yang mandiri telah diciptakan. Sebelum pengembangan lebih lanjut dari fungsionalitas dekorator dimulai, kondisi batas tersebut harus diuji dengan sebuah simulasi aktual. Pada titik ini, kondisi batas memiliki fungsionalitas yang sama seperti zeroGradientFvPatchField yang menjadi dasarnya, tetapi dengan nama yang berbeda. Fungsionalitasnya dapat diuji dengan menjalankan kasus simulasi apapun, dengan syarat Anda mendefinisikan perpustakaan terkait yang diperlukan di dalam file system/controlDict:
Ini memuat perpustakaan kondisi batas bersama dan menghubungkannya ke eksekutabel OpenFOAM.
TIPS Melakukan tes integrasi semacam itu adalah langkah yang sangat disarankan dalam proses menulis perpustakaan kustom. Menggunakan sistem kontrol versi (Bab 6) juga meningkatkan alur kerja. Sebagai contoh, coba terapkan kondisi batas kontrol resirkulasi ke patch fixedWalls dari lapangan kecepatan dalam kasus tutorial rongga menggunakan solver icoFoam.
Pada titik ini, integrasi perpustakaan dengan OpenFOAM telah diuji dan dianggap berfungsi. Implementasi desain yang ditunjukkan dalam gambar 10.5 dapat dimulai. Cara implementasi Pola Dekorator yang ketat berbasis objek akan dimulai dengan kelas Dekorator abstrak untuk fvPatchField. Dalam hal ini, recirculationControl harus diwarisi darinya sebagai model dekorator konkret. Namun, dalam contoh ini, sebuah dekorator konkret digunakan sebagai titik awal dan implementasi abstrak dibiarkan kepada pembaca sebagai latihan pada akhir bagian. Melaksanakan latihan tersebut memungkinkan penambahan fungsionalitas yang berbeda pada setiap kondisi batas di OpenFOAM tanpa mengubah implementasinya. Ini adalah manfaat tambahan dari melakukan latihan tersebut selain meningkatkan pemahaman tentang kondisi batas di OpenFOAM.
Modifikasi pertama pada kondisi batas kontrol resirkulasi diterapkan pada file deklarasi template kelas recirculationControlFvPatchField.H. Kelas ini mewarisi dari fvPatchField, yang sudah dilakukan oleh zeroGradientFvPatchField. Bagian penting dari definisi kelas recirculationControlFvPatchField ditunjukkan dalam daftar kode.
Pada daftar kode, pola dekorator dapat dilihat: pewarisan dari fvPatchField hadir namun juga atribut privat dari fvPatchField disusun oleh kelas kondisi batas kontrol resirkulasi. Instansiasi salinan lokal dalam baseTypeTmp_ dilakukan menggunakan objek pointer pintar tmp dari OpenFOAM, karena ini menyediakan fungsionalitas tambahan seperti pengumpulan sampah. Pointer pintar ini bergantung pada idiom C++ RAII dan sangat menyederhanakan penanganan pointer. Atribut kelas yang tersisa yang dideklarasikan sebagai konstan akan dibaca dari batas
Untuk menginisialisasi kondisi batas yang akan dihiasi, nama tertentu harus dilewatkan melalui kamus kondisi batas dan disimpan dalam atribut baseTypeName_. Untuk memberikan opsi untuk menerapkan atau tidak menerapkan kontrol resirkulasi, Switch applyControl_ diimplementasikan. Jika nilainya salah, tidak ada yang akan dikenakan pada batas, sehingga mematikannya dan hanya menggunakan kondisi batas yang dihiasi menjadi mudah. Selain itu, akan melaporkan jumlah resirkulasi pada kondisi batas yang diperluas. Jenis kondisi batas yang diperluas ditentukan oleh variabel baseTypeName_, yang kemudian digunakan untuk membuat kondisi batas yang diperluas konkret berdasarkan nama kelas. Kondisi batas ini disimpan dalam baseTypeTmp_.
Untuk menghitung resirkulasi, kondisi batas perlu mengetahui nama medan aliran volumetrik yang disebut fluxFieldName_. Nama patch field yang dikendalikan didefinisikan oleh controlledPatchName_. Nilai maksimal yang mungkin diambil didefinisikan oleh member maxValue_, dan recirculationRate_ menyimpan persentase aliran volumetrik negatif pada kondisi batas yang diperluas.
Setelah menambahkan atribut-atribut kelas baru, konstruktor-konstruktor dari recirculationControlFvPatchField harus menginisialisasikannya.
Pendekatan yang digunakan adalah memperluas dan memodifikasi daftar inisialisasi konstruktor untuk memperhitungkan atribut-atribut kelas pribadi yang baru. Untuk menjaga deskripsi agar singkat, hanya konstruktor kamus yang ditunjukkan dalam teks berikut. Implementasi lengkapnya tersedia di repositori kode sumber.
Konstruktor dari kondisi batas kontrol resirkulasi ditunjukkan dalam daftar kode. Dalam daftar inisialisasi, baseTypeTmp_ tidak diberikan nilai dan oleh karena itu mengambil nilai sembarang. Dalam konstruktor itu sendiri, sebuah fvPatchField dibuat dan ditugaskan ke baseTypeTmp_, menggunakan pemilih New. Cara konstruksi objek ini disebut Factory Method (Pemilih Baru) dan didefinisikan dalam kelas abstrak fvPatchField. Ini memilih kelas dasar untuk recirculationControlFvPatchField selama runtime, berdasarkan nama yang disediakan dalam kamus. Kamus digunakan oleh konstruktor untuk menginisialisasi kondisi batas yang dihiasi. Setelah konstruktor ini dieksekusi, atribut-atribut terlindungi yang dibutuhkan oleh fungsi kontrol akan diinisialisasi, begitu juga dengan kondisi batas yang dihiasi.
kondisi.
Konstruktor-konstruktor yang tersisa dari recirculationControlFvPatchField harus dimodifikasi secara serupa, memperhitungkan atribut-atribut kelas baru. Setelah konstruktor-konstruktor dimodifikasi, fungsi anggota yang tercantum dalam gambar 10.5 juga perlu dimodifikasi. Mereka perlu mendelegasikan pekerjaan kepada kondisi batas yang dihiasi, yang disimpan dalam baseTypeTmp_. Implementasinya identik untuk keempat fungsi anggota tersebut, sehingga hanya salah satunya yang disajikan dalam daftar kode.
Delegasi semacam ini harus hadir di semua bagian dari implementasi decorator di mana kontrol aliran tidak dilakukan. Dalam hal ini, kondisi batas harus bertindak sebagai kondisi batas yang dihiasi. Ini diilustrasikan sebagai model kondisi batas konkret dalam gambar 10.5.
Sebagai langkah terakhir dalam mengimplementasikan kondisi batas kontrol resirkulasi, fungsi anggota yang bertanggung jawab atas operasi kondisi batas (updateCoeffs) perlu diimplementasikan. Implementasinya dibagi menjadi dua bagian utama. Bagian pertama memeriksa apakah kondisi batas sudah diperbarui, yang merupakan praktik umum dalam kondisi batas OpenFOAM. Jika belum, medan aliran akan dicari menggunakan nama yang ditentukan pengguna dari medan aliran fluxFieldName_.
Aliran volumetrik positif dan negatif dihitung oleh kondisi batas yang diperluas seperti yang ditunjukkan dalam daftar kode. Setelah aliran volumetrik positif dan negatif dihitung, tingkat resirkulasi (rasio aliran negatif dan aliran total) dihitung dengan kode yang ditunjukkan dalam daftar kode.
Pada kondisi di mana tidak ada resirkulasi yang terjadi, kontrol resirkulasi dan kondisi batas yang dihiasi berperilaku secara identik. Modifikasi medan oleh karena itu didelegasikan ke model kondisi batas konkret yang terenkapsulasi. Perlu dicatat bahwa karena decorator kondisi batas itu sendiri adalah kondisi batas, setiap kali pembaruan terjadi, status kondisi batas harus diatur menjadi terkini. Seperti biasa, fungsi anggota updateCoeffs dari kelas abstrak fvPatchField harus dipanggil untuk tujuan ini. Bagian dari fungsi anggota updateCoeffs yang bertanggung jawab atas kontrol resirkulasi ditunjukkan dalam daftar kode.
Kondisi batas ini akan membutuhkan akses non-konstan ke medan dari kondisi batas lain, karena akan memodifikasi nilai-nilai medan batas. Untuk alasan ini, itu melanggar enkapsulasi dari kelas objectRegistry, dengan cara melepas kekonstanan dari VolumetricField yang disediakan oleh registri secara paksa. Akses non-konstan ke kondisi batas lainnya
bidang ditampilkan dalam daftar 57.
INFO Melepas kekonstanan seperti ini seharusnya dihindari sebisa mungkin: hal ini membatalkan tujuan enkapsulasi - keadaan objek yang hanya dapat dimodifikasi oleh fungsi anggota kelas. Contoh ini menggunakan const cast hanya untuk menunjukkan kemungkinan kolaborasi antara medan geometris dan registri objek.
Jika antarmuka dari objectRegistry hanya menyediakan akses konstan ke objek yang terdaftar, melepas kekonstanan dan memodifikasi keadaan objek adalah sesuatu yang menyesatkan bagi pemrogram. Dia tidak akan mengharapkan perubahan keadaan objek VolumetricField dapat dilakukan melalui antarmuka dari objectRegistry. Algoritma 1 menjelaskan algoritma kontrol resirkulasi dalam bentuk pseudocode.
Kondisi batas ini dimaksudkan terutama sebagai contoh penerapan Pola Dekorator pada hirarki kelas kondisi batas di OpenFOAM. Namun, desain yang diterapkan di sini juga dapat digunakan dalam situasi di mana kondisi batas masukan/keluaran hadir. Dalam beberapa situasi, pengurangan resirkulasi dapat dicapai dengan meningkatkan misalnya tekanan atau kecepatan masukan. Namun, perlu dicatat bahwa ini hanya contoh yang menggambarkan dua hal utama: Pertama, itu menunjukkan bagaimana desain dari VolumetricField dapat digunakan untuk menggabungkan fungsionalitas antara kondisi batas yang berbeda. Kedua, itu mengilustrasikan bagaimana memprogram kondisi batas baru dalam OpenFOAM, yang diturunkan dari fvPatchField.
Menguji kondisi batas kendali resirkulasi
tekanan atau kecepatan masukan. Namun, perlu dicatat bahwa ini hanya contoh yang menggambarkan dua hal utama: Pertama, itu menunjukkan bagaimana desain dari VolumetricField dapat digunakan untuk menggabungkan fungsionalitas antara kondisi batas yang berbeda. Kedua, itu mengilustrasikan bagaimana memprogram kondisi batas baru dalam OpenFOAM, yang diturunkan dari fvPatchField.
Gambar 10.6 menggambarkan konfigurasi awal aliran, di mana kecepatan langkah belakang diatur menjadi nol karena merupakan dinding yang tidak dapat dilewati. Kondisi batas kontrol resirkulasi akan menggantikan kecepatan nol pada langkah menghadap ke belakang pada saat resirkulasi muncul di outlet. Selanjutnya, itu akan mengubah kondisi batas yang diterapkan pada batas leftWall menjadi aliran masuk, untuk mendorong resirkulasi keluar.
Perbandingan medan kecepatan tanpa dan dengan kondisi batas kontrol resirkulasi ditunjukkan dalam gambar 10.7.
INFO: Pengaturan untuk kasus uji ini tersedia di folder ofbook-cases/chapter10/recirculationControlChannel dari repositori kasus contoh dan disimulasikan menggunakan solver icoFoam untuk aliran fase tunggal tak terkompresibel laminar transien.
Gambar 10.7: Medan kecepatan dari kasus uji kontrol resirkulasi, tanpa dan dengan kontrol resirkulasi, masing-masing dengan kondisi batas zero-gradient dan outlet resirkulasi.
LATIHAN Sebuah Dekorator abstrak tidak diimplementasikan dalam contoh ini: modifikasi recirculationControlFvPatchField sehingga sebuah Dekorator abstrak ditambahkan ke hierarki kelas. Dekorator tersebut menggeneralisasi dekorasi kondisi batas, sehingga memungkinkan untuk menambahkan fungsionalitas apa pun ke kondisi batas apa pun di OpenFOAM pada saat runtime.