Kondisi batas gerak mesh
Kondisi batas gerak mesh. Bagian ini mengilustrasikan pembangunan kondisi batas baru yang digunakan untuk pergerakan mesh. Pergerakan mesh bergantung pada perpindahan atau kecepatan yang didefinisikan untuk titik-titik mesh dalam bentuk kondisi batas yang terkait dengan titik-titik batas yang termasuk dalam batas mesh, yang disebut pointPatchField dalam OpenFOAM. Berbeda dengan kondisi batas yang berbasis pada fvPatchField, kondisi batas tipe pointPatchField tidak menyimpan nilai-nilai batas dalam sebuah medan batas, mereka digunakan untuk memodifikasi nilai-nilai medan internal. Perubahan nilai-nilai medan internal dan operasi lainnya ditangani oleh solver atau kelas lain yang menggunakan kondisi batas ini. Besaran vektor yang digunakan oleh kondisi batas pergerakan mesh akan menentukan kecepatan atau perpindahan dari titik mesh tertentu, tergantung pada pilihan solver pergerakan mesh.
Pada bagian ini, solver pergerakan mesh akan menggunakan pustaka dynamicFvMesh, dan dalam contoh simulasi, solver akan memecahkan persamaan Laplace untuk perpindahan titik dengan perpindahan di batas yang didefinisikan oleh kondisi batas baru. Karena persamaan Laplace digunakan untuk memodelkan transportasi difusi, perpindahan yang ditentukan pada batas mesh akan tersebar dengan lancar ke mesh sekitarnya, yang memastikan kualitas yang lebih tinggi dari sel-sel yang terdeformasi. Untuk aplikasi jenis ini, medan yang menyimpan deformasi dari titik-titik disebut pointDisplacement.
Kondisi batas yang disajikan dalam bagian ini membaca posisi dan orientasi pusat gravitasi patch dari file masukan dan menerapkan perpindahan pada batas mesh, dengan memperhatikan posisinya sebelumnya dan harus digunakan bersama dengan mesh dinamis, jika tidak, medan pointDisplacement tidak akan dibaca. Fungsionalitas kondisi batas terdiri dari dua komponen yang ada di OpenFOAM:
1. Menghitung posisi pusat gravitasi (COG) dari patch, yang dihitung berdasarkan gerakan yang ditentukan yang terdapat dalam sebuah kamus. Gerakan yang ditentukan ini harus hadir dalam bentuk tabulasi dan diinterpolasi secara linear antara setiap titik data. Semua ini sudah diimplementasikan dalam tabulated6DoFMotion, yang merupakan kelas dynamicFvMesh yang memindahkan seluruh mesh berdasarkan gerakan yang ditentukan.
2. Memberikan nilai vektor kepada pointPatchField. Salah satu contoh untuk jenis kondisi batas ini adalah oscillatingDisplacementPointPatchVectorField.
Seperti halnya kondisi batas yang berasal dari fvPatchField, hanya nilai-nilai di batas domain yang berubah. Tidak ada perubahan tambahan pada simulasi atau medan yang dilakukan oleh kondisi batas mana pun dan fungsionalitasnya dienkapsulasi dengan cara yang logis. Untuk kondisi batas fvPatchField, variabel medan dihitung oleh solver aliran, menggunakan nilai-nilai batas. Prinsip yang sama berlaku untuk kondisi batas yang berasal dari pointPatchField. Hanya kecepatan atau perpindahan yang ditentukan oleh kondisi batas, sedangkan perubahan mesh aktual dilakukan oleh solver pergerakan mesh yang didedikasikan yang merupakan bagian dari pustaka dynamicFvMesh. Selanjutnya, kedua komponen tersebut akan dijelaskan secara singkat dan bagian yang relevan untuk kondisi batas baru akan ditekankan.
Membaca data gerak
Pencarian singkat dalam basis kode OpenFOAM yang ada mengungkapkan bahwa ada solver pergerakan mesh yang membaca data pergerakan dari file yang ditabulasikan, mirip dengan yang direncanakan untuk kondisi batas ini. Namun, dalam kasus itu, perpindahan yang sama diterapkan pada semua titik mesh, menghasilkan pergerakan mesh yang menggerakkan mesh sebagai benda padat: tidak ada deformasi mesh yang terjadi dan posisi relatif dari titik-titik mesh tidak berubah. Untuk tujuan tutorial ini, perhitungan pergerakan dapat digunakan dan kemudian diterapkan pada titik-titik patch yang membuat batas mesh bergerak sebagai benda padat. Jenis pergerakan mesh seperti ini mungkin bermanfaat ketika pergerakan relatif dari benda kecil dibandingkan dengan mesh (domain aliran). Dalam kasus ini, jika pergerakan dipropagasi ke dalam domain aliran dalam cara yang mirip dengan difusi, pergerakan mesh jauh dari batas dengan perpindahan yang ditentukan akan mendekati nol. Seberapa cepat perpindahan menghilang dari tubuh ditentukan oleh magnitudo koefisien difusi perpindahan.
Kode yang mengimplementasikan pergerakan mesh sebagai benda padat berdasarkan data tabulasi terdapat dalam kelas tabulated6DoFMotionFvMesh yang diturunkan dari solidBodyMotionFunction dan dapat ditemukan di sini:

Ada contoh kasus dalam rilis resmi yang menggunakan tabulated6DoFMotion untuk menentukan pergerakan sebuah tangki tertutup. Tutorial ini dapat ditemukan di sini:

Kamus yang berisi data pergerakan (titik-titik dalam waktu) disusun sebagai daftar (menggunakan struktur data List) yang terdiri dari vektor translasi dan rotasi pada waktu t. Contoh untuk data ini dapat ditemukan di constant/6DoF.dat yang terletak dalam tutorial yang disebutkan di atas. Potongan kode di bawah ini mengilustrasikan prinsip cara kamus disusun.

Interpolasi berbasis spline dilakukan untuk memperoleh data posisi dan orientasi antara titik-titik data dalam kamus. Vektor translasi dan rotasi didefinisikan dengan mengacu pada sistem koordinat asli dan seperti yang ditunjukkan pada gambar 10.8.
Karena bab 13 hanya membahas tentang mesh dinamis, hanya disediakan ringkasan singkat tentang prinsip kerja mesh dinamis tipe solidBodyMotionFvMesh untuk lebih memperjelas:
° mesh dinamis yang berasal dari solidBodyMotionFvMesh hanya menangani pergerakan benda padat,
°tidak ada perubahan topologis yang dapat dilakukan, dan tidak ada patch benda padat yang seharusnya mengubah bentuknya,
°pergerakan itu sendiri tidak ditentukan oleh solidBodyMotionFvMesh, itulah yang dilakukan oleh solidBodyMotionFunction dan kelas turunannya,
°ini menyederhanakan pemisahan perhitungan pergerakan dari algoritma pergerakan mesh aktual,
°kelas tabulatedSixDoF mewarisi dari solidBodyMotionFunction yang merupakan kelas dasar untuk semua fungsi pergerakan benda padat di OpenFOAM.

solidBodyMotionFvMesh diinstansiasi selama konstruksi dynamicFvMesh menggunakan seleksi runtime, jika sebuah mesh dinamis tipe solidBodyMotionFvMesh dipilih dalam dynamicMeshDict. Parameter-partikular dibaca dari sub-kamus dari constant/dynamicMeshDict, yang merupakan atribut kelas pribadi yang disebut SBMFCoeffs_. Bagian-bagian yang relevan dari kode program untuk kondisi batas ini dijelaskan dalam teks berikut.
Membaca data yang ditabulasikan dari sebuah kamus input ditunjukkan dalam listing 58. Data dan nama file dibaca dari sub-kamus dari dynamicMeshDict ke dalam sebuah daftar dari tipe Tuple2. Kelas Tuple2 adalah struktur data yang menyimpan dua objek yang dapat berbeda tipe. Dalam contoh di atas, instansi dari sebuah skalar dan sebuah translationRotationVectors disimpan dalam Tuple2, dengan yang pertama menjadi waktu dan yang kedua vektor yang bersarang, satu untuk translasi dan satu untuk rotasi. Oleh karena itu, isi dari file gerakan disimpan dalam struktur data itu secara langsung. Untuk memberikan akses yang mudah ke data tersebut, daftar terpisah dibuat, seperti yang ditunjukkan dalam setengah bagian terakhir dari potongan kode di atas.
Perhitungan transformasi dari data masukan dilakukan oleh fungsi anggota publik transformation() dan kontennya yang relevan adalah:

Ditampilkan pada listing 59 adalah perintah kedua yang menginterpolasi data posisi dan orientasi untuk waktu saat ini t. Semua sudut harus dikonversi menjadi radian dan akhirnya representasi dari transformasi disusun, menggunakan kuaternion dan septernion.
Tentu saja, pembangunan objek dilakukan melalui konstruktor, yang mengambil dua argumen seperti yang ditunjukkan dalam listing di bawah ini. Argumen pertama adalah referensi ke kamus yang berisi data yang diperlukan oleh tabulated6DoFMotion, yaitu jalur ke file data. Melewati referensi ke Time menyederhanakan interpolasi antara titik-titik data:

Setelah menemukan kode yang bertanggung jawab atas pergerakan titik, langkah selanjutnya adalah mencari kondisi batas yang berasal dari pointPatchField dan melakukan tugas serupa dengan yang kami rencanakan untuk diimplementasikan: dari sini kami berencana untuk membangun kondisi batas kami sendiri.
Mengadaptasi Kondisi Batas yang Ada
Kondisi batas oscillatingDisplacementPointPatchVectorField yang sudah ada merupakan titik awal yang baik untuk menurunkan kondisi batas pergerakan mesh dari. Kondisi ini menerapkan nilai perpindahan sesuai dengan sinusoid yang tergantung pada waktu ke setiap nilai yang disimpan pada titik-titik pada batas. Kode sumber oscillatingDisplacementPointPatchVectorField dapat ditemukan dalam subdirektori fvMotionSolver:

Seperti yang dibahas di awal bab ini mengenai kondisi batas tipe fvPatchField, fungsionalitas sebenarnya dari kondisi batas diimplementasikan dalam fungsi anggota evaluate() atau updateCoeffs(). Dalam kasus kondisi batas oscillatingDisplacementPointPatchVectorField, adalah fungsi anggota updateCoeffs() yang menghitung vektor perpindahan untuk setiap titik dari mesh batas. Vektor perpindahan didefinisikan seperti ini:

dengan kedua amplitude_ dan omega_ merupakan nilai skalar (omega adalah rotasi sudut) yang dibaca dari kamus. Implementasi metode ini dapat dilakukan seperti yang ditunjukkan dalam listing 60.
Garis


Pada metode updateCoeffs(), operator penugasan dari Field digunakan untuk memberikan nilai perpindahan yang tepat ke titik-titik batas dari mesh. Instruksi ini diikuti oleh panggilan ke updateCoeffs() dari kelas induk. Dengan menugaskan perpindahan dari patch ke titik-titik patch, solver mesh dinamis menangani pergerakan mesh yang sebenarnya.
Merakit Kondisi Batas
Anda dapat menemukan versi yang berfungsi dari kondisi batas ini di repositori kode contoh yang didistribusikan bersama dengan buku, yang dikemas bersama dengan kondisi batas kontrol recirculation dari bab sebelumnya ke dalam perpustakaan primerBoundaryConditions. Untuk memudahkan pemahaman, Anda mungkin ingin membuka kode sumber kondisi batas pergerakan mesh siap pakai di editor teks Anda saat mengikuti langkah-langkah yang dijelaskan di sini. Seperti contoh pemrograman lainnya, kondisi batas dari contoh ini harus dikompilasi ke dalam sebuah perpustakaan dinamis menggunakan wmake libso. Seperti biasa, langkah pertama adalah membuat direktori baru untuk menyimpan kondisi batas ini di:

Langkah berikutnya adalah menyalin oscillatingDisplacementPointPatchVectorField ke direktori baru:

Untuk menjaga agar kondisi batas tabulatedRigidBodyDisplacement dinamakan dengan benar, semua kemunculan oscillatingDisplacement harus diganti dengan tabulatedRigidBodyDisplacement. Ini berlaku baik untuk nama file maupun kesesuaian di dalam file sumber itu sendiri. Setelah menghapus file *.dep, file C dan H yang tersisa harus dinamai sesuai.

Hal pertama yang perlu diperiksa adalah apakah oscillatingDisplacementPointPatchVectorField yang telah diubah namanya masih dapat dikompilasi dengan baik. Untuk memeriksa hal ini, file Make/files dan Make/options tipikal OpenFOAM perlu dibuat:

Isinya singkat, karena kondisi batas hanya terdiri dari satu file sumber:

Untuk kesederhanaan, semua kondisi batas contoh yang disediakan dalam repositori kode dikompilasi menjadi satu perpustakaan. Nama perpustakaan ini berbeda dari yang didefinisikan dalam potongan kode di atas.
Namun, file sumber ini memiliki banyak dependensi. Berbagai perpustakaan lain dan file header mereka harus dihubungkan ke perpustakaan ini:


Uji apakah kondisi batas masih dapat dikompilasi, dengan menjalankan perintah wmake libso di direktori yang berisi folder Make. Jika semuanya berhasil dikompilasi tanpa kesalahan dan peringatan, buka kedua file header dan sumber di editor pilihan Anda, lalu terapkan perubahan berikut. Pertama, file header harus disertakan dalam tabulatedRigidBodyDisplacementPointPatchVectorField.H:

Dan file sumber harus menyertakan beberapa file header lainnya:

Implementasi fungsionalitas yang diinginkan dilakukan dalam fungsi anggota updateCoeffs(). Meskipun satu atribut pribadi digunakan di sana yang belum diimplementasikan: sebuah kamus konstan yang berisi semua data yang didefinisikan dalam kamus kondisi batas di direktori 0/. Kamus ini ditambahkan ke atribut pribadi dalam file header:

Setiap konstruktor kondisi batas harus menginisialisasi atribut pribadi baru tersebut, yang biasanya dilakukan dengan memanggil konstruktor nol dari kamus. Sebagai contoh, konstruktor yang mengonstruksi kondisi batas dari titikPatch dan DimensionedField, dan ditunjukkan dalam listing 61. Jika kondisi batas dibangun dengan membaca file tertentu dari direktori 0, konstruktor berikut dipanggil. Sebenarnya, kamus kondisi batas dilewatkan ke konstruktor dan harus disimpan dalam kondisi batas untuk pemrosesan selanjutnya:

Konstruktor ini adalah satu-satunya yang memanggil updateCoeffs() selama konstruksi. Fungsi anggota updateCoeffs ditunjukkan dalam listing 62. Baris paling penting adalah baris yang mendefinisikan SBMFPtr. Ini mengonstruksi autoPtr untuk solidBodyMotionFunction, berdasarkan kamus dan objek Time. Karena kode ini berasal dari perpustakaan dynamicFvMesh, kamus yang dilewatkan ke konstruktor adalah subkamus dari dynamicMeshDict. Subkamus ini berisi semua parameter yang diperlukan oleh solidBodyMotionFunction yang dipilih oleh pengguna dalam dynamicMeshDict. Karena definisi parameter gerakan untuk kondisi batas ini harus dilakukan berdasarkan batas dan bukan berdasarkan global, kamus yang dilewatkan ke konstruktor harus dibaca dari kondisi batas di direktori 0, bukan dynamicMeshDict. Ini adalah apa yang dimaksud dengan anggota pribadi dict_: Itu hanya dibaca sekali dan dilewatkan ke solidBodyMotionFunction dalam setiap panggilan ke updateCoeffs().
Baris berikutnya mirip dengan yang dapat ditemukan dalam tabulated6DoFMotion. Posisi absolut dari titik-titik patch setelah

transformasi diterapkan disimpan dalam vectorIO. Karena pergerakan sebenarnya relatif terhadap posisi titik sebelumnya, perbedaannya harus dihitung yang dilakukan langsung dalam panggilan ke operator penugasan. Transformasi dilakukan menggunakan septernion, yang lebih unggul daripada matriks transformasi dalam banyak hal.
Sekarang bahwa kode sumber telah disiapkan, kompilasilah perpustakaan tersebut lagi

Menjalankan Simulasi dalam Contoh Kasus
Eksekusi simulasi dalam kasus contoh harus dilakukan terlebih dahulu dengan kode yang telah disiapkan dan diuji dari repositori kode contoh. Setelah kode terdistribusi dijalankan, parameter input yang diperlukan dalam kamus, serta modifikasi yang diterapkan pada bidang harus jelas, dan kondisi batas yang diimplementasikan dapat diuji. Kasus contoh tabulatedMotionObject terletak di repositori kasus contoh. Kasus tiga dimensi ini adalah demonstrasi sederhana dari fungsionalitas kondisi batas gerakan benda kaku tabular yang baru diimplementasikan. Gambar 10.9 menunjukkan sketsa pengaturan kasus, termasuk domain kubik dengan volume yang dipotong dari tengah. Batas yang dibuat oleh proses pemotongan ini direpresentasikan oleh patch movingObject.
Batas movingObject akan dipindahkan oleh kondisi batas baru sesuai dengan data yang terdapat dalam file 6DoF.dat di konstanta/. Dibandingkan dengan kasus OpenFOAM dasar, ada file konfigurasi baru yang diperlukan untuk menjalankan kondisi batas baru: file 0/pointDisplacement dan constant/dynamicMeshDict. Nilai awal batas diatur untuk patch movingObject dari bidang pointDisplacement menggunakan kondisi batas baru, seperti yang ditunjukkan dalam listing 63. Untuk menggunakan kondisi batas, instruksi untuk memuat dinamis perpustakaan baru saat runtime perlu ditambahkan ke file konfigurasi system/controlDict. Harap dicatat, jika Anda menggunakan kode yang disajikan dalam bagian ini untuk mengompilasi kondisi batas, perpustakaannya memiliki nama yang berbeda ("libofPrimerBoundaryConditions.so").
dynamicMeshDict diperlukan untuk mengontrol solver pergerakan mesh. Untuk kasus ini, penghalus perpindahanLaplacian digunakan, yang didasarkan pada persamaan Laplace dan menghaluskan perpindahan titik. Jika yang dimaksud selesai, maka bisa dilanjutkan.

Titik-titik di sekitarnya tidak bergerak bersama dengan patch, sel yang berdekatan akan cepat terdeformasi dan hancur. Isi dari dynamicMeshDict ditunjukkan dalam daftar 64.
Simulasi dapat dijalankan dengan mengeksekusi skrip Allrun dalam direktori kasus simulasi. Skrip ini melakukan semua langkah yang diperlukan, seperti pembuatan mesh, untuk menyelesaikan contoh ini tanpa masalah. Utilitas solver moveDynamicMesh hanya memanggil rutinitas mesh dinamis dan tidak melibatkan perhitungan terkait aliran, yang membuatnya relatif cepat dibandingkan dengan solver aliran biasa dengan kemampuan mesh dinamis. Selain melakukan operasi pergerakan mesh, itu juga mengeksekusi banyak operasi terkait mesh.

pemeriksaan kualitas.
Post-processing kasus tersebut cukup mudah dilakukan secara visual: kasus dapat diperiksa di Paraview. Menganimasikan kasus tersebut menunjukkan patch internal berputar dan bergoyang di dalam domain, mirip dengan data yang disediakan dalam file masukan. Memotong domain menjadi dua menggunakan filter Clip dengan opsi Crickle Clip2 menjelaskan beberapa hal menarik terkait mesh dinamis: Cara pergeseran titik yang dikenakan oleh kondisi batas tersebar oleh solver pergerakan mesh. Persamaan Laplace menyebarkan pergeseran ke titik-titik mesh internal, memindahkan titik-titik tersebut sesuai dan menjaga kualitas sel yang baik saat patch bergerak dan berputar. Gambar 10.10 menampilkan gambar posisi patch akhir sebelum dan setelah transformasi.
Ringkasan
Dalam bab ini, desain dan implementasi kondisi batas untuk metode FV dan pergerakan mesh dalam OpenFOAM dijelaskan. Kedua keluarga kondisi batas dimodelkan sebagai dua hierarki kelas yang terpisah, fvPatchField dan pointPatchField, masing-masing. Polimorfisme dinamis memungkinkan ekstensi dan kombinasi yang berbeda dari implementasi yang ada. Dengan kondisi batas diimplementasikan sebagai hierarki kelas bersama dengan bidang yang disimpan di titik-titik mesh internal, perpustakaan OpenFOAM dapat menentukan jenis kondisi batas selama runtime, tanpa perlu mengompil ulang kode setiap kali kondisi batas baru ditetapkan untuk suatu bidang. Mekanisme untuk memuat dinamik
