槽道流添加扰动速度场MATLAB代码

%% write by rqli 23/9/11
%% create initial velocity fields for channel flow
%% 生成无量纲形式的速度场u*;u* = u/u_{\tau}
%% 无量纲长度L*;L* = L/h;h = Ly/2;
%% input1: Retau
%% input2:  Lx,Ly,Lz
%% input3:  nx,ny,nz
%% input4:  1-->'laminar' or 2-->'time_average'
%% output:  MATLAB_Retauxxx_Initial.bin(无量纲速度场)
%% 需要调用函数creatMesh.m
clear;clc

%% 1、输入摩擦雷诺数
Retau = 180;base_flow = 2;
%% 2、设置计算域Lx->streamwise;Ly->wall-norm;Lz->spanwise
Lx = 4;Ly = 2;Lz = 2;h = Ly/2;
%% 3、设置网格参数
nx = 401;ny = 201;nz = 201;

%% 生成初始网格点
[X,Y,Z] = creatMesh(nx,ny,nz,Lx,Ly,Lz);
U = zeros(nx*ny*nz,1);
V = zeros(nx*ny*nz,1);
W = zeros(nx*ny*nz,1); 

%% 层流速度场参数设置
nu = 1.58e-5;
utau = Retau*nu/h;
%% 首先生成base_flow
if base_flow == 1% 对应'laminar'
    Ubar = (utau^2)*h/3/nu;
    for i = 1:length(U) 
        y = min(Y(i),2*h-Y(i));
        U(i) = 3*Ubar*(y/h-0.5*(y/h)^2);
    end
elseif base_flow == 2% 对应'time_average'
    for i = 1:length(U) 
        y = min(Y(i),2*h-Y(i));
        yplus = y*Retau/h;
        if yplus<=10.8
            U(i) = utau*yplus;
        elseif yplus>10.8
            U(i) = utau*(log(yplus)/0.41+5);
        end
    end
    Ubar = mean(U);
end

%% 扰动场参数设置
duplus = Ubar*0.25/utau;
sigma = 0.00055;
%% spanwise wavenumber: spacing z+ = 200
betaPlus = 2*pi*(1/200);
epsilon = Ubar/200;
%% streamwise wave number: spacing x+ = 500
alphaPlus = 2*pi*(1/500);
%% 生成扰动速度场
for i = 1:length(U)
    deviation = 1+0.2*randn(1);%%添加扰动
    xplus = X(i)*Retau/h;
    y = min(Y(i),2*h-Y(i));
    yplus = y*Retau/h;
    zplus = Z(i)*Retau/h;
    U(i) = U(i)+(utau*duplus/2.0) * (yplus/40.0)...
                * exp(-sigma * (yplus^2) + 0.5)...
                * cos(betaPlus*zplus)*deviation;
    W(i) = epsilon*sin(alphaPlus*xplus)*yplus*exp(-sigma*(yplus^2))...
              * deviation;
end
%% 对速度进行无量纲化
U = U./utau;V = V./utau;W = W./utau;

%% 绘制云图
U3d = reshape(U,nx,ny,nz);
uxz = reshape(U3d(:,5,:),nx,nz);
pcolor(uxz)
shading interp

%% 将数据转换为二进制格式(AoXu)
data = [U,V,W];
writeXuBinaryfile(strcat('../4_binary_data/MATLAB_Retau',num2str(Retau),'_Initial.bin'),data)
disp('successful write!')

%% 写入数据函数
function [] = writeXuBinaryfile(file,data)
% 写只有U,V,W信息的二进制文件
fid = fopen(file,'w');
fwrite(fid,1,'int32');
fwrite(fid,data(:,1),'float64');%U
fwrite(fid,[1 1],'int32');
fwrite(fid,data(:,2),'float64');%V
fwrite(fid,[1 1],'int32');
fwrite(fid,data(:,3),'float64');%W
fwrite(fid,1,'int32');
fclose(fid);
end





求解的 Orr-Sommerfeld(OS)方程是研究体稳定性的重要方法之一。该方程描述了在平行剪切中,小扰动的演化行为[^1]。数值求解 OS 方程通常采用谱方法或有限差分法,其中 Chebyshev 谱方法因其高精度而被广泛使用。 ### 1. Orr-Sommerfeld 方程的形式 对于二维不可压缩动,Orr-Sommerfeld 方程可以写为: $$ \left( \frac{d^2}{dy^2} - \alpha^2 \right)^2 \phi = \frac{1}{i \alpha Re} \left[ \left( U(y) \left( \frac{d^2}{dy^2} - \alpha^2 \right) - U''(y) \right) \left( \frac{d^2}{dy^2} - \alpha^2 \right) \phi \right] $$ 其中: - $ \phi(y) $ 是扰动函数, - $ U(y) $ 是基本速度剖面(中的抛物线速度分布), - $ \alpha $ 是向波数, - $ Re $ 是雷诺数, - $ i $ 是虚数单位。 ### 2. 数值方法的选择 常用的方法包括: - **Chebyshev 配点法**:将解表示为 Chebyshev 多项式的线性组合,并在 Gauss-Lobatto 点上离散化微分子。 - **有限差分法**:对空间导数进行离散化,适用于简单几何结构和边界条件。 - **谱配置法结合矩阵特征值求解器**:将微分方程转化为矩阵特征值问题,使用标准库如 LAPACK 或 ARPACK 求解。 ### 3. 边界条件 对于(Poiseuille ),边界条件通常为无滑移边界条件,即: - 在上下壁面处,$ \phi(\pm 1) = 0 $ 和 $ \phi'(\pm 1) = 0 $。 这些边界条件需要通过构造合适的基函数或在矩阵中施加约束来实现。 ### 4. 构造离散形式 使用 Chebyshev 谱方法时,首先构造二阶导数矩阵 $ D^{(2)} $,然后构建四阶导数矩阵 $ (D^{(2)} - \alpha^2 I)^2 $。接着将方程转换为广义特征值问题: $$ A \mathbf{\phi} = c B \mathbf{\phi} $$ 其中 $ A $ 和 $ B $ 是由速度剖面 $ U(y) $、导数矩阵及参数 $ Re, \alpha $ 构建的系数矩阵,$ c $ 是复数相速度。 ### 5. Python 示代码 以下是一个简化的 Python 实现示,使用 `scipy` 和 `numpy` 进行 Chebyshev 配点法求解: ```python import numpy as np from scipy.linalg import eig from scipy.sparse import diags from scipy.sparse.linalg import eigs def cheb(N): if N == 0: D = 0 x = 1 return D, x x = np.cos(np.pi * np.arange(N+1)/N) x.shape = (N+1, 1) c = np.r_[2, np.ones(N-1), 2] * (-1)**np.arange(N+1) c.shape = (N+1, 1) X = np.tile(x, (1, N+1)) dX = X - X.T D = np.outer(c, 1./c) / (dX + np.eye(N+1)) # off-diagonal entries D = D - np.diag(D.sum(axis=1)) # diagonal entries return D, x def os_matrix(N, alpha, Re): D, y = cheb(N) D2 = D @ D diag_alpha2 = diags(-alpha**2 * np.ones_like(y).flatten()) L = D2 + diag_alpha2 U = 1 - y**2 # Parabolic base flow for channel flow Uyy = -2 * np.ones_like(y) A = L @ L B = diags(U.flatten()) @ L + diags(Uyy.flatten()) @ D A = A[1:-1, 1:-1] # Remove boundary points B = B[1:-1, 1:-1] return A, B def solve_os(N=64, alpha=1.0, Re=1000): A, B = os_matrix(N, alpha, Re) vals, vecs = eigs(A, M=B, k=10, which='SM') return vals # Solve and print eigenvalues eigenvalues = solve_os() print("Eigenvalues:", eigenvalues) ``` ### 6. 后处理与分析 得到的特征值 $ c $ 是复数,其实部代表扰动的增长率,虚部代表频率。若存在特征值的虚部为正,则表明系统不稳定。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值