BASILISK Klavuzu

Kurulum

Bilgisayariniza BASILISK programinin Linux versiyonunu kurabilmek icin ORACLE VirtualBox uzerine Ubuntu kurmak uygun olacaktir.

VirtualBox kurulumu icin assagidaki adimlar takip edilmelidir:

VirtualBox sayfasindan uygun versiyonu indirmelisiniz.

../../../../_images/VB1.png

Kurulum dosyasini indirdikten sonra assagidaki adimlari takip etmelisiniz.

../../../../_images/VB2.png ../../../../_images/VB3.png ../../../../_images/VB4.png ../../../../_images/VB5.png ../../../../_images/VB6.png ../../../../_images/VB7.png ../../../../_images/VB8.png ../../../../_images/VB9.png ../../../../_images/U1.png ../../../../_images/U2.png ../../../../_images/U3.png ../../../../_images/U4.png ../../../../_images/U5.png ../../../../_images/U6.png ../../../../_images/U7.png

Yeterli alanınız varsa 20 GB olacak şekilde ayarlamanız önerilir. Burada Ubuntu’nun sitesinden indirilen işletim sistemi dosyasını seçiyoruz. Ubuntu Desktop için .iso dosyasi indirirken, LTS (Long Term Support) ozelliği olan bir version secmek dogru olacaktir.

Iso dosyasinin yerini Oracle VM BirtualBox programina assagidaki gibi gosterebilirsiniz:

../../../../_images/U8.png

TAMAM diyoruz.

../../../../_images/U9.png

VM VirtualBox kurulduktan sonra New ‘a tıklıyoruz. Acilan ekranda Ubuntu kurulumunu assagidaki gibi gerceklestirebilirsiniz.

../../../../_images/U10.png

Gelen ekranda otomatik olarak Install ubuntu gelebilir ya da reismdeki gibi olabilir. Ona tıklıyoruz.

../../../../_images/U11.png

İşletim sistemi dilini hangi dilde kullanmak istiyosak seçiyoruz.

../../../../_images/U12.png

Klavye dilini seçiyoruz alttaki boşluğa yazarak klavye dilini deneyebilirsiniz.

../../../../_images/U13.png ../../../../_images/U14.png ../../../../_images/U15.png ../../../../_images/U16.png

Bilgisayar ismini hesap ismini ve şifremizi tanımlıyoruz.

../../../../_images/U17.png ../../../../_images/U18.png

İşletim Sistemi yükleme ekranı

../../../../_images/U19.png

Yükleme işi tamalandığında Restart Now’a tıklıyoruz.

../../../../_images/U20.png

Görüntü ayarlarını değiştrime zamanı. Masaüstüne sağ tıklıyoruz Display Settings e basıyoruz.

../../../../_images/U21.png

Resolution’dan istenen ekran kalitesini seçiyoruz.

EMACS kurma zamanı: Komutu görüldüğü gibi yazıyoruz. Linux uzerinde terminalden calisirken dosyalara yasmak icin EMACS programini kullanabilirsiniz.

../../../../_images/E1.png

Şifremizi istiyor giriyoruz Klavyemizde Enter tuşuna basıyoruz.

../../../../_images/E2.png

Klavyemizde Y tuşuna basıp Enter tuşuna basıyoruz

../../../../_images/B1.png

Basilisk’I tarball olarak kurmak için gösterilen komutu yazıyoruz.

../../../../_images/B2.png

Yükleme işi tamamlandıktan sonra dosyayı açabilmek için en alttaki komutu yazıyoruz.

../../../../_images/B3.png

Compilerı kurma zamanı. Yazılan komutları giriyoruz.

../../../../_images/B4.png

Compilerın kurulma aşaması için make -k yazıyoruz ancak hata veriyor. Verilen hatadaki çözümmleri uygulayalım.

../../../../_images/B5.png ../../../../_images/B6.png ../../../../_images/B7.png

Tekrar deniyoruz ve yine çalışmıyor.

../../../../_images/B8.png

make komutunu kurabilmek için yukarıdaki kodu yazıyoruz.

../../../../_images/B9.png

Ayrıca Basilisk’I kullanırken ihtiyacımızın olacağı komutları da kuruyoruz.

../../../../_images/B10.png

Her şey hatasız giderse klavede Y tuşuna basıp Enter tuşuna basıyoruz.

Kurulum aşamamız bitti.

Başlangıç

Eğitimden daha fazla yararlanabilmek için en azından minimum düzeyde kabuk komutları bilgisine sahip olmanızı öneririm. Bu konuyla ilgili birçok çevrimiçi eğitimden biriyle başlamak isteyebilirsiniz.

../../../../_images/Bas1.png

Bu komutu kullanarak Emacs’I başlatabilirsiniz. Komutun sonundaki & işareti Emacs üzerinden değişiklik yaparken terminale de Emacsı kapatmadan erişebilmenizi sağlar.

../../../../_images/Bas2.png

Standard Emacs giriş ekranı.

../../../../_images/Bas3.png

Bu komutla derleyicinin güncel olup olmadığını kontrol edebilirsiniz. Ayrıca derleyiciyi yüklerken hata yaptıysanız burda da hata mesajı alacaksınız.

İlk Simulasyon

Artik BASILISK programini calistirabiliriz.

../../../../_images/S1.png

Emacs’ın giriş ekranından File > Visit New File’a tıklayın.

../../../../_images/S2.png

Burası bizim ilk kodumuzu kuracağımız dosya. Name ksımının yanına bump.c yazıp Enter’a basın.

../../../../_images/S3.png

Yukarıdaki gibi önümüze açılan boş sayfaya bu konutu yazın. Tahmin edeceğiniz üzere simülasyon yapılırken hesaplamalar saint-venant prensibiyle yapılacak.

../../../../_images/S4.png

Ozaman ilk simulasyonu yapabiliriz. Terminal’e qcc bump.c yazdık ama çalışmadı çünkü kullanmak istediğimiz fonksiyonlar genelde math.h kütüphanesinin içerisinde. Ayrıca kodda main fonksiyonu tanımlanmadı.

../../../../_images/S5.png

run() komutu simulasyonun çalışmasını sağlayan fonskiyon.

../../../../_images/S6.png

Terminal’e qcc bump.c yazdık ama çalışmadı çünkü kullanmak istediğimiz fonksiyonlar genelde math.h kütüphanesinin içerisinde.

../../../../_images/S7.png

Hatayı düzeltmek için kodun sonuna -lm yazıyoruz. Math.h kütüphanesi gerekmeden kod hatsız bir şekilde compile oluyor.

../../../../_images/S8.png

Terminal’e ls yazdığımızda içinde bulunduğumuz dosyanın içindeki dökümanlar listeleniyor. a.out diye yeni bir dosya oluşmuş. Hadi onu açalım!

../../../../_images/S9.png

İlk Basilisk simulasyonumuz tamamlandı.

../../../../_images/S10.png

burada -O2 optimizasyonu açar (bu, kodu daha hızlı hale getirir), -Wall tüm derleme uyarılarını açar (bu, programınızdaki olası hataları yakalamanıza olanak tanır) ve -o bump, derlenen programı bump (a.out yerine) olarak yeniden adlandırır.

Daha Gelişmiş bir Program

../../../../_images/G1.png

Burada yaptığımız şey, çözücüye 10 zaman adımı yapması ve ardından 10 zaman adımından sonra ulaştığı zaman adımı sayısını ve ulaştığı fiziksel zamanı yazdırması söylenir.

../../../../_images/G2.png

Tekrar derledigimizde,

../../../../_images/G3.png

İlk satır kodumuzdan gelir ve ikinci satır basilisk’in varsayılan çıktısıdır. Gerçekleştirilen zaman adımlarının sayısını, hesaplama için kullanılan CPU zamanını, geçen gerçek zamanı, karşılık gelen hesaplama hızını (gerçek zamana dayalı olarak) ve çözücü tarafından tahsis edilen toplam alan sayısını verir.

Başlangıç Koşulları

../../../../_images/K1.png

bu, kutumuzu koordinat sisteminin orijininde ortalayacaktır.

../../../../_images/K2.png

Init event sadece simülasyonun başlangıcında gerçekleşecektir (t=0). Olayın gövdesi içinde, h alanının (Saint-Venant çözücüsünde tanımlandığı ve belgelendiği şekliyle sıvı katmanın derinliği) değerlerini ayarlamak için Basilisk’e özgü foreach iterator’ı kullanırız. Karakteristik yarıçapı 1/sqrt(200), genlik 1, sabit derinlik 0.1 olan bir katmanın üstünde olan bir Gauss tümseği kullanıyoruz. x ve y koordinatları, foreach operatörü tarafından örtük olarak tanımlanan çift değerlerdir.

../../../../_images/K3.png

Tekrar compile edip sonuca bakıyoruz.

../../../../_images/K4.png

Kodumuzu resim çıktısı alabilecek şekilde güncelledik.

../../../../_images/K5.png

Tekrar compile ettiğimizde sonuç garip çıkıyor. Ancak bu çok normal çünkü grafiksel olması gereken çıktıyı karakter olarak almaya çalışıyoruz.

../../../../_images/K6.png

Çıktıyı o zaman resim dosyası na dönüştürme zamanı

../../../../_images/K7.png

.ppm şeklindeki resim dosyalarını açabilmek için gerekli kod.

../../../../_images/K8.png

Artık çıktımızı açma zamanı.

../../../../_images/K9.png

Çok küçük olmasına ragmen bir görüntü alabildik. Bunun sebebi grid’in otomatik olarak 64x64 seçilmesi yani görüntü kalitemiz küçük. Bunu ilerde arttıracağız. Ayrıca 10 timestepi boşluk tuşuna basarak görebiliriz.

../../../../_images/K10.png

Timestep sayısını 10 dan 300 e çıkararak daha uzun bir simulasyon elde edebileceğiz.

../../../../_images/K11.png

Compile edip resime dönüştürüp çalıştıralım.

../../../../_images/K12.png

300 tane resimimiz var sürekli boşluk tuşuna basamayız oyüzden animasyon haline getirmemiz gerek.

../../../../_images/K13.png

Bu komutu kullanalım.

../../../../_images/K14.png

İlk animasyonumuzu elde ettik.

../../../../_images/K15.png

Zamanın fonksiyonları olarak minimum ve maksimum derinliklerin değişimi ile ilgilendiğimizi varsayalım.

İlk satırda, s yapısını h alanındaki istatistiklerle dolduran Basilisk’in statsf() fonksiyonunu çağırıyoruz. İkinci satırda, standart C dosyası stderr’de süreyi, minimum ve maksimumu (h) yazmak için standart C fonksiyonu fprintf() kullanıyoruz. stderr, “standart hata” anlamına gelir ve varsayılan olarak ekran alınır.

../../../../_images/K16.png

Compile edelim. Bu sefer elimizde istatistik verileri de var. onları da log dosyasına atacağız.

../../../../_images/K17.png

Log’u bukomutla açabiliyoruz.

../../../../_images/K18.png

Bu komut sayesinde verilerimizi grafiğe dökebileceğiz.

../../../../_images/K19.png

Bu komutlarla birlikte grafikte x çizgisinin başlığı, y çizgisinin başlığı, ve grafiklerin neyi temsil ettiği gösterilecek.

../../../../_images/K20.png

Komutlar yazıldıktan sonra çıkan pencere.

../../../../_images/K21.png

İlk animasyonumuz küçük kalmıştı. Init_grid(256) sayesinde animasyonumuz 64x64 grid noktasına değil 256x256 tane grid noktasına sahip olacak (4x4=16 kat daha yüksek çözünürlüklü).

Aynı şekilde compile edip resme çevirip animate komutunu yazıyoruz. Daha yüksek çözünürlüklü olduğu için daha büyük bir pencere elde ediyoruz. Ayrıca bilgisayarın hesaplaması daha uzun sürecek.

../../../../_images/K22.png

Bu komutla birlikte simulasyonun yapılması için harcanan zamanın 16.78 olduğunu görüyoruz.

../../../../_images/K23.png

Simulasyonun hesaplanma süresini düşürmek adına quadtree grid’inden daha basit bir grid olan cartesian grid’e geçiyoruz.

../../../../_images/K24.png

Kütüphane tanımlama kodunu yanlış yere yazdığımdan dolayı hata aldım. En üste yazılması gerekiyor.

../../../../_images/K25.png

Hata giderildi. Hadi compile edelim!

../../../../_images/K26.png

Burdan anlaşılacağı üzere simülasyonun hesaplanması için harcanan zaman 16.78 den 9.44 e düşüyor.

../../../../_images/K27.png

Zaman adımı 3 boyutlu çözünürlük tarafından kontrol edildiğinden, fiziksel sonuçların zaman adımı sayısı olarak ifade edilen düzenli aralıklarla çıktısını almak genellikle iyi bir fikir değildir. Sonuçların fiziksel zaman birimleriyle ifade edilen aralıklarla çıktısını almak daha mantıklıdır.

Örneğin, bizim durumumuzda, ilk simülasyonumuzun yaklaşık t=4 (ilk grafiğe bakın) bir süreye ulaştığını ve oluşturduğumuz 300 görüntünün dalga yayılımının güzel bir animasyonunu elde etmek için yeterli olduğunu biliyoruz. Ancak, bu sonuçları daha yüksek çözünürlükte çoğaltmak istiyorsak, programımızı bu şekilde değiştirmemiz gerekiyor.

../../../../_images/K28.png ../../../../_images/K29.png ../../../../_images/K30.png

Piklerin ve süreksizliklerin daha yüksek çözünürlükte kesinlikle daha keskin olduğunu görüyoruz. Grafiklerin diğer kısımları oldukça yakın olmasına rağmen, tepelerin genliklerinin yakınsak (convergant) olup olmadığını görmek için daha da yüksek bir çözünürlük denemek isteyebiliriz.

../../../../_images/K31.png

Animasyon ve grafiklerden, incelediğimiz dalgaların karakteristik ölçeklerinin sabit olmadığı hissini sezgisel olarak alıyoruz. Bazı alanlar çok düzgün ve hiçbir belirgin özelliği yok, diğer alanlar ise ince ayrıntılar içeriyor (örneğin etkileşen şoklar). Açıkçası, her yerde yüksek çözünürlüğe ihtiyaç duyulmaz ve çözünürlük çözüme uyarlanırsa hesaplama muhtemelen daha hızlı yapılabilir. Bu değişken çözünürlüğün de hareketli ayrıntıları takip etmek için zaman içinde gelişmesi gerekir.

../../../../_images/K32.png

Basilisk’e çözünürlüğü h alanının (dalgacık tahmini) ayrıklaştırma hatasına göre uyarlamasını söyledik. Bu uyarlama her zaman adımında (i++) yapılır. Ayrıklaştırma hatası 4e-3 tenda ha büyük olduğunda, mesh, maksimum 8 dörtlü ağaç seviyesine kadar iyileştirildi.

../../../../_images/K33.png

Çıkan sonucun kalitesi düştü. Simulasyon hesaplama süresi de düştü.

../../../../_images/K34.png

Bunun yerine bilinear enterpolasyonu kullanmak için output_ppm() fonksiyonunu böyle çağırmamız gerekir.

../../../../_images/K35.png

Görüntü kalitesi çok daha iyi.

../../../../_images/K36.png

Simulasyon hesaplama süresi gördüğünüz üzere 1.66 ya düştü.

../../../../_images/K37.png

Peki alınan verilerin kalitesine ne oldu? Bunu gözlemlemek için gnuplot kullanalım. Eski verileri log.64 diye kaydettik. Yeni veriler log olarak kayıtlı.

../../../../_images/K38.png

Gördüğünüz üzere sonuç çok yakın ama tamamen aynı değil. Hesaplama süresi ve doğruluk arasındaki doğru dengeyi bulmak, sayısal simülasyonları kurmanın önemli bir parçasıdır.

Animasyonumuz şimdi iyi görünse de, ilk animasyonda (kısmen) kodlanmış olan ızgara boyutu hakkındaki bilgileri kaybettik. Simülasyon sırasında kullanılan ızgaranın bir animasyonunu oluşturabilir miyiz?

../../../../_images/K39.png

İlk önce yeni bir skaler alan l ilan edip allocate ediyoruz. Bu alan lokal, otomatik bir değişkendir, yani yalnızca images event’i içinde erişilebilir olacaktır. Alan değerlerini saklamak için gerekli olan bellek, kod bu fonksiyondan çıktığında otomatik olarak boşaltılacaktır.

Daha sonra tüm hücreler üzerinde dolaşıyoruz ve l değerlerini hücrenin düzeyine ayarladık.

Sonraki satır, statik bir değişken, yani görüntülere yapılan çağrılar arasında (otomatik değişkenlerin aksine) bellekte tutulan bir değişken bildirir. Bu değişken yalnızca bir kez ayarlanır, ilk görüntüler çağrıldığında ve içine şeyler yazacağımız (“w”) grid.ppm adlı yeni bir dosyaya işaret eder. Bu, standart C fonksiyonu fopen() kullanılarak yapılır.

Terminal’e animate grid.ppm yazıldığında,

../../../../_images/K40.png

Elde edilen sonuç.

Macro’ları kullanalım

Örneğimizin sayısal converge etmesini biraz daha irdelemek iyi bir fikir olacaktır. Bunu yapmak için çözünürlüğü değiştirirken aynı kodu çalıştırmamız gerekiyor. Kodu elle düzenleyebilir, her referansı çözümleme, yeniden derleme, yeniden çalıştırma vb. olarak değiştirebilirdik ama bu oldukça sıkıcı ve hataya açık olurdu. Bunu yapmanın daha iyi bir yolu, standart C makrolarını (hazırlık çalışmanız sırasında zaten karşılaşmış olmanız gereken) kullanmaktır.

Kodumuza bakarsak, çözünürlük veya iyileştirme seviyesinin üç kez gerçekleştiğini görürüz. Bir kez output_ppm() argümanı olarak, bir kez adapt_wavelet() argümanı olarak ve bir kez de main() işlevinde init_grid() argümanı olarak.

Bu üç değeri manuel olarak değiştirmek yerine:

../../../../_images/K41.png

Bu kodları yazabiliriz.

Tek bilmeniz gereken, makro seviyesi her üç yerde de 8 ile değiştirilecektir. Simülasyonun çözünürlüğünü değiştirmek istiyorsak, şimdi tek yapmamız gereken dosyanın üstündeki tek değeri değiştirmek.