Yağmurda Koşmak – Bölüm 1

Yağmurda ıslanma miktarımızın yürüyüş hızımızla ilişkili olduğu iddiası arkadaş ortamlarında konuşulabilme ihtimali olan klişe konulardan bir tanesidir. Bende bu konu hakkında bir yazı yazmaya Oğuzhan Başer ile yaptığım bir sohbet sonrasında karar verdim. İki veya üç yazı olarak planladığım bu seriyi akademik analiz sürecine olabildiğince benzer olacak şekilde hazırlamaya çalışacağım. O zaman, basit bir sohbette ortaya atılan bir konunun ne kadar ileri götürülebileceğini görmek istiyorsanız, başlayabiliriz…

“Yağmurda koşan bir insan yürüyene göre daha fazla ıslanır” önermesi gerekli deneyler sonucunda yanlışlanabileceği için özünde bilimsel bir önermedir. Ancak önermenin yeterince detaylı olmadığını söyleyebiliriz. Örneğin, yağmurda koşan insanlar aynı mesafe boyunca mı koşuyorlar? Yoksa aynı süre boyunca mı koşuyorlar? Bilmiyoruz! Bu nedenle bu önermeyi incelemek için aşağıdaki iki soruya cevap verecek deneyleri gerçekleştirmemiz gerekiyor.

  • A noktasından B noktasına farklı hızlarda hareket eden iki kişiden hangisi daha fazla ıslanır?
  • Yağmur altında T süresi boyunca farklı hızlarda hareket eden iki kişiden hangisi daha fazla ıslanır?

Bu iki soruya vereceğimiz cevaplara göre önermenin tamamen doğru, kısmen doğru veya tamamen yanlış olduğunu söyleyebiliriz. Bu soruların cevaplanabilmesi için analitik, deneysel veya simülasyon çalışmaları gibi farklı yollardan ilerlenebilir. Ben bu yazı serisinde daha keyifli bir inceleme olacağını düşündüğüm için simülasyon yöntemini kullanacağım. Buna göre simülasyon ortamında yağmuru, hareket eden bir cismi ve bu cisme temas eden yağmur damlası sayısını sayan programları oluşturmamız gerekmektedir. Buna göre yapılacaklar listesini aşağıdaki gibi oluşturabiliriz.

  • Yağmurun simülasyon ortamında oluşturulması
    • Yağmurun hızı kontrol edilebilmeli
    • Birim yüzey alanına yağan yağış miktarı kontrol edilebilmeli
    • Yağış doğrultusu kontrol edilebilmeli
  • Bir uzay içerisinde hareket edebilen bir cisim tanımlanmalı
    • Cismin hızı kontrol edilebilmeli
    • Cismin boyutları kontrol edilebilmeli
  • Yağmur ve cisim bileşenleri birleştirilerek incelenecek senaryolar ve gerekli görsel çıktılar oluşturulmalı

Burada ilk iki maddenin birbirinden bağımsız olduğu görülmektedir. Yani hangisinden başlamak istediğiniz tamamen size kalmış. Bu yazıda listedeki sıralamayı izleyeceğiz. Öncelikle basit olması açısından yağmuru iki boyutlu olarak oluşturacağız. Gerekli kontrolleri yaptıktan sonra üç boyutlu uzaya kolaylıkla geçiş yapabiliriz. O zaman öncelikle uzay tanımlamalarına yaparak başlayalım.

% Hareket uzayı
Space.size = [20, 3];  % Uzay boyutları [m]

% Zaman uzayı
Time.dt = 1e-2;        % Örnekleme periyodu [sn]
Time.tmax = 5;         % Simülasyon süresi [sn]
Time.axis = 0:Time.dt:Time.tmax; % Zaman uzayı [sn]

Daha sonra yağmur ile ilgili parametrelerinizi belirten değişkenleri oluşturabiliriz.

% Yağmur parametreleri
Rain.velocity = 10;     % Yağmur damlalarının hızı [m/sn]
Rain.angle = 20*pi/180; % Yağış açısı [rad]
Rain.intensity = 44;    % Yağış miktarı [mm = kg/m^2]

Burada Rain.intensity parametresi yağış miktarının bir göstergesidir ve metrekareye düşen yağış miktarını belirtmektedir. Meteoroloji Genel Müdürlüğü yağış miktarlarını 12 saatlik periyot için aşağıdaki gibi sınıflandırmıştır.

Yağış miktarı
Hafif Yağış: 1 – 5 mm
Orta Kuvvette Yağış: 6 – 20 mm
Kuvvetli Yağış: 21 – 50 mm
Çok Kuvvetli Yağış: 51 – 75 mm
Şiddetli Yağış: 76 -100 mm
Aşırı Yağış: 100 mm üzeri
Kaynak: https://www.mgm.gov.tr/site/yardim1.aspx?=HadSid

Şimdi ise yukarıdaki bilgilere göre birim zamanda oluşacak damla sayısını ve damlaların hareketlerini hesaplayabiliriz. İlk olarak birim zamanda üretilen damla sayısını aşağıdaki bağıntı ile hesaplayabiliriz.

N_{drop} = \frac{I_{rain}A}{W_{drop}}\frac{\Delta t}{12~\text{saat}}

Burada \small I_{rain} yağış miktarını, \small A yağmurun yağacağın yüzey alanını, \small W_{drop} bir damlanın ağırlığını ve \small \Delta t örnekleme periyodunu temsil etmektedir. Her bir damlanın hareketi ise basit geometri ve fizik bilgileri ile hesaplanabilir. Buna göre damlaların bilgilerini içeren structure aşağıdaki gibi tanımlanır.

% Yağmur damlalarının bilgileri
Drop.weight = 0.05e-3; % Bir damlanın ağırlığı [kg]
% Birim zamanda üretilecek damla sayısı
Drop.ngen = ((Rain.intensity*Space.size(1))/Drop.weight)*...
            (Time.dt/(12*60*60));
% Damlaların hareket vektörü
Drop.movement = [tan(Rain.angle), 1]*(Rain.velocity*Time.dt);
% Damlaların konumları
Drop.positions = [];

Artık elimizde bir örnekleme periyodunda kaç adet damla üretileceği, bu damlaların nasıl hareket edeceği bilgileri olduğundan dolayı yağmuru yağdırmaya başlayabiliriz. Bunun için aşağıdaki gibi bir fonksiyon oluşturdum. Bu fonksiyon mevcut damla bilgilerini girdi olarak alıyor, bu damlalara yenilerini ekliyor, damlaları hareket ettiriyor ve yere ulaşan damlaları siliyor. Burada damlaların belirtilen uzayda uniform dağılımına göre üretildiğine dikkat edilmelidir. Son olarak da eğer görselleştirme bayrağı aktif ise damlaların yeni durumunu görselleştirerek fonksiyon tamamlıyor.

function [Drop] = f_Rainfall(Drop, Space, plottingFlag)
% Bu fonksiyon yağmur damlalarını üretir, hareket ettirir ve 
% görselleştirir.
% Girdiler ----
% Drop         : Damlaların bilgilerini içeren structure 
% Space        : Yağmurun yağdığı uzayın bilgileri
% prottingFlag : Görselleştirme bayrağı
% Çıktılar ----
% Drop         : Damlaların güncellenmiş bilgileri
% -------------
    
    % Damlaların üretimi
    Drop.positions = [Drop.positions;
                     Space.size(1)*rand(round(Drop.ngen), 1), ...
                     Space.size(2)*ones(round(Drop.ngen), 1)];
    
    % Damlaların hareketi
    Drop.positions(:, 1) = Drop.positions(:, 1) + Drop.movement(1);
    Drop.positions(:, 2) = Drop.positions(:, 2) - Drop.movement(2);
    
    % Yere çarpan damlaların silinmesi
    Drop.positions(Drop.positions(:,2)<0, :) = [];
    
    % Damlaların görselleştirilmesi
    if plottingFlag == true 
        scatter(Drop.positions(:, 1), Drop.positions(:, 2), ...
                "Blue", "Marker", ".");
        xlim([0, Space.size(1)]); ylim([0, Space.size(2)]);
        xlabel("X [m]"); ylabel("Y [m]");
    end
end

Artık iki boyutlu uzayda oldukça detaylı bir yağmur simülasyonu oluşturduğumuzu söyleyebiliriz. O zaman aşağıdaki zaman döngüsünü kullanarak yağmuru yağdırmaya başlayabiliriz.

% Zaman döngüsü
for i = 1:length(Time.axis)
    
    % Yağmur damlalarının üretimi ve hareketi
    Drop = f_Rainfall(Drop, Space, plottingFlag);
    
    % Görselleştirme
    if plottingFlag
        exportgraphics(f1, gifFile, Append=true);
        drawnow;
        pause(Time.dt);
    end
end

Sonuç olarak bu programın çıktısı Şekil 1’de verildiği gibidir.

Şekil 1. İki boyutlu uzayda yağmur simülasyonu

Harika! 🙂 Çıktılarda bir sorun gözükmediği için bu aşamadan sonra iki boyutlu uzaydan üç boyutlu uzaya geçiş yapılabilir. Burada sadece birkaç değişkenin boyutu arttırılarak ve ufak düzenlemeler yapılarak bu geçiş gerçekleştirilebilir. İki ve üç boyutlu yağmur simülasyonu için hazırladığım programları bu yazı serisi için oluşturduğum github reposunda paylaştım. İki programı karşılaştırarak üç boyutlu uzaya geçişin nasıl gerçekleştirildiğini görebilirsiniz. Sonuç olarak üç boyutlu uzayda oluşturduğumuz yağmur Şekil 2’de görülmektedir.

Şeki 2. Üç boyutlu uzayda yağmur simülasyonu

Evet bence oldukça havalı bir görsel oldu. Size simülasyon yönteminin daha eğlenceli olacağını söylemiştim. 🙂 Böylelikle incelememizin ilk bölümünü tamamlamış olduk. Sonraki yazıda oluşturduğumuz uzayda hareken eden bir cisim oluşturarak incelemelerimize devam edeceğiz. O zamana kadar kendinize iyi bakın efendim.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir