Lattice Boltzmann yöntemleri
Örnek Kod

Lid-driven cavity akışı, iki düzlem arasındaki akışı ifade eder ve genellikle Navier-Stokes denklemleri ile modellenir. Lattice Boltzmann Method (LBM) kullanarak bu tip bir akış problemini çözmek için aşağıdaki pseudo kodu MATLAB dilinde oluşturabilirsiniz. Bu örnek, basit bir 2D lid-driven cavity problemi için D2Q9 (iki boyutlu, dokuz hız vektörü) modelini kullanır.
Bu pseudo kod, temel LBM adımlarını takip eder: çarpışma, yayılma, sınır koşullarının uygulanması ve makroskopik değerlerin hesaplanması.
% Parametreler
rho0 = 1;             % Başlangıç yoğunluğu
tau = 0.6;            % Relaxation time
nx = 100;             % Izgara boyutu (x)
ny = 100;             % Izgara boyutu (y)
numIterations = 1000; % İterasyon sayısı
u_wall = 0.1;         % Üst duvar hızı

% D2Q9 model parametreleri
w = [4/9, 1/9, 1/9, 1/9, 1/9, 1/36, 1/36, 1/36, 1/36];
cx = [0, 1, 0, -1, 0, 1, -1, -1, 1];
cy = [0, 0, 1, 0, -1, 1, 1, -1, -1];
opp = [1, 4, 5, 2, 3, 8, 9, 6, 7];

% Hız dağılım fonksiyonları (f) ve denge dağılım fonksiyonları (feq)
f = zeros(nx, ny, 9);
feq = zeros(nx, ny, 9);
rho = rho0 * ones(nx, ny);
ux = zeros(nx, ny);
uy = zeros(nx, ny);

% Başlangıç koşulları
for i = 1:nx
    for j = 1:ny
        for k = 1:9
            f(i,j,k) = w(k) * rho(i,j);
        end
    end
end

% Ana döngü
for iter = 1:numIterations
    % Çarpışma
    for i = 1:nx
        for j = 1:ny
            % Makroskopik değerleri hesapla
            rho(i,j) = sum(f( i,j,: ));
            ux(i,j) = sum(cx .* squeeze(f( i,j,: ))) / rho(i,j);
            uy(i,j) = sum(cy .* squeeze(f( i,j,: ))) / rho(i,j);
            
            % Denge dağılım fonksiyonlarını hesapla
            for k = 1:9
                cu = 3 * (cx(k) * ux(i,j) + cy(k) * uy(i,j));
                usqr = ux(i,j)^2 + uy(i,j)^2;
                feq(i,j,k) = rho(i,j) * w(k) * (1 + cu + 0.5 * cu^2 - 1.5 * usqr);
            end
            
            % Relaxation
            for k = 1:9
                f(i,j,k) = (1 - 1/tau) * f(i,j,k) + 1/tau * feq(i,j,k);
            end
        end
    end
    
    % Yayılma
    for i = 1:nx
        for j = 1:ny
            for k = 1:9
                ni = i + cx(k);
                nj = j + cy(k);
                
                % Periodik sınır koşulları
                if ni > nx
                    ni = ni - nx;
                elseif ni < 1
                    ni = nx + ni;
                end
                if nj > ny
                    nj = nj - ny;
                elseif nj < 1
                    nj = ny + nj;
                end
                
                f(ni, nj, k) = f(i, j, k);
            end
        end
    end
    
    % Sınır koşulları
    for i = 1:nx
        for k = 1:9
            % Üst duvar (hareketli duvar)
            f(i,ny,k) = f(i,ny,opp(k)) + 6 * w(k) * rho0 * u_wall * cx(k);
            % Alt duvar (sabit duvar)
            f(i,1,k) = f(i,1,opp(k));
        end
    end
    
    % Çıkış
    if mod(iter, 100) == 0
        fprintf('Iterasyon: %d, Maksimum hız: %f\n', iter, max(max(ux)));
    end
end

% Sonuçları göster
figure;
quiver(ux', uy');
title('Hız Vektörleri');
xlabel('x');
ylabel('y');
axis equal tight;
Bu kod, basit bir 2D lid-driven cavity akışını modellemek için tasarlanmıştır. Bu modelde, üst duvar sabit bir hızla hareket ederken diğer duvarlar sabittir. Bu, akışın içeride dönmesine neden olur. Kod, akışın nasıl geliştiğini ve sabit duruma ulaştığını gözlemlemek için kullanılabilir. Çıktı olarak, akışın hız vektörleri gösterilir.