5.10.2 OpenFOAM®
OpenFOAM® (Open source Field Operation And Manipulation) adalah kerangka kerja berorientasi objek C++ yang dapat digunakan untuk membangun berbagai solver komputasi untuk masalah dalam mekanika kontinum dengan fokus pada diskritisasi volume terbatas. OpenFOAM® juga mencakup beberapa solver siap pakai, utilitas, dan aplikasi yang dapat langsung digunakan. Di inti dari perpustakaan ini adalah serangkaian kelas objek yang memungkinkan programmer untuk memanipulasi jaringan, geometri, dan teknik diskritisasi pada tingkat pemrograman yang tinggi. Tabel 5.1, 5.2, 5.3, dan 5.4 menyajikan daftar kelas-kelas utama OpenFOAM® dan fungsi-fungsinya. Kelas-kelas ini mewakili dasar-dasar untuk pengembangan aplikasi dan utilitas berbasis OpenFOAM®. Mereka memungkinkan para programmer untuk membangun berbagai algoritma sambil memungkinkan penggunaan ulang kode yang luas.
Salah satu karakteristik lain dari OpenFOAM® adalah penggunaan operator overloading yang memungkinkan algoritma diekspresikan secara alami. Sebagai contoh, diskritisasi persamaan transport untuk sebuah scalar generik / diberikan


Operator fvm::div, sebagai contoh, mengambil fluks konvektif sebagai medan koefisien yang didefinisikan di atas wajah-wajah elemen kontrol dan phi sebagai medan variabel yang didefinisikan di atas pusat-pusat sel, dan mengembalikan sebuah sistem persamaan termasuk matriks LHS (Left Hand Side) dan sebuah vektor RHS (Right Hand Side) yang mewakili diskritisasi operator konveksi. Matriks LHS dan vektor RHS ini dihasilkan untuk setiap operator dan kemudian ditambahkan atau dikurangkan sesuai kebutuhan untuk menghasilkan sistem persamaan akhir yang

The namespaces fvm:: and fvc:: allow for the evaluation of a variety of operators implicitly and explicitly, respectively.
The explicit operator fvc, named “finite volume calculus,” returns an equivalent field based on the actual field values. For example, the operator fvc::div(φ) returns an equivalent geometric field in which each cell contains the value of the divergence of the variable φ.
In contrast, the fvm implicit operator defines the implicit finite volume discretization in terms of matrices of coefficients. For example, fvm::laplacian(φ) returns an fvMatrix in which all the coefficients are based on the finite volume discretization of the Laplacian.
The role of the fvm:: and fvc:: operators is to construct the LHS and RHS of a system of equations representing the discretized form of Eq. (5.43) over each element in the mesh. The discretization process yields a system of equations that can be represented in the matrix form shown in Fig. 5.19. Each row of the system represents the discretized equation in one element, with the off-diagonal coefficients representing the mutual influence of the neighboring elements.
In OpenFOAM®, the matrix of coefficients is stored in a class named lduMatrix and the specialized fvMatrix. The chosen storage format of the coefficients is based on the ldu sparse format, in which all coefficients are stored in three main arrays: diagonal, upper, and lower. The diagonal coefficients are thus stored in one array accessed by the diag() function with its dimension being equal to the number of elements in the computational domain. The upper and lower coefficients are stored each in an array as shown in Fig. 5.20. The source or the right-hand side is stored under a specific vector called source with its dimension being also equal to the number of cells over the computational domain.

Perlu dicatat bahwa meskipun fvMatrix didefinisikan sebagai “template”, spesialisasi vektor dari kelas tersebut tidak mengimplikasikan bentuk matriks yang terkait secara blok, melainkan hanya vektor persamaan skalar yang dipecahkan dalam pendekatan terpisah standar. Hal ini dikonfirmasi oleh kode yang didefinisikan di dalam kelas fvMatrix yang ditunjukkan dalam Listing 5.2, di mana fungsi anggota-nya mengembalikan koefisien vektor diagonal dari matriks, hanya mengembalikan sebuah medan skalar independen dari tipe template.

Lebih banyak detail tentang teknik penyimpanan koefisien yang digunakan dalam uFVM dan OpenFOAM® akan disajikan di Bab 7.