Bidang dalam, batas dan geometri. Batas domain dan patch batas yang sesuai dapat ditemukan dalam file constant/polyMesh/boundary. Setiap patch batas adalah kumpulan wajah sel (volume terbatas). File batas jarang diperiksa oleh pengguna OpenFOAM; ini dapat membantu pemrogram dalam memahami struktur data yang digunakan OpenFOAM untuk menyimpan konektivitas jaringan tidak berstruktur.
OpenFOAM menyimpan bidang sebagai file dalam direktori langkah waktu awal (0). Sebagai contoh, pertimbangkan bagian dari file konfigurasi untuk bidang tekanan dinamis p_rgh dari kasus simulasi rising-bubble-2D:
Kata kunci internalField berkaitan dengan nilai yang disimpan di pusat sel (bidang seragam dengan nilai 0), dan kondisi batas untuk patch mesh bawah didefinisikan sebagai tipe zeroGradient (lihat bab 1 untuk deskripsi numerik).
OpenFOAM memanipulasi bidang tensor yang terkait dengan elemen-elemen yang berbeda dari jaringan tidak berstruktur. Sebagai contoh, volVectorField untuk kecepatan U dan volScalarField untuk bidang tekanan p terkait dengan pusat sel, sementara surfaceScalarField menyimpan bidang aliran volumetrik phi, yang terkait dengan pusat wajah. Melihat sekilas ke dalam solver mana pun menunjukkan banyak operasi yang berbeda yang dieksekusi pada bidang-bidang tersebut. Untuk mengilustrasikan beberapa operasi umum pada bidang geometris, volScalarField p berfungsi sebagai sumber contoh:
Mengakses nilai-nilaibidang dilakukan dengan cara yang sederhana dengan melewatkan label sel tertentu ke operator akses [](const label&) dari bidang. Dalam contoh ini, kita memilih sel 4538:
Mengakses nilai di batas sedikit lebih kompleks, karena volScalarField tidak menyimpan nilai pada wajah sel secara langsung. Nilai-nilai batas ditentukan oleh kondisi batas yang didefinisikan pada batas tertentu. Menghitung nilai maksimum p pada patch batas pertama dari jaringan bisa dicapai dengan menggunakan kode berikut:
INFO
Urutan di mana patch batas disimpan dalam jaringan batas sama untuk semua bidang dan ditentukan oleh cara patch-patch tersebut terdaftar dalam file polyMesh/boundary. Ini, pada gilirannya, ditentukan oleh generator jala yang digunakan.
Secara default, setiap bidang mengembalikan nilai-nilai dari internalField-nya, saat diakses dengan operator akses operator[](const label&). Untuk mengakses nilai-nilai dari bidang batas, fungsi anggota boundaryField() harus dipanggil (boundaryFieldRef() untuk akses konstan). Ini mengembalikan daftar patch batas, satu patch batas untuk setiap batas jaringan. Setiap elemen adalah representasi abstrak dari kondisi batas yang dipilih oleh pengguna untuk patch ini. Bergantung pada jenis bidang, representasi ini baik mewarisi dari fvPatchField atau pointPatchField, meskipun yang pertama adalah yang paling sering digunakan.
INFO
Sangat berguna untuk melihat Extended Code Guide saat bekerja dengan kelas-kelas di OpenFOAM untuk menemukan fungsi anggota yang tersedia dan antarmukanya.
Seperti yang ditunjukkan dalam contoh di atas, OpenFOAM mengimplementasikan bidang sebagai yang disebut bidang geometris, yang memisahkan nilai-nilai menjadi dua set: nilai internal dan nilai batas. Bidang geometris adalah templat kelas dalam OpenFOAM karena mereka menyimpan tensor dengan peringkat yang berbeda dan mengasosiasikannya dengan elemen-elemen jaringan yang berbeda. Sebagai contoh, jika kita membayangkan sebuah jaringan geometris terdiri dari segmen garis, dan menyebutnya sebagai jaringan garis, model yang sesuai dari konsep bidang geometris yang bekerja dengan jaringan garis tersebut akan dinamai bidang garis. Bidang garis akan memetakan nilai-nilai tensor ke pusat setiap garis (nilai bidang internal), dan ke dua titik ujung batas dari jaringan garis (nilai bidang batas). Templat kelas yang mengimplementasikan konsep bidang geometris dinamai GeometricalField, dan instansiasinya menghasilkan model bidang geometris yang berbeda, yang memetakan ke jenis jaringan yang berbeda. Dalam OpenFOAM, berbagai model bidang geometris tersedia:
1. Kategori pertama adalah bidang-bidang yang sudah dikenal seperti volScalarField dan volVectorField, yang menyimpan data di pusat sel. Pada batas, kondisi batas harus diterapkan untuk meniru nilai yang disimpan di pusat wajah. Sufiks yang digunakan mengikuti konvensi penamaan vol*Field.
2. Kategori kedua adalah bidang-bidang yang menyimpan data di pusat wajah, untuk setiap wajah jaringan. Ini tidak terbatas pada batas domain. Salah satu jenis bidang ini adalah surfaceScalarField yang digunakan untuk mendefinisikan fluks φ antara dua sel yang bersebelahan. Semua bidang dalam kategori ini dinamai surface*Field.
3. Kategori ketiga berisi jenis-jenis bidang seperti pointScalarField atau pointVectorField. Bidang-bidang dalam kategori ini mungkin terlewat ketika berbicara tentang bidang OpenFOAM: Bidang-bidang yang menyimpan data di titik-titik jaringan. Setiap titik dalam jaringan memiliki nilai sendiri dan pada batas, kondisi batas harus didefinisikan untuk
titik-titik di batas dan bukan untuk pusat-pusat wajah. Mencari point*Field dalam kode sumber akan menunjukkan semua bidang dari kategori ini.
Setelah klarifikasi ini, kita dapat menjelajahi hubungan antara bidang dan kondisi batas. Dari sudut pandang desain, kondisi batas dalam OpenFOAM mengkapsulasi nilai-nilai bidang yang dipetakan ke batas domain bersama dengan fungsi anggota yang bertanggung jawab untuk perhitungan yang menentukan nilai-nilai batas tersebut berdasarkan nilai-nilai internal - kondisi batas tersebut. Templat kelas GeometricField menyediakan fungsi anggota yang menyederhanakan formulasi dan pembaruan kondisi batas. Beberapa fungsionalitas dari fungsi anggota tersebut termasuk menghitung nilai-nilai bidang batas dan mengambil nilai yang disimpan di sel internal yang berdekatan sebagai argumen. Keduanya merupakan persyaratan kunci untuk implementasi kondisi batas apa pun. Informasi lebih lanjut tentang fungsi anggota mana yang seharusnya melakukan tugas apa disediakan dalam bagian berikutnya 10.2.2. Bidang batas - dan dengan demikian kondisi batas - dikapsulasi bersama dengan internalField untuk membentuk GeometricField (lihat gambar 10.1). Salah satu dari tiga model bidang geometris, adalah sebuah typedef untuk GeometricField dengan argumen template yang sesuai.
Struktur kondisi batas dapat diselidiki dalam kode sumber. Sebagai contoh, pertimbangkan bagian deklarasi dari templat kelas GeometricField yang ditunjukkan dalam listing 41. Dari listing 41, jelas bahwa GeometricField diturunkan dari DimensionedField. Ini berarti bahwa operasi aritmatika default yang dieksekusi pada setiap instansiasi dari templat kelas GeometricField (model bidang geometris) akan dilakukan kecuali pada batas. Hal ini masuk akal, karena nilai-nilai di batas hanya harus ditentukan oleh kondisi batas yang sesuai. Menggunakan operator penugasan tambahan GeometricField::op-
operator==, operasi tersebut diperluas untuk mempertimbangkan bidang batas juga. Nilai-nilai di batas dapat ditimpa dari luar kondisi batas aktual, hingga kondisi batas dievaluasi lagi oleh fungsi anggota GeometricField::correctBoundaryConditions().
Mewarisi dari sebuah kelas (: public dalam potongan kode di atas) menghasilkan pewarisan fungsi anggotanya. Dalam kasus GeometricField, operator aritmatika diwarisi dari DimensionedField. Dimen- sionedField memodelkan nilai-nilai bidang internal, karena bidang-bidang batas terdiri dari GeometricField dengan atribut GeometricBoundaryField. Oleh karena itu, operator aritmatika yang di-overload dari Dimen- sionedField mengkecualikan nilai-nilai bidang batas.
INFO
Operator GeometricField::operator== bukan operator perbandingan kesetaraan logis dalam OpenFOAM, melainkan memperluas penugasan GeometricalField untuk memasukkan nilai-nilai bidang batas. Ini ditambahkan ke antarmuka GeometricField untuk menyertakan operasi aritmatika pada bidang batas yang disusun.
Bidang batas itu sendiri dideklarasikan sebagai deklarasi templat kelas bertingkat, dan GeometricField menyimpannya sebagai atribut pribadi. Templat kelas bidang batas dinamai GeometricBoundaryField, deklarasinya ditemukan dalam templat kelas GeometricField dan berisi daftar bidang patch batas, satu bidang patch untuk setiap batas jaringan. Meskipun GeometricBoundaryField dikapsulasi dalam GeometricField, akses non-konstan disediakan, yang menghasilkan kemampuan kode klien GeometricField untuk mengubah nilai-nilai bidang batas. Pada pandangan pertama, ini melanggar enkapsulasi bidang batas oleh bidang geometris, namun, manfaatnya lebih besar daripada
prinsip-prinsip desain, karena pendekatan ini menghasilkan fleksibilitas penggunaan yang jauh lebih besar. Sebagai contoh, sebuah model termodinamika dapat mengubah nilai-nilai bidang dengan cara yang bergantung pada bidang geometris lainnya. Perubahan dalam hal ini didorong dari luar GeometricField, seperti yang sering terjadi, karena bidang geometris adalah variabel global dalam OpenFOAM, dioperasikan oleh solver yang diimplementasikan sebagai urutan prosedural dari perhitungan. Akses non-konstan ke anggota data bidang batas ditunjukkan dalam listing 42.
Berbeda dengan bidang batas, bidang internal diatasi dengan cara yang berbeda dalam GeometricField. Karena GeometricField berasal dari DimensionedField, tidak perlu mengembalikan objek yang berbeda. Untuk mengakses bidang internal, referensi ke *this dikembalikan, karena Dimen- sionedField mengimplementasikan bidang internal dan operasi aritmatikanya dengan pemeriksaan dimensi. Listing 43 menjelaskan bagaimana bidang geometris memberikan akses ke bidang internal. Fungsi anggota internalField() mengembalikan referensi non-konstan ke GeometricField yang, dengan pewarisan, adalah DimensionedField.
Pada titik ini, Anda seharusnya memiliki gambaran tentang bidang-bidang yang terlibat dalam simulasi di OpenFOAM dan mengapa GeometricBoundaryField dikapsulasi dalam GeometricField, dengan akses non-konstan disiapkan untuk manipulasi yang dilakukan oleh kode klien dari templat kelas GeometricField. Menganalisis diagram pewarisan dan kolaborasi kelas, meskipun tentu berguna, tidak seefisien menggunakan pemahaman seperti menggunakan kelas-kelas itu sendiri, yang dibahas dalam bagian-bagian berikutnya.