Desain perangkat lunak. Pustaka model transportasi OpenFOAM terdiri dari dua komponen utama: model transportasi dan model viskositas. Model-model viskositas menyediakan akses berorientasi objek yang langsung ke perhitungan dan data terkait viskositas. Bagian ini mencakup hubungan kelas untuk model-model viskositas dalam OpenFOAM menggunakan diagram UML yang disederhanakan untuk kelas-kelas utama, seperti yang ditunjukkan dalam gambar 11.2.
Kelas dasarnya disebut transportModel dan mewarisi dari IOobject. Kelas transportModel diinisialisasi dalam konstruktor untuk membaca kamus constant/transportProperties dari kasus OpenFOAM yang sesuai. Listing 65 menunjukkan konstruktor dari transportModel dan
inisialisasi IOobject:
Implementasi model transport memisahkan model untuk aliran satu fasa dari model untuk aliran dua fasa ke dalam dua kelas turunan dari kelas transportModel: singlePhaseTransportModel dan incompressibleTwoPhaseMixture. Pembagian ini disebabkan oleh perbedaan alami antara aliran satu fasa dan dua fasa.
Dalam OpenFOAM, semua solver fasa tunggal menggunakan kelas singlePhaseTransportModel untuk mengakses dan memuat viskositas kinematik nu. Parameter ini harus disediakan oleh pengguna dalam kamus constant/transportProperties. singlePhaseTransportModel dan model transport lainnya mendelegasikan proses membaca dan memperbarui kamus ini, yang membantu menjaga kode tetap bersih. Dalam solver satu fasa, singlePhaseTransportModel diinstansiasi sebagai berikut:
Perlu dicatat bahwa konstruktor model turbulensi memerlukan objek laminarTransport sebagai argumen karena model turbulensi akan memerlukan akses ke viskositas laminar, yang pada gilirannya dijelaskan oleh singlePhaseTransportModel.
Baik transportModel maupun singlePhaseTransportModel mendefinisikan fungsi anggota publik nu() yang mengembalikan viskositas sebagai volScalarField. Karena transportModel adalah kelas dasar abstrak, ia tidak tidak mengimplementasikan fungsi anggota ini, sedangkan kelas singlePhaseTransportModel harus mengimplementasikan fungsi anggota ini (lihat gambar 11.2). Implementasinya, bagaimanapun, mendelegasikan fungsionalitas ke viscosityModel:
viscosityModelPtr_ adalah anggota pribadi dari singlePhaseTransportModel dan didefinisikan sebagai autoPtr ke sebuah viscosityModel. Atribut kelas ini didefinisikan di file header sebagai:
Untuk saat ini, yang penting adalah bahwa viscosityModel somehow menentukan viskositas kinematik. Implementasi sebenarnya dan bagaimana viscosityModel dipilih akan dibahas di bawah ini.
Model transport dua fase dimodelkan oleh kelas incompressibleTwoPhaseMixture, digunakan oleh solver jenis interFoam dalam OpenFOAM yang tidak melibatkan perubahan fase. Secara mirip dengan sebagian besar solver fase tunggal, solver jenis interFoam membuat objek dari kelas tersebut dengan cara berikut:
Kolaborasi kelas untuk model campuran dua fase yang tidak dapat dimampatkan ditunjukkan dalam gambar 11.3. Instansiasi ini mirip dengan pendekatan yang telah digunakan untuk singlePhaseTransportModel, namun, kelas incompressibleTwoPhaseMixture menyimpan data tambahan. Alih-alih memiliki satu viscosityModel, dua diinstansiasi dan disimpan oleh kelas tersebut untuk mewakili setiap fase fluida.
Definisi kelas incompressibleTwoPhaseMixture ditampilkan dalam listing 66. Menggunakan autoPtr untuk menyimpan objek dari kelas turunan dari viscosityModel adalah hal yang wajib, karena ada beberapa kelas yang berbeda untuk jenis fluida yang berbeda, yang berasal dari viscosityModel. Setiap kelas tersebut dapat dipilih saat runtime dan pada akhirnya menentukan jenis fluida yang dipilih, yang pada gilirannya menentukan viskositas dan karenanya nilai kembalian dari fungsi anggota publik nu. Untuk membedakan antara kedua fase fluida, volScalarField baru diperkenalkan: alpha1_. Bidang ini digunakan dalam fungsi anggota VoF dan pada dasarnya merupakan nilai pencampuran.
Dalam kasus model singlePhaseTransportModel, panggilan ke fungsi anggota publik nu didelegasikan langsung ke viscosityModel yang dipilih. Namun, nilai kembalian dari fungsi anggota publik ini disusun secara berbeda. Salinan dari anggota privasi nu_ dikembalikan, yang dihitung berdasarkan viscosityModels kedua fase dan lapangan alpha1_ saat ini. Perhitungan ini dilakukan oleh anggota privasi calcNu dan dipicu ketika fungsi anggota publik benar dipanggil seperti yang ditunjukkan dalam daftar 67. Kedua viscosityModels diperbarui dan fraksi volume alpha1_ dibatasi untuk dibatasi antara 0 dan 1. Akhirnya, viskositas kinematik dihitung menggunakan viskositas dinamis mu dan distribusi densitas. Potongan terakhir dihitung menggunakan aturan campuran dalam hal properti masing-masing fase.
Kedua viscosityModels diperbarui dan fraksi volume alpha1_ dibatasi agar nilainya berada di antara 0 dan 1. Akhirnya, viskositas kinematik dihitung menggunakan viskositas dinamis mu dan distribusi densitas. Yang terakhir dihitung menggunakan aturan campuran dalam hal properti masing-masing fase.
Densitas dan fraksi volume alpha1_. Viskositas dinamis mu dihitung dengan cara yang sama, menggunakan lapangan alpha1_ yang dibatasi dan viskositas kinematik nu dari setiap viscosityModel.
Sampai pada titik ini, fokus ditempatkan pada transportModel dan turunannya, sementara kelas viscosityModels hanya disebutkan secara singkat. Kelas-kelas viscosityModels bertanggung jawab atas pemodelan dan perhitungan viskositas, mengikuti pola OOD Single Responsibility Principle (SRP). Daftar model viskositas dan deskripsi mereka tersedia di bagian 11.1. Mirip dengan struktur transportModel, kelas viscosityModel adalah kelas dasar abstrak untuk model viskositas sesungguhnya.
Seperti yang dijelaskan dalam gambar 11.2, viscosityModel mengimplementasikan sebuah fungsi anggota publik nu, yang pada akhirnya mengembalikan viskositas kinematik. Fungsi anggota ini memberikan akses ke viskositas dalam salah satu transportModels. Pada kelas dasar viscosityModel, ini adalah fungsi anggota virtual dan perlu diimplementasikan oleh setiap kelas turunan:
Dengan singlePhaseTransportModel dan incompressibleTwoPhaseMixture yang dijadikan kode keras ke dalam solver tertentu, viscosityModels adalah tipe akhir yang dipilih oleh pengguna. Oleh karena itu, mereka harus dapat dipilih pada saat runtime menggunakan entri tertentu dalam kamus constant/transportProperties. Karena itu, kelas dasar harus mengimplementasikan mekanisme RTS OpenFOAM.
Sebagai contoh untuk viscosityModel, dipilih kelas Newtonian. Ini menggambarkan viskositas untuk fluida Newtonian incompressible dan hanya mewarisi dari viscosityModel. Data tambahan disimpan dalam variabel anggota pribadi berikut:
Fungsi anggota nu harus diimplementasikan oleh kelas ini, karena definisi kelas dasarnya adalah virtual. Implementasi ini singkat dan mengembalikan nu_. Konstruktor ditunjukkan dalam listing 68.
Tentu saja konstruktor kelas dasar dipanggil pada posisi pertama dalam daftar inisialisasi, diikuti oleh inisialisasi untuk nu0_ dan nu.
INFO Meskipun transportModel adalah kelas dasar abstrak untuk semua model transportasi, solver spesialis akan memilih kelas model lain dalam hierarki. Sebagai contoh adalah incompressibleTwoPhaseMixture, yang merupakan transportModel, tetapi juga merupakan twoPhaseMixture, yang secara khusus dimaksudkan untuk digunakan oleh solver dua fase.