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.

Kurulum dosyasini indirdikten sonra assagidaki adimlari takip etmelisiniz.















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:

TAMAM
diyoruz.

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

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

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

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




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


İşletim Sistemi yükleme ekranı

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

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

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.

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

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

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

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

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

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



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

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

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

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.

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.

Standard Emacs giriş ekranı.

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.

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

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

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.

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ı.

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

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

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

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!

İlk Basilisk simulasyonumuz tamamlandı.

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

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.

Tekrar derledigimizde,

İ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ı

bu, kutumuzu koordinat sisteminin orijininde ortalayacaktır.

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.

Tekrar compile edip sonuca bakıyoruz.

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

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

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

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

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

Ç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.

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

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

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

Bu komutu kullanalım.

İlk animasyonumuzu elde ettik.

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.

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

Log’u bukomutla açabiliyoruz.

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

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

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

İ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.

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

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

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

Hata giderildi. Hadi compile edelim!

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

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.



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.

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.

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.

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

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

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

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

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ı.

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?

İ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,

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:

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.