Gmsh projesi 1996 yılında sonlu eleman temelli çözücüler için kullanıcı dostu bir 3 Boyutlu hesaplama örgüsü oluşturma ve elde edilen çözüm sonuçlarını değerlendirmeye yönelik olarak bileşik önişlem ve sonişlem yazılımı meydana getirebilmek gâyesi ile başlatılmıştı ki o dönem için geometri motoru, örgü üretici ve sonişlemci yeteneklerini birarada sunan açık-kaynak bir ürün mevcut değildi.
Unix tabanlı ilk sürüm 1998'de yayınlandıktan sonra gelişme devam etti, 2003'de C++ ile yazılmış durumdaki bütün kaynak kodu GNU-GPL lisansı ile yayınlandı. 2006-2007'de toplam kodun yaklaşık yarısı yeniden yazılarak 2.0 sürümü yayınlandı ve bu arada yaygın bütün işletim sistemleri birlikte desteklenmeye başlandı.
Bugün itibarı ile 3.0.6 sürümdeki Gmsh, BDM1 alanında bilhassa açık-kaynak önişlem ihtiyaçlarının karşılanmasında çok değerli bir katkı sağlamakta ve dünya çapında gerek akademik gerekse sanayi çevrelerince yaygın olarak kullanılmaktadır ama diğer taraftan Türkiye için aynı durumun geçerli olduğunu söyleyebilmek de biraz zordur.
Mevzuya ilgi ve ihtiyaç duyabilecek genç mühendisler ve mühendis adaylarına Gmsh'nin oldukça gelişkin yeteneklerini biraz olsun tanıtabilmek ve başlangıç seviyesinde iken yazılıma biraz daha kolay nüfûz edebilmelerini sağlamak için bu ve muhtemelen takip edecek bâzı örneklerin sunulması belki faydalı olabilirdi, kim bilir...
Lâfı daha fazla uzatmaya gerek yok, doğrudan konuya girelim. Bu bölümde Deniz Mühendisliği uygulamalarında sıklıkla rastlanan eksensimetrik örgü ihtiyaçlarının kolayca karşılanabilmesi ve OpenFOAM adlı açık-kaynaklı HAD2 yazılımı ile birlikte nasıl kullanılabileceği, uygulamalı bir örnek ile açıklanmaya çalışılacaktır.
Daha önce hakkında bazı hesaplamalı değerlendirmelerin yayınlandığı meşhur doğrulama çalışmalarından 6:1 Uzatılmış Küre geometrisinin ve ihtiyaca uygun bir hesaplama örgüsünün Gmsh ile oluşturulması söz konusu olacaktır.
Gmsh çağdaş bir Grafik Kullanıcı Arayüzü ile çalışmaktadır ve bu doğrultuda herhangi bir BDT3 yazılımı gibi işletilebilir. Bununla birlikte yazılımı C++'a benzer bir yapıya sahip olan kendi betik dili ile birlikte doğrudan kodlayarak kullanmanız şiddetle tavsiye edilir. Böyle bir çalışma yaklaşımı ilk seçeneğe göre çok daha verimli olmaktadır.
Bu durumda aşağıdaki örneği kullanabilmek için ilk olarak "deneme2B.geo" gibi bir isim verilebilecek boş bir metin dosyası oluşturarak çalışmaya başlanabilir. Bu dosyayı herhangi bir metin düzenleyici ile düzenlemeniz gerekecek, düzenleyici olarak şahsen gedit tavsiye edilebilir ama çok sayıda başka iyi seçenek de mevcuttur.
2 Boyutlu Düzenli Örgü
Önce 6:1 uzatılmış küre (elipsoit) geometrisi ve 2B düzenli hesaplama örgüsü gösterilecektir. Aşağıdaki kısa Gmsh betiği söz konusu ihityacın tamamını karşılamaktadır. Dolayısı ile ilk olarak bu betiği olduğu gibi kopyalayıp deneme2B.geo dosyası içine yapıştırmanız gerekir. İkinci safhada bu .geo dosyasını Gmsh ile açmanız yeterli olacaktır.
♦ gmsh: // 6:1 "Uzatılmış Küre" (elispsoit) geometrisi ve OpenFOAM için // 2B eksensimetrik hesaplama örgüsü oluşturma betiği numunesi // Tf (Transfinite) algoritması ile tam düzenli örgü oluşturma // Üsküdar Mühendishanesi - http://uskudar.biz // Temel veri girişi r1 = 0.2; // kısa yarıçap, metre - eliposit çapı = 0,4m oran1 = 6; // elips çap oranı - elipsoit uzunluğu = 2,4m oran2 = 23; // sınır yarıçapının cisim uzunluğuna oranı dx = 121; // uzunluk yönünde (çeyrek elips) düğüm sayısı dy = 55; // yarıçap yönünde düğüm sayısı px = 0.025; // örgünün uzunluk yönünde doğrusal olmayan dağılımı için py = 0.175; // örgünün yarıçap yönünde doğrusal olmayan dağılımı için // Buradan sonrasına müdahâle etmeye pek gerek yok! r2 = oran1 * r1; // uzun yarıçap R1 = oran2 * r2; // y+ için kerteriz // Re=4,2e06 - L=2,4m - y+=50 için deltay=0.0007544; // y+ ~50 için ilk hücrenin duvara mesafesi, metre Point(999)= {0, r1+deltay, 0, 1}; // y+ ~50 için vasatta kerteriz noktası Point(0) = {0, 0, 0}; // merkez noktası Point(1) = {-r2, 0, 0}; Point(2) = {0, r1, 0}; Point(3) = {r2, 0, 0}; Point(4) = {-R1, 0, 0}; Point(5) = {R1, 0, 0}; Point(6) = {0, R1, 0}; Ellipse(10) = {1,0,1,2}; // sol çeyrek Ellipse(11) = {3,0,3,2}; // sağ çeyrek Circle(20) = {4,0,6}; // sol çeyrek Circle(21) = {6,0,5}; // sağ çeyrek Line(30) = {1,4}; // sol eksen hattı Line(31) = {2,6}; // merkez hattı Line(32) = {3,5}; // sağ eksen hattı // Sol çeyrek düzenli örgüsü Transfinite Line(10) = dx Using Progression 1; Transfinite Line(20) = dx Using Progression 1-px; Transfinite Line(30) = dy Using Progression 1+py; Transfinite Line(31) = dy Using Progression 1+py; Line Loop(50) = {10,-30,-20,31}; Plane Surface(100) = {50}; Transfinite Surface(100) = {2,1,4,6}; Recombine Surface(100); // Sağ çeyrek düzenli örgüsü Transfinite Line(11) = dx Using Progression 1; Transfinite Line(21) = dx Using Progression -1-px; Transfinite Line(32) = dy Using Progression 1+py; Transfinite Line(31) = dy Using Progression 1+py; Line Loop(51) = {-11,32,-21,-31}; Plane Surface(101) = {51}; Transfinite Surface(101) = {2,3,5,6}; Recombine Surface(101); // Oluşturulan 2B yüzeyin -2,5derece döndürülmesi için. // Dönüş açıları gmsh'ye radyan olarak verilmeli! Rotate { {1,0,0} , {0,0,0} , -Pi/72 } { Surface{101,100}; } // Döndürülmüş yüzeyin +5derece çekilerek düzenli örgünün elde edilmesi // Böylece aşağıda Layers komutu ile tanımlandığı üzere {1} hücre // genişliğinde "sahte 3B" bir hesaplama hacmi oluşturulabiliyor. Extrude { {1,0,0} , {0,0,0} , Pi/36 } { Surface{101,100}; Layers{1}; Recombine; } // OpenFOAM için isimlendirmeler Physical Volume ("hava") = {1,2}; Physical Surface ("cisim") = {109,126}; Physical Surface ("girişÇıkış") = {113,133}; Physical Surface ("sancak") = {100,101}; Physical Surface ("iskele") = {118,135};
Yukarıdaki betik Gmsh ile açıldıktan sonra soldaki ağaçtan;
> Modules > Mesh > 3D
ile örgü oluşturabilir ise sonuç aşağıdaki [Resim.1]'de görüldüğü gibi olacaktır. Buradaki örgü elipsin boyuna simetri ekseni etrafında 5° bir kama oluşturmaktadır. Daha sonra hesaplama için kullanılacak olan OpenFOAM yazılımı doğrudan 2B desteğine sahip olmadığından, 2 Boyutlu hesaplama yapabilmek için tek hücre genişliğinde bir 3B örgü oluşturmak ve sınır şartlarını duruma uygun bir şekilde ayarlamak gereklidir.

Resim.1) 6:1 Elipsoit için 2 Boyutlu eksensimetrik düzenli örgüsünün genel hesaplama ortamı görünüşü.
Bu durumda, örnek olarak verilen ayarlar ile eksensimetrik bir akış modellemesi yapılacağı için sahte 2B örgünün simetri ekseninde 0 genişliğinde bir kama şeklinde oluşturulması şarttır.
Mevcut örgünün yarım elips civarındaki ve vasatta sınır tabaka yakınında görüntüsü ise [Resim.2] üzerindeki gibi gerçekleşir. 999 adlı nokta örgü oluşturma safhasının başlangıcında ve mevcut akış şartlarında (Re= 4,2e06) y+ değerinin 50 civarında gerçekleşebilmesi için ilk düğüm noktasının yerini daha kolay ayarlayabilmek için bir kerteriz olarak kullanılmıştır.

Resim.2) 6:1 Elipsoit için 2 Boyutlu eksensimetrik düzenli örgüsünün yakın görünüşü ve sınır tabaka civarı.
deneme2B.geo üzerindeki muhtelif değişkenler ile farklı örgüler elde edebilmek mümkündür. Bu durumda .geo dosyasında ihtiyaç duyulan değişiklik yapıldıktan sonra;
> Modules > Geometry > Reload script
ile betik tekrar yüklenir ve tekrar örgü oluşturulur, istenen hedefe ulaşılana kadar işlem devam eder... Sonuç uygun görüldüğünde;
> File > Save Mesh
ile kendiliğinden "deneme2B.msh" olarak adlandırılan nihai hesaplama örgüsü ihraç edilir. Bu safhadan sonra söz konusu örgü, çalışmanın yapılacağı OpenFOAM dizini içine taşınır.
Önce "system/controlDict" dosyasının içinde aşağıda gösterilen [satır.26 ve 27] gerekli düzeltme yapılmalıdır, aksi taktirde kama yüzeylerinin düzlem hassasiyeti konusunda sıkıntı yaşanır:
♦ OpenFOAM: /*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / O peration | Version: 2.3.1 | | \\ / A nd | Web: www.OpenFOAM.com | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ FoamFile { version 2.0; format ascii; class dictionary; location "system"; object controlDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // application simpleFoam; startFrom latestTime; startTime 0; stopAt endTime; endTime 2500; deltaT 1; writeControl timeStep; writeInterval 500; purgeWrite 0; writeFormat binary; // öntanımlı ascii ama wedge için mutlaka binary olmalı! writePrecision 6; // bâzı durumlarda yükseltmek gerekebilir! writeCompression off; timeFormat general; timePrecision 6; runTimeModifiable true; // ************************************************************************* //
Şimdi çalışma dizini içine uçbirim ile girilerek aşağıdaki komut çalıştırılır:
♦ Uçbirim: gmshToFoam deneme2B.msh
Artık örgü OpenFOAM içine ithâl edildi ama hâlen bâzı düzenlemelere ihtiyaç var. İlk olarak "constant>polyMesh" içindeki boundary dosyası bir metin düzenleyici ile aşağıdaki şekilde ayarlanır:
♦ OpenFOAM: /*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / O peration | Version: 2.3.1 | | \\ / A nd | Web: www.OpenFOAM.org | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ FoamFile { version 2.0; format binary; class polyBoundaryMesh; location "constant/polyMesh"; object boundary; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // 4 ( cisim { // type patch; // patch wall ile değiştirilmeli // physicalType patch; // patch wall ile değiştirilmeli type wall; physicalType wall; nFaces 240; startFace 25626; } girişÇıkış { type patch; physicalType patch; nFaces 240; startFace 25866; } iskele { // type patch; // patch wedge ile değiştirilmeli // physicalType patch; // patch wedge ile değiştirilmeli type wedge; physicalType wedge; nFaces 12960; startFace 26106; } sancak { // type patch; // patch wedge ile değiştirilmeli // physicalType patch; // patch wedge ile değiştirilmeli type wedge; physicalType wedge; nFaces 12960; startFace 39066; } ) // ************************************************************************* //
Nihâyet ithâl edilip ayarlanan hesaplama örgüsünün sağlığına bir göz atılabilir:
♦ Uçbirim: checkMesh
Eğer başlangıçtaki betik değiştirilmediyse sonuç şöyle olmalı:
♦ Uçbirim: Time = 0
Mesh stats
points: 26400
internal points: 0
faces: 52026
internal faces: 25626
cells: 12960
faces per cell: 5.99167
boundary patches: 4
point zones: 0
face zones: 0
cell zones: 1
Overall number of cells of each type:
hexahedra: 12852
prisms: 108
wedges: 0
pyramids: 0
tet wedges: 0
tetrahedra: 0
polyhedra: 0
Checking topology...
Boundary definition OK.
Cell to face addressing OK.
Point usage OK.
Upper triangular ordering OK.
Face vertices OK.
Number of regions: 1 (OK).
Checking patch topology for multiply connected surfaces...
Patch Faces Points Surface topology
cisim 240 480 ok (non-closed singly connected)
girişÇıkış 240 480 ok (non-closed singly connected)
iskele 12960 13255 ok (non-closed singly connected)
sancak 12960 13255 ok (non-closed singly connected)
Checking geometry...
Overall domain bounding box (-27.6 0 -1.2039) (27.6 27.5737 1.2039)
Mesh (non-empty, non-wedge) directions (1 1 0)
Mesh (non-empty) directions (1 1 1)
Wedge iskele with angle 2.5 degrees
Wedge sancak with angle 2.5 degrees
All edges aligned with or perpendicular to non-empty directions.
Boundary openness (5.37693e-18 4.15942e-17 7.35153e-16) OK.
Max cell openness = 4.86221e-16 OK.
Max aspect ratio = 67.4849 OK.
Minimum face area = 6.81425e-07. Maximum face area = 9.09215. Face area magnitudes OK.
Min volume = 3.49593e-09. Max volume = 3.53743. Total volume = 1221.5. Cell volumes OK.
Mesh non-orthogonality Max: 43.9818 average: 12.9738
Non-orthogonality check OK.
Face pyramids OK.
Max skewness = 0.330922 OK.
Coupled point location match (average 0) OK.
Mesh OK.
End
Düzenli bir 2B eksensimetrik hesaplama örgüsünün imalâtı ve OpenFOAM içine ithâl edilmesi böylece tamamlandı. Bundan sonra belirtilen yama isimlendirmelerine ve türlerine göre U, p, nut vs. gibi değişkenlerin de ayarlanması gerekecek ama bu husus yazının kapsamı içinde değil.
3 Boyutlu Düzenli Örgü
Eksensimetrik bir çalışmada akış sadece simetri ekseni doğrultusunda tanımlanabildiğinden örneğin buradaki gibi bir cismin 0dereceden farklı hücum açılarında incelenebilmesi için 3 Boyutlu bir örgü kullanmak gereklidir.

Resim.3) Gmsh kullanılarak yarım elipsoit geometrisi üzerine inşa edilen düzenli hesaplama örgüsünün cisim civarındaki görünüşü.
Bu durumda yukarıdaki deneme2B.geo betiği üzerinde küçük bazı değişiklikler yaparak ihtiyaç duyulan, [Resim.3] üzerinde görülebilen gibi 3B bir örgü de kolayca üretilip aynı şekilde OpenFOAM içine ithâl edilebilir. Sadece yama türlerinde 2B durumuna göre bâzı farklar olacaktır.
>> Sonraki Bölüm: Gmsh ile Eksensimetrik Melez Örgü İmâli
|