OpenFoam
Di OpenFOAM®, suku konveksi dapat dievaluasi secara eksplisit menggunakan fungsi fvc::div(mDot, phi)
atau secara implisit melalui fungsi fvm::div(mDot, phi)
.
Fungsi
fvc::div(mDot, phi)
mengembalikan medan di mana divergensi dariphi
dievaluasi di setiap sel. Medan ini kemudian ditambahkan ke sisi kanan dari sistem persamaan.Fungsi
fvm::div(mDot, phi)
mengembalikanfvMatrix
, yaitu matriks koefisien yang dievaluasi berdasarkan linearisasi fluks wajah. Matriks koefisien ini kemudian ditambahkan ke sisi kiri dari sistem persamaan.
Skrip fungsi fvm::div
dan fvc::div
dapat ditemukan dalam file FOAM_SRC/finiteVolume/finiteVolume/convectionSchemes/gaussConvectionScheme/gaussConvectionSheme.C
. Seperti yang sudah disebutkan, kelas konveksi didasarkan pada jenis skema interpolasi di wajah dan sesuai dengan itu, deklarasi kelas dilakukan seperti yang ditampilkan dalam Listing 11.3.
Daftar 11.3 Deklarasi kelas skema konveksi
Dalam deklarasi di atas, anggota pribadi tinterpScheme_
menggambarkan jenis interpolasi wajah di mana operator divergensi didasarkan. Selain fungsi yang disebutkan di atas, kelas gaussConvectionScheme
mendefinisikan dua fungsi tambahan bernama interpolate
dan flux
, seperti yang ditunjukkan dalam Daftar 11.4, yang membungkus kelas surfaceInterpolation
yang digunakan untuk melakukan interpolasi dari medan volume ke medan permukaan.
Daftar 11.4 Kelas gaussConvectionScheme
yang mendefinisikan fungsi interpolate
dan flux
.
Untuk diskritisasi eksplisit dari konveksi, operator mendefinisikan suatu medan di mana divergensi fluks wajah sel disimpan. Kode yang digunakan oleh operator fvc::div
untuk evaluasi eksplisit divergensi suatu medan di atas suatu volume tertentu adalah sebagai berikut (Daftar 11.5):
Daftar 11.5 Skrip yang digunakan untuk evaluasi eksplisit operator divergensi
Perhitungan divergensi dari suatu medan melibatkan tiga langkah berikut:
- Evaluasi nilai pada wajah-wajah elemen.
- Mengalikan nilai pada wajah dengan fluks massa pada wajah (yaitu, faceFlux).
- Menjumlahkan kontribusi dari semua wajah sel dan membagi jumlah tersebut dengan volume sel.
Pertama, nilai wajah dari variabel generik vf dievaluasi. Kemudian estimasi yang diperoleh dikalikan dengan nilai fluks massa wajah yang sesuai menggunakan fungsi bantu. Akhirnya, jumlah atas semua wajah sel dilakukan menggunakan fungsi surfaceIntegrate. Implementasi dari fungsi ini dapat ditemukan di bawah FOAM_SRC/finiteVolume/finiteVolume/fvc/fvcSurfaceIntegrate.C dan skripnya diberikan dalam Daftar 11.6.
Daftar 11.6 Skrip fungsi surfaceIntegrate
Diskritisasi implisit dari suku konveksi dilakukan menggunakan operator fvm::div
. Ini dilakukan dengan secara implisit mengungkapkan nilai variabel tergantung di wajah sebagai fungsi dari nilai pemilik dan tetangga sesuai dengan
dimana subskrip O dan N mengacu pada pemilik dan tetangga, secara berurutan, dan – mewakili bobot yang diberikan pada kontribusi pemilik terhadap nilai di wajah. Cara bobot dihitung akan dijelaskan di bab berikutnya. Koefisien dari ϕO dan ϕN kemudian digunakan untuk merakit matriks koefisien. Skrip yang digunakan untuk melakukan diskritisasi implisit dari operator divergensi dibaca sebagai berikut (Daftar 11.7)
Daftar 11.7 Perhitungan implisit divergensi suatu bidang
dimana pertama-tama sebuah fvMatrix didefinisikan dan kemudian, seperti yang ditunjukkan dalam Daftar 11.8, itu diisi dengan benar dengan koefisien yang sesuai seperti
Daftar 11.8 Merakit dengan benar bobot kontribusi terhadap koefisien
Gambar 11.21 Grafik UML untuk kelas surfaceInterpolationScheme, di mana sebuah kotak dengan batas hitam menunjukkan sebuah struktur atau kelas yang didokumentasikan di mana tidak semua hubungan warisan/konten ditunjukkan
Dimana vektor atas dan bawah sekarang didefinisikan menggunakan bobot interpolasi yang disebut tweights, seperti yang dijelaskan di atas. Selanjutnya, Persamaan (11.163) menunjukkan bahwa implementasi operator implisit di OpenFOAM® didasarkan pada diskritisasi yang disebut “downwind” (seperti dijelaskan nanti) di mana semua skema didiskritisasi secara sepenuhnya implisit independen dari urutan akurasi dan tanpa menggunakan pendekatan koreksi tertunda. Teknik ini juga mirip dengan metode faktor pembobotan downwind yang akan dijelaskan dalam bab berikutnya.
Seperti yang dijelaskan di atas untuk kedua metode diskritisasi eksplisit dan implisit, operator divergensi untuk perhitungan suku konveksi didasarkan pada interpolasi wajah dan perhitungan bobot. OpenFOAM® melakukan tugas-tugas ini dalam kelas dasar yang ditunjukkan oleh surfaceInterpolationScheme. Dari kelas dasar ini, sejumlah besar skema interpolasi diturunkan dan diimplementasikan, seperti yang ditunjukkan dalam grafik UML yang digambarkan dalam Fig. 11.21. Untuk pemahaman yang lebih baik, detail tambahan tentang kelas ini diberikan selanjutnya.
Seperti yang disebutkan di atas, operator fvc::div dan fvm::div menggunakan kelas surfaceInterpolationScheme untuk melakukan tugas yang diperlukan untuk setiap metode diskritisasi. Dalam kelas ini, fungsi yang digunakan untuk menghitung nilai di wajah (vf) dan bobot ditampilkan dalam Daftar 11.9 dan 11.10, secara berturut-turut, dan di mana tinterpScheme_ (Daftar 11.10) adalah objek surfaceInterpolationScheme.
Daftar 11.9 Fungsi interpolasi di mana nilai di wajah (vf) dihitung.
dan
Daftar 11.10 Fungsi yang digunakan untuk menghitung bobot
Definisi dari kelas dapat ditemukan di FOAM_SRC/finiteVolume/interpolation/surfaceInterpolation/surfaceInterpolationScheme/Surface InterpolationScheme.H di mana dua fungsi utama (Daftar 11.11 dan 11.12), yang diperlukan untuk perhitungan operator divergensi, didefinisikan.
Daftar 11.11 Definisi fungsi utama untuk interpolasi wajah
Daftar 11.12 Definisi fungsi utama untuk perhitungan faktor bobot
Fungsi interpolate dalam Daftar 11.9 (di sini OpenFOAM® mengadopsi nama fungsi yang sama namun untuk implementasi yang berbeda) digunakan dengan operator eksplisit fvc::div dan didefinisikan sebagai fungsi virtual biasa yang berarti bahwa kelas turunan dapat mengadopsinya atau tidak. Untuk sebagian besar kelas turunan, fungsi ini tidak dipilih dan definisi dalam kelas surfaceInterpolationScheme didasarkan pada bentuk modifikasi dari Persamaan (11.163) yang ditulis sebagai
Untuk mengimplementasikan Persamaan (11.164), OpenFOAM® menggunakan fungsi tambahan dengan nama yang mirip dengan yang digunakan sebelumnya dalam kelas surfaceInterpolationScheme. Pertama, sebuah kelas interpolate dengan satu argumen diinstansiasi dari operator divergensi. Kemudian di dalam fungsi interpolate, sebuah fungsi interpolate baru dengan dua argumen diperkenalkan bersama dengan sebuah fungsi bobot baru, menggunakan skrip yang ditunjukkan dalam Daftar 11.13.
Daftar 11.13 Fungsi interpolate baru dengan dua argumen
Fungsi interpolate baru (yang dengan dua argumen) menghitung nilai wajah sesuai dengan Persamaan (11.164). Skrip yang digunakan untuk melakukan tugas ini diberikan oleh (Daftar 11.14)
Daftar 11.14 Skrip yang digunakan untuk menghitung nilai wajah sesuai dengan Persamaan (11.164)
Di mana lambda mewakili bobot ϖ dalam Persamaan (11.164). Seperti yang diperkenalkan singkat di atas, fungsi bobot sekarang merupakan fungsi virtual murni dan ini mendefinisikan bobot interpolasi. Berlawanan dengan fungsi interpolate, fungsi bobot yang merupakan virtual murni harus didefinisikan ulang untuk setiap kelas turunan (persyaratan C++). Kembali melihat ke Gambar 11.20, semua kelas turunan harus mendefinisikan fungsi bobot. Redefinisi harus dilakukan dengan membangun bobot yang sesuai dengan skema yang diadopsi. Untuk kasus skema perbedaan pusat, fungsi bobot didefinisikan dalam sebuah kelas yang dinamakan linear<Type> dengan skripnya diberikan oleh (Daftar 11.15)
Daftar 11.15 Skrip untuk menghitung bobot dari skema perbedaan pusat
dimana surfaceInterpolation::weights() mengembalikan bobot jarak berdasarkan mesh, sehingga menentukan diskritisasi perbedaan pusat. Contoh lainnya adalah skema downwind yang didefinisikan oleh Persamaan 11.44, dan di mana fungsi bobot diberikan oleh (Daftar 11.16)
Daftar 11.16 Skrip untuk menghitung bobot dari skema downwind
dimana fungsi neg mengembalikan 0 untuk fluks positif dan 1 untuk fluks negatif, yang merupakan kebalikan dari fungsi pos yang digunakan dengan skema upwind.