7.2 OpenFOAM®
OpenFOAM® [1] menggunakan diskritisasi sel berbasis volume terbatas pada domain dan menangani format data mesh tak terstruktur berdasarkan penyimpanan yang disebut face-addressing. Tujuan dari struktur data ini adalah untuk memberikan fleksibilitas maksimum dalam definisi grid tak terstruktur agar memungkinkan penggunaan bentuk polihedron umum.
Seperti yang ditunjukkan pada Gambar 7.7, polihedron adalah suatu benda padat tiga dimensi yang terdiri dari kumpulan poligon bidang, bergabung di tepi-tepinya. Contohnya, tetrahedra (polihedron dengan empat wajah segitiga) dan hexahedra (polihedron dengan enam wajah) adalah polihedra di mana wajah-wajahnya terbentuk oleh poligon-poligon dengan tiga dan empat tepi, masing-masing. Kemampuan untuk menggambarkan bentuk tiga dimensi apa pun dan menggunakannya sebagai elemen volume terbatas untuk diskritisasi persamaan memberikan keuntungan dan fleksibilitas yang banyak selama pembentukan mesh.
Cara efisien untuk mendeskripsikan mesh yang dibangun menggunakan elemen polihedral adalah face addressing. Dalam face addressing, bentuk elemen tidak memiliki konsekuensi terhadap proses diskritisasi persamaan, dan memerlukan penggunaan addressing global saat membentuk koefisien. (Detail pembentukan koefisien dari perspektif lokal dan global akan dijelaskan lebih lanjut).
Di OpenFOAM®, data untuk titik-titik, wajah-wajah, dan elemen-elemen disimpan dalam beberapa daftar (array), seperti yang ditunjukkan pada Gambar 7.8. Daftar titik-titik berisi koordinat spasial tiga dimensi, yang didefinisikan sebagai vektor, yang sesuai dengan sudut-sudut mesh aktual. Satuan dimensionalnya adalah meter. Selain itu, setiap sudut memiliki label yang didefinisikan oleh posisinya dalam daftar, dan karena penggunaan bahasa pemrograman C++, penghitungan label dimulai dari nol.
Wajah-wajah didefinisikan oleh daftar label sudut yang merujuk pada titik-titik di mana urutannya disusun sedemikian rupa sehingga setiap dua sudut bertetangga terhubung oleh sebuah tepi. Daftar wajah diorganisir sedemikian rupa sehingga semua wajah internal muncul terlebih dahulu di daftar, diikuti oleh wajah yang terkait dengan batas pertama, kemudian wajah yang terkait dengan batas kedua, dan seterusnya. Daftar wajah batas juga disebut sebagai patch. Penting untuk diingat bahwa wajah-wajah internal milik dua sel sementara wajah-wajah batas milik satu sel saja.
GAMBAR 7.7
Elemen Polihedron
GAMBAR 7.8
Data titik, wajah dan elemen
Akhirnya, daftar elemen atau sel didefinisikan oleh daftar indeks, di mana posisi dalam daftar itu adalah indeks sel, indeks pertama di setiap posisi adalah jumlah wajah untuk elemen tersebut, dan indeks wajah pada suatu posisi mewakili wajah-wajah untuk sel tersebut.
OpenFOAM® dapat membaca grid komputasi dari perangkat lunak generator mesh mana pun yang mampu menulis file-file yang diperlukan oleh OpenFOAM®. Seperti yang dijelaskan sebelumnya, mesh dinamai polyMesh dan harus didefinisikan dengan sekelompok file yang sesuai. File-file ini ditempatkan dalam direktori “constant/polyMesh”. Berdasarkan deskripsi sebelumnya, nama-nama file yang isinya dapat dijelaskan dengan sendirinya diberikan oleh:
- points
- faces
- owner
- neighbour
- boundary
Di OpenFOAM®, seluruh batas domain dijelaskan sebagai daftar patch dalam file boundary. File boundary adalah daftar dari semua patch yang didefinisikan yang berisi entri yang sesuai dengan setiap patch yang dinyatakan menggunakan nama patch, jenisnya, jumlah wajahnya (nFaces), dan wajah awal (startFace). Sintaks umum yang digunakan dituliskan pada Listing 7.36.
Listing 7.36
Skrip yang digunakan ntuk membuat suatu patch
Sebuah contoh file boundary dengan dua jenis batas ditunjukkan dalam Listing 7.37.
Listing 7.37
File boundary dengan dua jenis batas
Dari sudut pandang pemrograman, layak untuk memberikan pengantar singkat mengenai kelas-kelas C++ yang menangani mesh dan memungkinkan akses ke data spesifik. Kelas dasar yang menangani struktur “low-level” disebut primitiveMesh. Ini adalah kelas generik yang membungkus informasi geometris dari mesh tanpa mengasumsikan bentuk diskritisasi tertentu. Ini adalah kelas dasar untuk informasi tingkat rendah tentang mesh.
Contoh beberapa fungsi yang merupakan anggota dari kelas primitiveMesh ditunjukkan pada Listing 7.38.
Listing 7.38
Fungsi dari kelas primitiveMesh
Seperti yang dapat dilihat, kelas ini memungkinkan untuk mendapatkan data khusus dari mesh (misalnya, volume sel, pusat sel, pusat wajah, dll.). Penting untuk dicatat bahwa kelas ini sendiri tidak mengenali batas atau antarmuka domain. Batas dan antarmuka domain didefinisikan dalam kelas polyMesh, yang diturunkan dari kelas primitiveMesh.
Selain memiliki semua atribut kelas turunan, kelas polyMesh memperkenalkan penanganan definisi dan informasi batas, seperti yang ditunjukkan dalam Listing 7.39. Sekali lagi, kelas ini tidak memerlukan skema diskritisasi tertentu.
Listing 7.39
Informasi yang dapat diperoleh dari kelas polyMesh
Sementara primitiveMesh dan polyMesh adalah kelas dasar dari mesh polihedral, kelas fvMesh diturunkan dari polyMesh dan menambahkan data dan fungsi khusus yang diperlukan untuk diskritisasi finite volume. Informasi addressing serta informasi batas dan data mesh spesifik dapat diakses untuk diskritisasi finite volume.
OpenFOAM® membagi mesh batas menjadi patch yang disimpan dalam daftar yang ditunjuk oleh polyPatchList di bawah kelas polyBoundaryMesh. Kemudian, mirip dengan mesh interior, kelas khusus yang ditunjukkan oleh fvBoundaryMesh diturunkan dari polyBoundaryMesh yang mewarisi fungsionalitasnya dan memperluasnya untuk mencakup fungsi dan data spesifik yang diperlukan untuk diskritisasi finite volume. Sebagai diskritisasi internal, hirarki kelas yang serupa terdiri dari primitivePatch, polyPatch, dan fvPatch didefinisikan untuk diskritisasi batas. Kelas-kelas ini khusus untuk mesh batas dan berisi informasi geometris dari setiap batas. Namun, fvPatch digunakan untuk menerapkan kondisi batas selama diskritisasi finite volume. Gambar 7.9 menyajikan gambaran skematis dari deskripsi dasar mesh yang digunakan di OpenFOAM®.
Dengan cara yang serupa, fvMesh digunakan untuk mengakses semua fungsionalitas mesh. Oleh karena itu, terutama dengan fvMesh dan fvPatch, kelas dan fungsi diskritisasi berinteraksi.
Gambar 7.9
Informasi yang dapat diperoleh dari kelas polyMesh
Baca juga: Peralatan Konversi Jaringan