Kondisi batas, seperti yang tersirat dari namanya, menambahkan fungsionalitas ke nilai-nilai yang disimpan dalam bidang batas (GeometricBoundaryField). Dalam Desain Berorientasi Objek (OOD), menambahkan fungsionalitas biasanya berarti memperluas
kelas yang sudah ada, yang juga dilakukan dalam kasus kondisi batas. Sebenarnya, GeometricBoundaryField yang dijelaskan di atas tidak hanya mengkapsulasi nilai-nilai bidang yang disimpan di batas domain, masing-masing bidang diperluas dengan fungsi anggota virtual yang menentukan perilaku kondisi batas.
Kondisi batas mewakili konsep hierarkis dalam FVM - kondisi batas serupa dikelompokkan ke dalam kategori kondisi batas. Untuk alasan ini, dan untuk memungkinkan pengguna memilih kondisi batas pada saat runtime (RTS), mereka dimodelkan sebagai hirarki kelas. Kelas abstrak induk tertinggi fvPatchField menentukan antarmuka kelas yang harus dipatuhi oleh setiap kondisi batas. Setiap kondisi batas di OpenFOAM entah berasal dari fvPatchField atau pointPatchField. Yang terakhir ini sebagian besar digunakan untuk aplikasi yang melibatkan pergerakan atau modifikasi jaringan. Keduanya memiliki atribut privat konstan yang disebut internalField_ dan merupakan referensi ke bidang internal GeometricField, yang diperkenalkan dalam bagian sebelumnya. Atribut ini memberikan akses ke nilai-nilai bidang internal, tidak hanya ke sel yang berdekatan langsung dengan patch jaringan batas. Dalam kasus pointPatchField, atribut internalField_ dideklarasikan sebagai:
Deklarasi bidang internal untuk fvPatchField sama seperti untuk fvPatchField, tetapi argumen templat kedua untuk Dimen- sionedField adalah volMesh, bukan pointMesh:
Sejak pointPatchField mematuhi antarmuka kelas yang sama dengan fvPatchField, dan bidang-bidang volume paling sering dijumpai, fvPatchField dibahas dalam bagian ini.
Sebelum kita masuk ke detail tentang fungsi anggota fvPatchField yang relevan, ketika menyangkut implementasi kondisi batas baru, kita mencoba menyelesaikan gambaran umum tentang hubungan antara GeometricField dan akses aktual ke kondisi batas. Representasi grafis dari hubungan ini diberikan dalam gambar 10.2. Bidang geometris menggabungkan bidang batas geometris, yang mewarisi dari (FieldField) dan oleh karena itu adalah kumpulan bidang (batas). Komposisi bidang batas geometris diperlukan karena modifikasi nilai bidang internal memerlukan pembaruan nilai bidang batas oleh kondisi batas. Selain itu, bidang batas tidak dapat dipisahkan menjadi objek yang berbeda dari bidang internal. Bidang internal dan batas tidak hanya melekat secara topologis satu sama lain, melalui jaringan, FVM memerlukan nilai-nilai bidang batas saat persamaan di-discretisasi untuk menghitung nilai-nilai bidang internal.
Peningkatan resolusi jaringan menyebabkan pembelahan wajah sel, sehingga panjang bidang internal dan batas terhubung secara tidak langsung dalam hal ini juga. Memiliki bidang internal dan batas terpisah oleh karena itu tidak masuk akal sama sekali. Ini akan memperkenalkan variabel global yang perlu disinkronkan secara eksplisit, yang akan sangat mempersulit semantik dari semua operasi bidang di tingkat aplikasi. Bidang geometris melintasi kumpulan bidang batas dan memperbarui setiap bidang batas dengan mendukung pembaruan ke kondisi batas yang sesuai. Gambar 10.2 menunjukkan parameter templat PatchField yang, ketika di-instan (fvPatchField untuk mesh volume), adalah kondisi batas.
Sebuah aplikasi OpenFOAM memanggil fungsi anggota correctBoundaryConditions() dari GeometricField ketika bidang internal dimodifikasi dan kondisi batas harus diperbarui: setelah sebuah PDE diselesaikan untuk bidang dalam solver atau nilai-nilai internal dihitung secara eksplisit dalam aplikasi pra-pemrosesan. Implementasi fungsi anggota GeometricField::updateBoundaryConditions() ditunjukkan dalam listing 44.
INFO Untuk memahami bagaimana kondisi batas diperbarui oleh GeometricField, baris terakhir dalam listing 44 harus dipahami.
Baris terakhir dalam listing 44 memanggil fungsi anggota evaluate() dari GeometricBoundaryField yang pada gilirannya melakukan berbagai tugas. Fungsi anggota ini memanggil fungsi anggota initEvaluate() dari fvPatchField, jika kondisi batas belum diinisialisasi. Jika sudah, maka fungsi anggota evaluate() dipanggil. Karena paralelisme lapisan nol halo yang diimplementasikan oleh OpenFOAM, komunikasi paralel ditangani oleh GeometricBoundaryField::evaluate(), karena batas proses juga diimplementasikan sebagai kondisi batas.
Fungsi anggota GeometricBoundaryField::updateCoeffs() adalah fungsi anggota lain yang memicu fungsionalitas dari fvPatchField tertentu dari kode klien. Dibandingkan dengan evaluate(), implementasi updateCoeffs() lebih singkat karena tidak ada komunikasi paralel yang diimplementasikan. Implementasi dari GeometricBoundaryField::updateCoeffs ditunjukkan dalam listing 45.
Loop forAll dalam listing 45 melintasi semua patch dari GeometricBoundaryField yang disebut sebagai *this. Fungsi anggota updateCoeffs() dari fvPatchField dipanggil langsung untuk setiap elemen batas domain, menggunakan operator[].
Fungsi anggota updateCoeffs() dan evaluate() mewakili bagian yang relevan dari antarmuka publik untuk fvPatchField yang diakses secara otomatis dari setiap solver. Perbedaan utama antara kedua fungsi anggota tersebut adalah bahwa evaluate() dapat dipanggil sejumlah kali dalam satu langkah waktu, tetapi hanya dieksekusi sekali. Di sisi lain, updateCoeffs() tidak memeriksa apakah kondisi batas diperbarui atau tidak, ia akan melakukan perhitungan sebanyak kali yang dipanggil. Keduanya merupakan bagian dari antarmuka kelas umum yang disediakan oleh kelas dasar fvPatchField, yang dapat digunakan untuk memprogram kondisi batas yang disesuaikan, yang diturunkan baik secara langsung maupun tidak langsung dari fvPatchField.
Hanya sejumlah kecil kondisi batas dalam rilis resmi yang diturunkan secara langsung dari fvPatchField, seperti fixedValueFvPatchField dasar dan zeroGradientFvPatchField. Sebagian besar dari mereka diturunkan
kelas untuk menggunakan atribut secara tidak langsung untuk mengimplementasikan berbagai cara pencampuran antara kondisi batas nilai tetap dan nol gradien. Kondisi batas yang umum digunakan yang diturunkan langsung dari mixedFvPatchField adalah inletOutletFvPatchField. Ini beralih antara kondisi batas nilai tetap dan nol gradien, tergantung pada arah aliran. Jika aliran menuju keluar dari domain, itu bertindak seperti kondisi batas nol gradien (zeroGradientFvPatchField), jika tidak bertindak sebagai kondisi batas nilai tetap (fixedValueFvPatchField). Ini ditentukan berdasarkan basis wajah demi wajah, dan berdasarkan atribut privat dari kondisi batas mixedFvPatchField. Gradien bidang tidak ditentukan oleh pengguna seperti dalam mixedFvPatchField - itu diatur menjadi nilai nol oleh konstruktor inletOutletFvPatchField.
Nilai fraksi yang digunakan kemudian oleh mixedFvPatchField::updateCoeffs() dihitung dalam listing 47 dengan memberikan nilai 1 untuk wajah yang memiliki fluks volumetrik positif (keluar), dan nilai 0 untuk yang lainnya. Implementasi fungsi anggota updateCoeffs() dari inletOutletFvPatchField ditunjukkan dalam listing 47. Hanya nilai untuk valueFraction() yang diatur oleh fungsi anggota ini, perhitungan bidang batas diserahkan ke mixedValueFvPatchField induk. Fungsi pos ditunjukkan dalam listing 48. Ini mengembalikan 1 jika nilai scalar s lebih besar atau sama dengan nol dan 0 sebaliknya. Penugasan aktual zeroGradientFvPatchField dan fixedValueFvPatchField dilakukan oleh pemanggilan mixedFvPatchField::updateCoeffs() dan oleh karena itu tidak boleh diimplementasikan ulang.
Membaca data kondisi batas
Selama proses pemrograman kondisi batas kustom yang mungkin memiliki parameter baru, nama parameter baru dan nilainya yang sesuai perlu dibaca dari file lapangan di direktori 0. Oleh karena itu, programmer harus menambahkan parameter dan nilainya yang diperlukan dalam file tersebut. Karena kondisi batas dibaca dari file dalam bentuk kamus, kamus dibaca dan diteruskan ke konstruktor kondisi batas.
Beberapa kondisi batas mungkin menggunakan fungsi anggota kelas kamus yang mencari data sambil memberikan nilai default. Dalam hal ini, beralih jenis kondisi batas dan tidak memberikan parameter yang sesuai tidak akan menghasilkan kesalahan saat runtime. Operasi pada kelas kamus dibahas dalam bab 5 dan harus dipahami dengan baik sebelum melanjutkan ke bagian berikutnya di mana pemrograman kondisi batas baru dijelaskan.