Blockmesh. Ketika memanggil executable blockMesh, blockMeshDict dibaca secara otomatis dari direktori constant/polyMesh, di mana harus ada.
blockMesh menghasilkan mesh berstruktur blok heksahedral yang kemudian dikonversi menjadi format tak terstruktur yang sewenang-wenang dari OpenFOAM. Menghasilkan grid dengan blockMesh untuk geometri kompleks seringkali adalah tugas yang sangat melelahkan dan sulit dan kadang-kadang tidak mungkin. Upaya yang harus dilakukan pengguna untuk menghasilkan blockMeshDict meningkat secara signifikan untuk geometri yang kompleks. Oleh karena itu, hanya mesh sederhana yang biasanya dihasilkan menggunakan blockMesh dan diskritisasi geometri sebenarnya kemudian dialihkan ke snappyHexMesh. Hal ini membuat blockMesh menjadi alat yang bagus untuk menghasilkan mesh yang terdiri dari geometri yang cukup sederhana, atau untuk menghasilkan mesh latar belakang untuk snappyHexMesh.
Sebuah contoh blok yang digunakan oleh blockMesh untuk membuat mesh ditunjukkan dalam gambar 2.5. Setiap blok terdiri dari 8 sudut yang disebut verteks. Blok heksahedral dibangun dari sudut-sudut ini. Tepi, seperti yang ditunjukkan dalam gambar 2.5,
Gambar 2.6: Lingkaran putus-putus abu-abu menggambarkan tepi sebuah blok, garis hitam menunjukkan tepi sel yang dihasilkan, dan titik abu-abu menunjukkan tiga simpul pada tepi.
Sambungkan sudut-sudut satu sama lain. Akhirnya, permukaan blok didefinisikan oleh patch walaupun hal tersebut hanya perlu ditentukan secara eksplisit untuk batas-batas blok yang tidak memiliki blok tetangga. Batas antara dua blok tidak boleh terdaftar dalam definisi patch, karena secara definisi mereka bukan patch. Panjang dan jumlah simpul pada tepi tertentu harus sesuai agar tetap konsisten secara topologis. Kondisi batas untuk simulasi aktual akan diterapkan nanti pada patch-patch tersebut.
Perlu dicatat bahwa memungkinkan untuk menghasilkan blok dengan kurang dari 8 simpul dan memiliki simpul yang tidak sesuai pada patch (lihat [4]), namun, hal ini tidak dibahas dalam panduan ini. Tepi-tepi blok secara default berupa garis lurus, tetapi dapat diganti dengan berbagai jenis garis seperti busur, poligon, atau spline. Memilih misalnya sebuah busur memengaruhi bentuk topologi tepi blok, tetapi sambungan antara titik-titik mesh akhir pada tepi tersebut tetap lurus (lihat gambar 2.6).
Sistem Koordinat
Mesh akhir dibangun dalam sistem koordinat global (berkedudukan tangan kanan), yang bersifat Kartesian dan sejajar dengan sumbu koordinat utama: x, y, dan z. Ini menghasilkan masalah ketika blok-blok harus diatur dan ditempatkan secara sembarangan di ruang. Untuk mengatasi masalah ini, setiap blok diberi sistem koordinat tangan kanan sendiri, yang menurut definisi tidak memerlukan tiga sumbu tersebut untuk bersifat ortogonal. Tiga sumbu tersebut diberi label x1, x2, x3 (lihat [4] dan gambar 2.5). Definisi sistem koordinat lokal dilakukan berdasarkan notasi yang ditunjukkan dalam gambar 2.5: Sudut 0 menentukan titik awal, pasangan sudut (0,1) mewakili x1, sementara x2 dan x3 didefinisikan oleh pasangan sudut (0,3) dan (0,4), masing-masing.
Gambar 2.7: Ilustrasi dari rasio ekspansi, dengan tepi 3 digunakan sebagai contoh
Distribusi Node
Pada proses pembuatan mesh, setiap blok dibagi menjadi sel. Sel-sel tersebut didefinisikan oleh simpul-simpul pada tepi-tepi dalam setiap sumbu koordinat sistem koordinat blok dan mengikuti hubungan yang diberikan oleh:
Ada pada pengguna untuk menentukan dalam blockMeshDict berapa banyak sel yang akan muncul pada tepi tertentu. Sel-sel pada tepi dapat didistribusikan secara seragam atau secara tidak seragam berdasarkan grading. Ada dua jenis grading: simpleGrading dan edgeGrading berdasarkan. Sebuah simpleGrading menggambarkan grading pada sebuah tepi berdasarkan rasio ukuran dari sel terakhir ke sel pertama pada tepi tersebut (lihat gambar 2.7):
Jika er = 1 semua node tersebar secara seragam pada tepi tersebut, tanpa ada grading. Dengan rasio ekspansi er > 1, spacing node meningkat dari awal hingga akhir tepi. Dari sumber C++ blockMesh dapat ditemukan bahwa rasio ekspansi yang didefinisikan oleh pengguna (er) diubah skala oleh hubungan berikut:
Di mana n mewakili jumlah node pada tepi tersebut. Dengan memasukkan persamaan (2.3) ke dalam persamaan (2.4), posisi relatif dari node ke-i pada sebuah tepi dapat dihitung.
Meskipun ini mungkin terlihat terlalu rumit untuk dilakukan untuk semua blok dalam blockMeshDict, ini berguna ketika transisi mulus dalam ukuran sel antara dua blok yang saling berdekatan diperlukan. Dalam banyak kasus, mencoba dan kesalahan biasanya cukup.
Mendefinisikan kamus untuk contoh minimal
Sebagai contoh kecil tentang bagaimana blockMeshDict diatur dengan benar, sebuah kubus berukuran 1m3 dalam volume di-discretkan. Sebuah kasus yang disiapkan dapat ditemukan di direktori chapter2/blockMesh dari repositori contoh kasus. Kamus itu sendiri terdiri dari satu kata kunci dan empat sub-kamus. Kata kunci pertama adalah convertToMeters yang biasanya bernilai 1. Semua lokasi titik diskalakan oleh faktor ini, yang berguna jika geometri sangat besar atau sangat kecil. Dalam kedua kasus tersebut kita akan mengetik banyak nol yang terdapat di awal atau akhir, yang merupakan tugas yang melelahkan. Dengan mengatur convertToMeters sesuai, kita dapat menghemat beberapa pengetikan. Baris pertama yang relevan dari blockMeshDict adalah:
Kedua, verteks harus didefinisikan. Penting untuk diingat bahwa verteks dalam blockMesh berbeda dari titik-titik pada polyMesh yang dibuat, meskipun definisinya cukup mirip. Untuk contoh kubus satuan, definisi verteksnya adalah
Setelah melihat definisi di atas, jelas bahwa sintaksnya adalah daftar dan mirip dengan daftar titik-titik dalam definisi polyMesh. Ini karena tanda kurung bulat yang menunjukkan daftar dalam OpenFOAM, sedangkan kurung kurawal akan mendefinisikan kamus. Empat baris pertama mendefinisikan keempat verteks di bidang x3 = 0 dan baris-baris berikutnya melakukan hal yang sama untuk bidang x3 = 1. Mirip dengan titik-titik dalam polyMesh, setiap elemen diakses berdasarkan posisinya dalam daftar dan bukan berdasarkan koordinatnya. Harap dicatat bahwa setiap verteks harus unik dan oleh karena itu hanya muncul sekali dalam daftar.
Sebagai langkah berikutnya, blok-blok harus didefinisikan. Gambar 2.5 dapat digunakan sebagai referensi. Contoh definisi blok untuk kubus satuan bisa terlihat seperti
Ini lagi adalah sebuah daftar yang berisi blok-blok dan bukan kamus, karena tanda kurung bulat. Definisi ini mungkin terlihat aneh pada pandangan pertama, tetapi sebenarnya cukup sederhana. Kata pertama "hex" dan set pertama tanda kurung bulat yang berisi delapan angka memberitahu blockMesh untuk menghasilkan sebuah heksahedron dari verteks 0 hingga 7. Verteks-verteks ini persis seperti yang ditentukan dalam bagian verteks di atas dan diakses berdasarkan label mereka. Urutannya tidak sembarangan, tetapi didefinisikan oleh sistem koordinat blok lokal sebagai berikut:
1. Untuk bidang lokal x3 = 0, daftar semua label verteks mulai dari titik asal dan bergerak sesuai dengan sistem koordinat tangan kanan.
2. Lakukan hal yang sama untuk bidang lokal x3≠ 0
Mungkin saja memperoleh definisi blok yang valid dengan mengacaukan urutan daftar verteks dalam definisi blok tertentu. Blok yang dihasilkan akan terlihat terbelit atau menggunakan orientasi koordinat global yang salah. Begitu blockMesh dan checkMesh dijalankan dan jaringan disusun dalam pemrosesan pasca (misalnya paraView), hal ini akan terdeteksi.
INFO
checkMesh adalah alat nativ OpenFOAM untuk memeriksa integritas dan kualitas jaringan, berdasarkan berbagai kriteria. Jika output dari checkMesh menyatakan bahwa jaringannya tidak baik, jaringan tersebut harus diperbaiki.
Kumpulan tanda kurung kedua mendefinisikan berapa banyak sel yang didistribusikan dalam setiap arah blok tertentu. Dalam kasus ini, blok tersebut memiliki 10 sel untuk setiap arah. Mengubah jumlah sel menjadi 2 sel di x1, 20 sel di x2, dan 1337 sel di x3, definisi blok akan terlihat seperti ini:
Bagian terakhir yang tersisa adalah bagian simpleGrading bersama dengan set terakhir angka dalam tanda kurung. Ini adalah cara termudah untuk mendefinisikan grading (atau rasio ekspansi) seperti yang dijelaskan sebelumnya. Kata kunci simpleGrading dalam hal ini, menentukan grading untuk keempat sisi dalam masing-masing tiga arah sumbu koordinat lokal untuk menjadi identik. Oleh karena itu, setiap dari tiga angka yang disebutkan dalam tanda kurung setelah simpleGrading menentukan grading untuk arah x1, x2, dan x3 secara berturut-turut.
Kadang-kadang ini tidak cukup fleksibel. Di sinilah edgeGrading dapat digunakan. Pendekatan grading yang lebih canggih ini pada dasarnya sama dengan simpleGrading, tetapi grading untuk masing-masing dari 12 tepi pada sebuah heksahedron dapat ditentukan secara eksplisit. Oleh karena itu, set terakhir tanda kurung tidak akan mencantumkan 3 angka, tetapi 3 kali 4. Sekarang, setiap sisi dapat diatur secara individual.
Menyimpan blockMeshDict dan menjalankan blockMesh setelahnya, menghasilkan mesh yang valid yang terlihat mirip dengan yang didefinisikan dalam blockMeshDict. Tetapi blockMesh memberikan peringatan tentang patch yang tidak didefinisikan yang semuanya dimasukkan ke dalam patch defaultFaces secara default.
Menentukan patch secara manual dilakukan dengan mendefinisikannya di dalam daftar yang disebut patches dan untuk patch contoh 0:
Ini menginstruksikan blockMesh untuk menghasilkan patch dengan tipe patch yang bernama XMIN, berdasarkan sisi yang dibangun dari verteks 4, 7, 3, dan 0. Secara internal, nama patch didefinisikan sebagai word dan tipe data ini
Figure 2.8: Kubus satuan yang dimasukkan dengan blockMesh dan resolusi tepi sebesar 10 sel dalam setiap arah muncul dalam pesan kesalahan secara teratur.
Bagaimana verteks diurutkan tidak sewenang-wenang. Mereka perlu ditentukan dalam orientasi searah jarum jam, dilihat dari dalam blok. Gambar kubus satuan dari contoh minimal kami, terdiri dari 1000 kubus kecil, ditampilkan dalam gambar 2.8, dengan penekanan pada patch XMIN, YMIN, dan ZMAX. Berkas yang digunakan untuk menghasilkan mesh ini dapat ditemukan di repositori contoh di bawah chapter2/blockMesh.
Seperti yang disebutkan sebelumnya, tepi blok adalah garis secara default, sehingga daftar yang berisi definisi tepi adalah opsional. Secara cukup mirip, dengan blok dan patch yang didefinisikan di atas, menghubungkan dua verteks dengan busur alih-alih garis default akan terlihat seperti ini:
Setiap item dalam daftar yang berisi definisi tepi dimulai dengan kata kunci yang menunjukkan jenis tepi, diikuti oleh label titik awal dan akhir. Dalam contoh ini, garis ditutup oleh titik ketiga yang diperlukan untuk membuat busur. Untuk bentuk tepi lainnya (misalnya, polyLine atau spline), titik ini akan digantikan oleh daftar titik penopang.
Gambar 2.9: Kubus satuan yang dimeshkan dengan blockMesh dan sebuah lengkungan sebagai salah satu sisi
Gambar 2.9 menunjukkan contoh penggunaan kode yang tercantum di atas dan bagaimana itu mengubah bentuk kubus satuan (lihat gambar 2.8).
Untuk melanjutkan dengan bagian snappyHexMesh, Anda perlu menghasilkan sebuah kubus satuan yang terdiri dari 50 sel dalam setiap arah.