管中的传输方程:边界上的源项

计算科学 matlab 流体动力学 边界条件 cdr方程
2021-12-18 15:13:32

我正在模拟流动反应器中的质量传递。流动反应器是一个管子,它允许我使用圆柱对称性来求解控制质量传递的对流-扩散-反应 (CDR) 方程。

我正在求解的方程是:

D(2ur2+1rur)v(r)uz=S(r)

这里,r 和 z 是各自方向上的坐标,u 是我要求解的属性(质量浓度),v 是速度场,S 是给定源,D 是扩散系数。

边界条件为:

cr=0,处(其中 R 是 r 方向上矩形的长度)。r=0r=R

系统示意图如下图:

在此处输入图像描述

我的方法是使用直线法,即在 z 方向上的每一步都在 r 方向上求解系统。

我将上面的方程离散化如下:

dudz=Dvi(ui+12ui+ui12h+1riui+1ui12h)Si

对于这两个边界条件,我使用了中心差分近似,即在 r = 0 和 r = R:

ui+1ui12h=0

我使用的是带有两个鬼点的网格,如下图所示:

在此处输入图像描述

现在,代码可以正常工作了,如果我没有将源代码放在任何边界上,请参见下面的第一个图。然而,在实际实验中,源位于流动反应器的中心,即源位于边界 r = 0 上。当我将源放在那里时,我得到了相当大的振荡(见下面的第二张图)。

我认为我要么实现了错误的边界条件,要么为这种计算使用了错误的网格。

我对消除这些振荡的想法是: 1. 使用交错网格,即实际上不要将源放在边界上 2. 使用混合边界条件

你会推荐什么?我还缺少其他东西吗?

MatLab 代码也附在下面。

在此处输入图像描述

在此处输入图像描述

clear all
close all 

%radius of flow reactor in mm
R = 13

%step-size in r direction 
hr = 0.2
r = -hr : hr : R + hr

%parameters
D = 1.0 %diffusion
v = 1./(13.1 - r)
v = ones(1,length(r))


%build diagonals a, b, c of matrix A
%
%      |b c 0 0 0|
%      |a b c 0 0|
%  A = |0 a b c 0|
%      |0 0 a b c|
%      |0 0 0 a b|
%
% with a = alpha - beta, b = -2alpha, c = alpha + beta

alpha = ones(length(r)-2,1) ./ v(2:end-1)' .* (D/hr^2)
beta = ones(length(r)-2,1) ./ (v(2:end-1).* r(2:end-1))' .* (D/(2*hr))

diag_a = alpha - beta
diag_b = -2*alpha
diag_c = alpha + beta

A= spdiags([diag_a diag_b diag_c],[-1 0 1],length(r)-2,length(r)-2)

%implement boundary conditions du/dr = 0 at r = 0
A(1,1) = -4*alpha(1)
A(2,1) =  4*alpha(1)

%implement boundary conditions du/dr = 0 at r = R
A(end-1,end)= A(end-1,end)*2 

ht = 0.00001
u = zeros(length(r)-2,1);

source = zeros(length(r)-2,1);
source(1:length(r)/2-2) = 1.


n_steps = 500

clear ustored

ustored = []

%step forward in time with explicit Euler
for i = 1:n_steps   

    ustored = [ustored u];
    u_next = u(:,1) + ht*(A*u(:,1)+source(:,1));
    u = u_next;

end


ustored = [ustored u]

time = 0:ht:(n_steps)*ht;

mesh(time,r(2:end-1),ustored)
0个回答
没有发现任何回复~
其它你可能感兴趣的问题