Menambahkan mesh dinamis ke solver
Memperluas solver OpenFOAM dengan kemampuan mesh dinamis adalah proses yang cukup langsung, dan scalarTransportFoam menjadi contohnya. Karena perluasan untuk penanganan mesh dinamis memerlukan modifikasi pada file aplikasi solver tertentu, file yang memerlukan modifikasi harus disalin.
INFO
Saat memperluas solver OpenFOAM, dan pada umumnya saat memrogram, kurangi sebanyak mungkin jumlah kode sumber yang disalin.
Menyalin kode sumber meningkatkan waktu yang diperlukan untuk pemeliharaan. Jika ada bug di file asli, bug tersebut juga harus diperbaiki di salinan. Saat OpenFOAM berkembang, salinan kode sumber yang tidak perlu membuat sulit untuk mengikuti perubahan upstream. Selain itu, solver OpenFOAM kompleks mengandung file yang digunakan untuk menginisialisasi variabel global dan untuk algoritma solusi untuk PDE yang dikopelkan. Misalkan seluruh folder solver disalin, dan modifikasi pada solver itu kecil dan ditempatkan di satu file. Dalam hal ini, menjadi sulit untuk mengetahui perbedaan antara solver baru dan aslinya. Oleh karena itu, "praktik umum" menyalin seluruh folder solver secara buta saat menulis solver OpenFOAM baru, dalam jangka panjang, tidak efisien.
Langkah pertama saat memprogram solver OpenFOAM baru adalah, oleh karena itu, membuat folder solver dan menyalin hanya file-file yang diperlukan ke dalam folder solver.

Bahkan untuk solver scalarTransportFoam yang relatif sederhana, mungkin untuk menggunakan kembali file createFields.H. Dengan solver " dunia nyata " yang lebih kompleks, banyak file solver lainnya dapat digunakan kembali, menghasilkan implementasi yang lebih bersih. Penggunaan kembali file dimungkinkan dengan menambahkan jalur ke solver asli dalam file konfigurasi pembangunan Make/options OpenFOAM:

Baris "include" pertama mengarah ke folder solver OpenFOAM menggunakan variabel lingkungan $FOAM_SOLVER. Jika folder solver asli berisi sub-folder yang berisi file-file lain yang diperlukan, file-file tersebut juga dapat dimasukkan. Baris lain yang tercantum dalam potongan kode di atas ada di sana untuk menyertakan header dynamic mesh dan memuat pustaka dynamic mesh.
Karena contoh ini membuat solver baru, file scalarTransportFoam.C harus diubah namanya menjadi scalarTransportDyMSolver.C, mengikuti konvensi OpenFOAM untuk solver dengan dukungan dynamic mesh. Kemudian,

Gambar 13.8: Kasus uji untuk transportasi skalar dengan penyesuaian mesh. Sel-sel merah diinisialisasi dengan nilai 100, dan sel-sel biru dengan nilai 0, bola kawat adalah iso-surface dengan nilai iso 50.
Semua kemunculan scalarTransportFoam dalam Make/files harus diganti dengan scalarTransportDyMFoam. Penting untuk mengompilasi executable solver ke $FOAM_USER_APPBIN, bukan $FOAM_APPBIN standar, dalam Make/files.
Solver baru scalarTransportDyMFoam dalam keadaannya saat ini tidak melakukan hal baru, dibandingkan dengan solver aslinya. Ini dapat diuji menggunakan kasus simulasi chapter13/scalarTransportAutoRefine.
Gambar 13.8 menunjukkan kondisi awal dan geometri domain untuk kasus uji yang digunakan dengan contoh ini. Kasus uji terdiri dari domain kubik dengan lapangan awal yang diatur sebagaimana bola di sudut domain dan lapangan kecepatan konstan yang digunakan untuk mentransportasi lapangan ke arah diagonal spasial.
Setelah memverifikasi bahwa scalarTransportDyMSolver berfungsi seperti yang diharapkan, langkah berikutnya adalah mengimplementasikan kemampuan mesh dinamis dalam solver baru. Untuk melakukannya, scalarTransportDyMSolver.C harus dibuka di editor teks dan dynamicMesh.H harus disertakan setelah simpleControl.H:

Dalam fungsi utama, createDynamicFvMesh.H daripada createMesh.H harus disertakan, agar mesh dinamis dapat diaktifkan:

Jika kita melihat lebih dekat pada sumber daya scalarTransportFoam, kita akan menemukan bahwa tidak ada panggilan ke mesh.update(), yang bertanggung jawab untuk mengeksekusi fungsi mesh dinamis. Oleh karena itu, hal ini harus ditambahkan di akhir perulangan waktu:

File header mesh dinamis dan kode biner perpustakaan yang sesuai harus dibuat tersedia selama proses pembangunan agar solver baru dapat berfungsi. Untuk menyertakan header dan mengaitkan perpustakaan, file Make/options perlu dimodifikasi dengan menambahkan baris "include" berikut:

Aplikasi dihubungkan dengan perpustakaan mesh dinamis dengan menambahkan baris "linking" berikut ke Make/options:

Fungsi anggota dynamicRefineFvMesh::update memperbaiki nilai fluks volumetrik untuk wajah baru yang dihasilkan oleh prosedur pemurnian mesh. Proses ini disebut pemetaan fluks dan dapat diatur oleh pengguna dengan memodifikasi tabel pemetaan fluks yang ditempatkan di constant/dynamicMeshDict. Informasi tentang pemurnian mesh tersedia di bagian 13.1. Namun, fluks volumetrik yang dipetakan adalah tebakan awal yang cukup baik untuk algoritma solusi aliran, yang menegaskan nilai fluks volumetrik konservatif volume. Untuk persamaan adveksi scalar dalam contoh ini, tidak diperlukan algoritma solusi aliran karena lapangan diadveksi menggunakan kecepatan tetap yang ditentukan sebelumnya.
Mengompilasi dan menjalankan solver pada titik ini menghasilkan solusi yang tidak terbatas secara numerik. Untuk memecahkan masalah ini, kita memasukkan baris terakhir kode ke dalam aplikasi solver, yang meniru keberadaan algoritma solusi aliran, dan menghitung nilai fluks volumetrik konservatif volume. Baris ini dimasukkan tepat di bawah panggilan ke fungsi anggota update:

Kode sekarang siap untuk dikompilasi - dengan memanggil wmake di dalam folder solver. Solver baru dapat diuji di

di dalam folder kasus. Gambar 13.9 menunjukkan lapangan skalar sferis yang diangkut T seperti yang ditunjukkan dalam gambar 13.8 dengan penyesuaian mesh adaptif dinamis. Adveksi T bersifat difusif, dan pemurnian dan penghapusan mesh memecahkan wilayah yang difusif dan mengikuti medan yang diangkut.
INFO
Dengan mempertajam mesh, wajah sel baru dibuat, yang memerlukan modifikasi pada lapangan flux volumetrik. Konservasi volume, keterbatasan numerik, serta stabilitas solusi sangat bergantung pada nilai-nilai flux volumetrik.
LATIHAN
Kriteria perhalusan yang digunakan untuk kasus uji ini menghaluskan bagian dalam bola yang diangkut secara merata. Latihan menarik adalah menerapkan kriteria perhalusan yang akan mengikuti lonjakan nilai-nilai T. Ini akan mengurangi biaya komputasi dan meningkatkan akurasi.
