的确这部分的内容…也就仅仅是理论上严格去算出来,大家可以发现想要理解Riemann问题——流体控制偏微分方程最最基本也非常简单的初值问题,的解,也是异常复杂令人沮丧的一个过程。不仅仅是推理长,复杂繁琐的符号和层出不穷的分类讨论,使得几乎没什么人愿意干嚼完这些知识…所以我暂时也没有太过认真去写这一块,仅仅是强迫自己填了这个部分,以方便我们接着进入实际中最常见的Riemann问题近似解的部分。
我在考虑要不要尝试用视频的形式来展示理论推动过程,不知道有没有那个时间精力。也许也没有人想看吧。
Godunov Scheme的基本思想
- 在每个单元格点定义体积平均值 ,重建分段多项式函数 (在 上定义)(注意,上标n不是指数!代表的是时间为n的时候的分段函数!!)
- 最简单的情况(分段常数函数):
- 使用n-阶分段多项式函数 作为初始条件,在一个时间单位上 ,对双曲方程进行精确(或近似)来获得下一步的解 。
- 在每个单元上求平均值 以获得新的单元平均值
精确求解一维完全气体的Euler方程的Riemann问题:
问题等价于确定
对于一般的 ,2-波的类型是接触间断,是已知的,1波和3波,或者是激波,或者是稀疏波——波的类型需要我们计算确认下来。
由于压力p穿过2波保持不变,所以寻求关于单个未知压力 的方程就比计算穿过2波有变化的量要容易
表达式的推导
我们假设左激波以 速度自左向右移动,如图a所示; 波前值为ρL,uL和pL,波后值为ρ* L,u *和p *。
我们选取随激波而一起移动的参照系,如图4.4b所示。 在新的框架中,冲击速度为零,相对之下波前波后的速度为:
回顾,第三讲(计算流体力学——从原理到代码(三):非线性方程的黎曼问题与初等波(超长预警))我们推导出的 Rankine-Hugoniot 条件:
注意到,单位体积内,密度乘以速度,就是质量从右往左的流量变化,记为 :
第二个公式可以推出:
再返回原来的参考系,由参考系的变换关系: ,QL就得到
所以,未知的 的表达式:
我们希望,表达式里的自变量,仅仅和已知的物理量 以及同样要求的 有关,于是乎,我们要将 进行整理:
代入到RH条件得到的第三个公式,
因为密度 与 在左激波处的关系式:
所以代入QL,得到:
最后带回 , 得到之前我们给出的公式:
左稀疏波:
现在我们来推导fL的表达式,其中左波是稀疏波。
未知物理状态 通过熵条件,连接到左侧已知的初始物理量 ,广义黎曼不变量穿过稀疏波不变。
对于根据热力学等熵定理: ,其中C是一个常数,可以用于各种稀疏波情形。
运用等熵定理,由已知的值计算C的值,即:
因此对于星号区域里面的密度:
因为广义黎曼不变量 穿过稀疏波是不变的,于是从已知的物理量可以推出:
其中 即稀疏波的左右状态的声波波速,
带回上面式子 :
的解:
其中, 具体表达式:
同样的, 的表达式:
而式子中, 由Riemann初值决定:
中间星号区域的速度 的公式:
给定了Riemann问题的初值: ,我们前面推导出了关于中间区域压力的方程:
我们下面研究这个函数的性质 (因为我们想着,如果函数性质不好,再好的解析表达式,也很难求解,最简单就比如说高次多项式求根)
那么
因为 ,由于 ,所以 是单调函数
接着,我们来看二次导数
因为 ,所以 增长率越来越小,直观来看:
f(p) 的这种性质,决定了我们可以选取适当的迭代法,来寻找 的零点 ,而两个重要的参数分别是:速度差 和压力值 。
因此,定义:
对于给定的压力值 ,实际上是速度差 决定了 的值,那么我们考虑三个区间:
对足够大的 ,比如说上图中的 ,解 ,位于 I1 区间里面,因此 , 所以两个非线性波都是稀疏波。
如果的 , 位于pL和pR之间,因此一个非线性波是一个稀疏波,另一个是冲击波。
对于足够小的Δu值,如图中的 , 位于I3中,即 ,这意味着两个非线性波都是冲击波。
总之,我们通过 fmin 和 fmax 的符号来识别p *所在的区间。
关于 f(p) 的另一个观察是:在 I1 中,f'(p) 和 f''(p) 快速变化; 当搜索 f(p)= 0 的根时,可能产生数值上的困难。——相比而言,随着p增大,f(p) 的形状趋于类似于直线的形状,求根会轻松很多。
关于真空:
此外,对于非真空初始数据W_L,W_R,如果Δu足够小,则存在用于压力的唯一正解p *。事实上,即使对于数据状态为非真空状态的情况,在黎曼问题的解中,Δu 大于临界值(Δu)的值也会导致真空。
临界值可以根据初始物理量进行分析。很显然,对于压力p *的正解,我们需要f(0)<0,即正压力条件
如果违反这种条件,则非线性波会产生真空。在这种情况下,解决方案的结构与图4.1中描述的不同,解决方法也是如此,我们将在后面有机会讨论
function [ f ] = f_star( p_star,p,rho ) % f_star function of Godunov Scheme % p_star: static pressure after the wave % p: static pressure before the wave % rho: density before the wave % f: value of f(p_star) global gamma R; T = p/R/rho;% ideal gas c = sqrt(gamma*R*T); if p_star>p f = (p_star-p)/rho/c/sqrt((gamma+1)/2/gamma*p_star/p+(gamma-1)/2/gamma); else f = 2*c/(gamma-1)*((p_star/p).^((gamma-1)/2/gamma)-1); end end
function F = godunov_scheme(U_l,U_r,t) % Computing F_i+1/2 Using Godunov Scheme % U_l: [rho rho*u rho*E] on the left side % U_r: [rho rho*u rho*E] on the right side % t: time % F: [rho*u u^2+p rho*u*H] global gamma R; W_l = Q2S(U_l); W_r = Q2S(U_r); rho_1 = W_l(:,1); u_1 = W_l(:,2); p_1 = W_l(:,3); rho_2 = W_r(:,1); u_2 = W_r(:,2); p_2 = W_r(:,3); F_0 = f_star(0,p_1,rho_1)+f_star(0,p_2,rho_2); F_p1 = f_star(p_1,p_1,rho_1)+f_star(p_1,p_2,rho_2); F_p2 = f_star(p_2,p_1,rho_1)+f_star(p_2,p_2,rho_2); du = u_1-u_2; % determine which condition the problem belongs to if du<=F_0 condition=5; elseif du>F_0 && du<=min(F_p1,F_p2) condition=4; elseif du>max(F_p1,F_p2) condition=1; else if p_1>p_2 condition=2; else condition=3; end end %solving equation using Newton Method fun = @(p_star)f_star(p_star,p_1,rho_1)+f_star(p_star,p_2,rho_2)-du; [p_star,fval] = fsolve(fun,0.5*(p_1+p_2),optimset('Display','off','TolFun',1e-10)); u_star = 0.5*(u_1+u_2+f_star(p_star,p_2,rho_2)-f_star(p_star,p_1,rho_1)); % fprintf('fval = %.4e\n',fval); % constant parameters T_1 = p_1/R/rho_1;% ideal gas c_1 = sqrt(gamma*R*T_1); A_1 = rho_1*c_1*sqrt((gamma+1)/2/gamma*p_star/p_1+(gamma-1)/2/gamma); T_2 = p_2/R/rho_2;% ideal gas c_2 = sqrt(gamma*R*T_2); A_2 = rho_2*c_2*sqrt((gamma+1)/2/gamma*p_star/p_2+(gamma-1)/2/gamma); switch condition % computing left wave case {1,3} rho_1_star = rho_1*A_1/(A_1-rho_1*(u_1-u_star)); z_1h = u_1-A_1/rho_1; z_1t = z_1h; case {2,4} c_1_star = c_1+(gamma-1)*(u_1-u_star)/2; rho_1_star = gamma*p_star/c_1_star^2; z_1h = u_1-c_1; z_1t = u_star-c_1_star; case {5} c_1_star = c_1+(gamma-1)*(u_1-u_star)/2; rho_1_star = gamma*p_star/c_1_star^2; z_1h = u_1-c_1; z_1t = u_1-2/(gamma-1)/c_1; end switch condition % computing right wave case {1,2} rho_2_star = rho_2*A_2/(A_2-rho_2*(u_star-u_2)); z_2h = u_2+A_2/rho_2; z_2t = z_2h; case {3,4} c_2_star = c_2+(gamma-1)*(u_star-u_2)/2; rho_2_star = gamma*p_star/c_2_star^2; z_2h = u_2+c_2; z_2t = u_star+c_2_star; case{5} c_2_star = c_2+(gamma-1)*(u_star-u_2)/2; rho_2_star = gamma*p_star/c_2_star^2; z_2h = u_2+c_2; z_2t = u_2+2/(gamma-1)/c_2; end x = 0; if x<z_1h*t u = u_1; p = p_1; rho = rho_1; elseif x>= z_1h*t && x<z_1t*t c_i = (gamma-1)/(gamma+1)*(u_1-x/t)+2/(gamma+1)*c_1; u = x/t+c_i; p = p_1*(c_i/c_1)^(2*gamma/(gamma-1)); rho = gamma*p/c_i^2; elseif x>= z_1t*t && x<z_2t*t u = u_star; p = p_star; if x<u_star*t rho = rho_1_star; else rho = rho_2_star; end elseif x>= z_2t*t && x<z_2h*t c_i = (gamma-1)/(gamma+1)*(x/t-u_2)+2/(gamma+1)*c_2; u = x/t-c_i; p = p_2*(c_i/c_2)^(2*gamma/(gamma-1)); rho = gamma*p/c_i^2; elseif x>= z_2h*t u = u_2; p = p_2; rho = rho_2; end F = W2F([ rho,u,p ]); end
来源:知乎 www.zhihu.com
作者:知乎用户(登录查看详情)
【知乎日报】千万用户的选择,做朋友圈里的新鲜事分享大牛。 点击下载