找回密码
 注册
Simdroid-非首页
查看: 167|回复: 4

SIMPLE算法处理流场分享

[复制链接]
发表于 2013-9-17 22:07:00 | 显示全部楼层 |阅读模式 来自 上海
本帖最后由 scott198510 于 2013-9-19 10:42 编辑
  1. clear all;clc;close all;
  2. %initialization
  3. % Guess a temporary pressure and velocity fields
  4. p_star = zeros(41);
  5. u_star = zeros(41);u_star(1,:) = 5;u_star(2,:) = 5;
  6. v_star = zeros(41);


  7. p_prime = zeros(41);
  8. p_prime2= zeros(41);
  9. u_prime = zeros(41);
  10. v_prime = zeros(41);


  11. p = p_star+p_prime;
  12. u = u_star+u_prime;
  13. v = v_star+v_prime;

  14. alpha = 0.4;
  15. dt = 0.001;
  16. dx = 0.01;
  17. dy = 0.01;
  18. ro = 1000;
  19. MU = 0.0025;

  20. for itr = 1:2000
  21. for i = 2:40
  22. for j = 2:40
  23. A_star = MU*((u(i+1,j)-2*u(i,j)+u(i-1,j))/dx^2 + (u(i,j+1)-2*u(i,j)+u(i,j-1))/dy^2);
  24. B_star = MU*((v(i+1,j)-2*v(i,j)+v(i-1,j))/dx^2 + (v(i,j+1)-2*v(i,j)+v(i,j-1))/dy^2);
  25. u_star(i,j) = u_star(i,j) + A_star*dt - dt/dx*(p_star(i-1,j) - p_star(i,j))/ro;
  26. v_star(i,j) = v_star(i,j) + B_star*dt - dt/dx*(p_star(i,j-1) - p_star(i,j))/ro;
  27. end
  28. end
  29. u_star(41,:) = 0;u_star(40,:) = 0;u_star(:,1) = 0;u_star(:,2) = 0;u_star(:,41) = 0;u_star(:,40) = 0;u_star(2,:) = 5;u_star(1,:) = 5;
  30. v_star(41,:) = 0;v_star(40,:) = 0;v_star(:,1) = 0;v_star(:,2) = 0;v_star(:,41) = 0;v_star(:,40) = 0;v_star(2,:) = 0;v_star(1,:) = 0;

  31. u = u_star;
  32. v = v_star;

  33. for itrate = 1:1000
  34. for i = 2:40
  35. for j = 2:40
  36. p_prime2(i,j) = 0.25*(p_prime(i-1,j)+p_prime(i+1,j)+p_prime(i,j-1)+p_prime(i,j+1)) + dx*(u_star(i,j)-u_star(i+1,j)+v_star(i,j)-v_star(i,j+1));
  37. end
  38. end
  39. mx = max(max(abs(p_prime-p_prime2)));
  40. p_prime = p_prime2;
  41. if mx<0.001, break, end
  42. end

  43. p = p_star + alpha*p_prime;
  44. p_star = p;

  45. end

  46. figure,surf(p) % pressure distribution in cavity
  47. figure,contour(p,20) % pressure distribution in cavity
  48. figure,surf(u) % u component of velocity
  49. figure,contour(u,20) %u component of velocity
  50. figure,surf(v) %v component of velocity
  51. figure,contour(v,20)%v component of velocity
复制代码
鉴于有不少学习SIMPLE算法处理流场(耦合方程中的速度场)的迭代问题,附上一个小程序,便于新手学习。

采用SIMPLE算.法实施速度分量和压力场耦合方程的离散求解时,计算步骤如下:
(1) 假定一个速度分布,记为u0,v0,w0 ,以此计算动量离散方程中的系数及常数项;
(2) 假设一个压力场p0 ;
(3) 依次求解动量方程,得 u1,v1,w1;
(4) 对压力加以修正,得p1 ;
(5) 根据p1 改进速度值;
(6) 利用改进后的速度场求解那些通过源项物性等与速度场耦合的 Φ变量,如果Φ 变量并不影响流场,则应在速度场收敛后再求解;
(7) 利用改进后的速度场重新计算动量离散方程的系数,并利用改进后的压力场作为下一层次迭代计算的初值。重复上述步骤,直到获得收敛的解。

表达式如图片中所示,前两式为动量守恒方程,第三式为质量守恒方程。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

点评

最好能把对流扩散方程以图片形式贴出来  发表于 2013-9-18 14:06

评分

1

查看全部评分

发表于 2013-9-18 14:04:06 | 显示全部楼层 来自 北京
Simdroid开发平台
好久不见scott198510,其实matlab做流场是有局限性的,很多情况下进行差分求解动量方程时用的是迎风格式,下一个step是受上一个step的影响的,matlab所擅长的向量化运算的优势是无从体现啊,这也就是现在好多流场模拟都是fortran等其他语言来完成的原因。不过simple算法确实是一个经典的案例

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2013-9-19 10:43:03 | 显示全部楼层 来自 上海
liuyalong008 发表于 2013-9-18 14:04
好久不见scott198510,其实matlab做流场是有局限性的,很多情况下进行差分求解动量方程时用的是迎风格式, ...

表达式如上。
回复 不支持

使用道具 举报

 楼主| 发表于 2013-9-19 14:10:33 | 显示全部楼层 来自 上海
本帖最后由 scott198510 于 2013-11-20 21:55 编辑
  1. clear all;clc;close all;
  2. %initialization
  3. nx=100;
  4. ny=30;
  5. %速度场
  6. u=zeros(ny+2,nx+1,3);
  7. v=zeros(ny+1,nx+2,3);
  8. %压力场
  9. p=zeros(ny,nx,3);
  10. %===========动量守恒方程=============
  11. aeu=zeros(ny+2,nx+1);
  12. awu=zeros(ny+2,nx+1);
  13. asu=zeros(ny+2,nx+1);
  14. anu=zeros(ny+2,nx+1);
  15. apu=zeros(ny+2,nx+1);
  16. aev=zeros(ny+1,nx+2);
  17. awv=zeros(ny+1,nx+2);
  18. asv=zeros(ny+1,nx+2);
  19. anv=zeros(ny+1,nx+2);
  20. apv=zeros(ny+1,nx+2);
  21. %============压力修正================
  22. pce=zeros(ny,nx);
  23. pcw=zeros(ny,nx);
  24. pcs=zeros(ny,nx);
  25. pcn=zeros(ny,nx);
  26. aep=zeros(ny,nx);
  27. awp=zeros(ny,nx);
  28. asp=zeros(ny,nx);
  29. anp=zeros(ny,nx);
  30. app=zeros(ny,nx);
  31. aepc=zeros(ny,nx);
  32. awpc=zeros(ny,nx);
  33. anpc=zeros(ny,nx);
  34. aspc=zeros(ny,nx);
  35. appc=zeros(ny,nx);
  36. pc=zeros(ny+2,nx+2,3);
  37. %=========质量不守恒,需要通过压力修正===========
  38. mp=zeros(ny,nx);
  39. errp=zeros(ny,nx);
  40. raw=1000;
  41. dx=0.001/ny;
  42. dy=0.001/ny;
  43. d=0.001;
  44. u(2:ny+1,:,:)=0.01;
  45. for q=1:5000
  46. %===========动量守恒方程=============
  47. for ll=1:10
  48. for i=2:ny+1
  49. for j=2:nx
  50. if i==2
  51. aeu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j+1,1)+0.5*u(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*u(i,j+1,1)+0.5*u(i,j,1)));
  52. awu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j-1,1)+0.5*u(i,j,1))/d))^5)+max(0,raw*dy*(0.5*u(i,j-1,1)+0.5*u(i,j,1)));
  53. asu(i,j)=2*d*max(0,(1-0.1*abs(raw*dy*(0.25*v(i-1,j+1,1)+0.25*v(i-1,j,1))/d))^5)+max(0,raw*dy*(0.5*v(i-1,j+1,1)+0.5*v(i-1,j,1)));
  54. anu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i,j+1,1)+0.5*v(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*v(i,j+1,1)+0.5*v(i,j,1)));
  55. if j==nx
  56. aeu(i,j)=0;
  57. end
  58. apu(i,j)=aeu(i,j)+awu(i,j)+asu(i,j)+anu(i,j);
  59. u(i,j,1)=(aeu(i,j)*u(i,j+1,1)+awu(i,j)*u(i,j-1,1)+anu(i,j)*u(i+1,j,1)+asu(i,j)*u(i-1,j,1)+(p(i-1,j-1,1)-p(i-1,j,1))*dy)/apu(i,j);
  60. else if i==ny+1
  61. aeu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j+1,1)+0.5*u(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*u(i,j+1,1)+0.5*u(i,j,1)));
  62. awu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j-1,1)+0.5*u(i,j,1))/d))^5)+max(0,raw*dy*(0.5*u(i,j-1,1)+0.5*u(i,j,1)));
  63. asu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i-1,j+1,1)+0.5*v(i-1,j,1))/d))^5)+max(0,raw*dy*(0.5*v(i-1,j+1,1)+0.5*v(i-1,j,1)));
  64. anu(i,j)=2*d*max(0,(1-0.1*abs(raw*dy*(0.25*v(i,j+1,1)+0.25*v(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*v(i,j+1,1)+0.5*v(i,j,1)));
  65. if j==nx
  66. aeu(i,j)=0;
  67. end
  68. apu(i,j)=aeu(i,j)+awu(i,j)+asu(i,j)+anu(i,j);
  69. u(i,j,1)=(aeu(i,j)*u(i,j+1,1)+awu(i,j)*u(i,j-1,1)+anu(i,j)*u(i+1,j,1)+asu(i,j)*u(i-1,j,1)+(p(i-1,j-1,1)-p(i-1,j,1))*dy)/apu(i,j);
  70. else
  71. aeu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j+1,1)+0.5*u(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*u(i,j+1,1)+0.5*u(i,j,1)));
  72. awu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j-1,1)+0.5*u(i,j,1))/d))^5)+max(0,raw*dy*(0.5*u(i,j-1,1)+0.5*u(i,j,1)));
  73. asu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i-1,j+1,1)+0.5*v(i-1,j,1))/d))^5)+max(0,raw*dy*(0.5*v(i-1,j+1,1)+0.5*v(i-1,j,1)));
  74. anu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i,j+1,1)+0.5*v(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*v(i,j+1,1)+0.5*v(i,j,1)));
  75. if j==nx
  76. aeu(i,j)=0;
  77. end
  78. apu(i,j)=aeu(i,j)+awu(i,j)+asu(i,j)+anu(i,j);
  79. u(i,j,1)=(aeu(i,j)*u(i,j+1,1)+awu(i,j)*u(i,j-1,1)+anu(i,j)*u(i+1,j,1)+asu(i,j)*u(i-1,j,1)+(p(i-1,j-1,1)-p(i-1,j,1))*dy)/apu(i,j);
  80. end
  81. end
  82. end
  83. end
  84. u(:,nx,1)=u(:,nx,1)*(sum(u(:,1,1))/sum(u(:,nx,1)));
  85. u(:,nx+1,1)=u(:,nx,1);
  86. for i=2:ny
  87. for j=2:nx+1
  88. if j==2
  89. aev(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j,1)+0.5*u(i+1,j,1))/d))^5)+max(0,-raw*dy*(0.5*u(i,j,1)+0.5*u(i+1,j,1)));
  90. awv(i,j)=2*d*max(0,(1-0.1*abs(raw*dy*(0.25*u(i,j-1,1)+0.25*u(i+1,j-1,1))/d))^5)+max(0,raw*dy*(0.5*u(i,j-1,1)+0.5*u(i+1,j-1,1)));
  91. asv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i-1,j,1)+0.5*v(i,j,1))/d))^5)+max(0,raw*dy*(0.5*v(i-1,j,1)+0.5*v(i,j,1)));
  92. anv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i+1,j,1)+0.5*v(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*v(i+1,j,1)+0.5*v(i,j,1)));
  93. if j==nx+1
  94. aev(i,j)=0;
  95. end
  96. apv(i,j)=aev(i,j)+awv(i,j)+asv(i,j)+anv(i,j);
  97. v(i,j,1)=(aev(i,j)*v(i,j+1,1)+awv(i,j)*v(i,j-1,1)+anv(i,j)*v(i+1,j,1)+asv(i,j)*v(i-1,j,1)+(p(i-1,j-1,1)-p(i,j-1,1))*dy)/apv(i,j);
  98. else if j==nx+1
  99. aev(i,j)=2*d*max(0,(1-0.1*abs(raw*dy*(0.25*u(i,j,1)+0.25*u(i+1,j,1))/d))^5)+max(0,-raw*dy*(0.5*u(i,j,1)+0.5*u(i+1,j,1)));
  100. awv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j-1,1)+0.5*u(i+1,j-1,1))/d))^5)+max(0,raw*dy*(0.5*u(i,j-1,1)+0.5*u(i+1,j-1,1)));
  101. asv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i-1,j,1)+0.5*v(i,j,1))/d))^5)+max(0,raw*dy*(0.5*v(i-1,j,1)+0.5*v(i,j,1)));
  102. anv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i+1,j,1)+0.5*v(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*v(i+1,j,1)+0.5*v(i,j,1)));
  103. if j==nx+1
  104. aev(i,j)=0;
  105. end
  106. apv(i,j)=aev(i,j)+awv(i,j)+asv(i,j)+anv(i,j);
  107. v(i,j,1)=(aev(i,j)*v(i,j+1,1)+awv(i,j)*v(i,j-1,1)+anv(i,j)*v(i+1,j,1)+asv(i,j)*v(i-1,j,1)+(p(i-1,j-1,1)-p(i,j-1,1))*dy)/apv(i,j);
  108. else
  109. aev(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j,1)+0.5*u(i+1,j,1))/d))^5)+max(0,-raw*dy*(0.5*u(i,j,1)+0.5*u(i+1,j,1)));
  110. awv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j-1,1)+0.5*u(i+1,j-1,1))/d))^5)+max(0,raw*dy*(0.5*u(i,j-1,1)+0.5*u(i+1,j-1,1)));
  111. asv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i-1,j,1)+0.5*v(i,j,1))/d))^5)+max(0,raw*dy*(0.5*v(i-1,j,1)+0.5*v(i,j,1)));
  112. anv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i+1,j,1)+0.5*v(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*v(i+1,j,1)+0.5*v(i,j,1)));
  113. if j==nx+1
  114. aev(i,j)=0;
  115. end
  116. apv(i,j)=aev(i,j)+awv(i,j)+asv(i,j)+anv(i,j);
  117. v(i,j,1)=(aev(i,j)*v(i,j+1,1)+awv(i,j)*v(i,j-1,1)+anv(i,j)*v(i+1,j,1)+asv(i,j)*v(i-1,j,1)+...
  118. (p(i-1,j-1,1)-p(i,j-1,1))*dy)/apv(i,j);
  119. end
  120. end
  121. end
  122. end
  123. end
  124. %================压力场修正============
  125. for i=2:ny+1
  126. for j=2:nx
  127. if i==2
  128. aeu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j+1,1)+0.5*u(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*u(i,j+1,1)+0.5*u(i,j,1)));
  129. awu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j-1,1)+0.5*u(i,j,1))/d))^5)+max(0,raw*dy*(0.5*u(i,j-1,1)+0.5*u(i,j,1)));
  130. asu(i,j)=2*d*max(0,(1-0.1*abs(raw*dy*(0.25*v(i-1,j+1,1)+0.25*v(i-1,j,1))/d))^5)+max(0,raw*dy*(0.5*v(i-1,j+1,1)+0.5*v(i-1,j,1)));
  131. anu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i,j+1,1)+0.5*v(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*v(i,j+1,1)+0.5*v(i,j,1)));
  132. if j==nx
  133. aeu(i,j)=0;
  134. end
  135. apu(i,j)=aeu(i,j)+awu(i,j)+asu(i,j)+anu(i,j);
  136. else if i==ny+1
  137. aeu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j+1,1)+0.5*u(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*u(i,j+1,1)+0.5*u(i,j,1)));
  138. awu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j-1,1)+0.5*u(i,j,1))/d))^5)+max(0,raw*dy*(0.5*u(i,j-1,1)+0.5*u(i,j,1)));
  139. asu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i-1,j+1,1)+0.5*v(i-1,j,1))/d))^5)+max(0,raw*dy*(0.5*v(i-1,j+1,1)+0.5*v(i-1,j,1)));
  140. anu(i,j)=2*d*max(0,(1-0.1*abs(raw*dy*(0.25*v(i,j+1,1)+0.25*v(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*v(i,j+1,1)+0.5*v(i,j,1)));
  141. if j==nx
  142. aeu(i,j)=0;
  143. end
  144. apu(i,j)=aeu(i,j)+awu(i,j)+asu(i,j)+anu(i,j);
  145. else
  146. aeu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j+1,1)+0.5*u(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*u(i,j+1,1)+0.5*u(i,j,1)));
  147. awu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j-1,1)+0.5*u(i,j,1))/d))^5)+max(0,raw*dy*(0.5*u(i,j-1,1)+0.5*u(i,j,1)));
  148. asu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i-1,j+1,1)+0.5*v(i-1,j,1))/d))^5)+max(0,raw*dy*(0.5*v(i-1,j+1,1)+0.5*v(i-1,j,1)));
  149. anu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i,j+1,1)+0.5*v(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*v(i,j+1,1)+0.5*v(i,j,1)));
  150. if j==nx
  151. aeu(i,j)=0;
  152. end
  153. apu(i,j)=aeu(i,j)+awu(i,j)+asu(i,j)+anu(i,j);
  154. end

  155. end
  156. end
  157. end
  158. for i=2:ny
  159. for j=2:nx+1
  160. if j==2
  161. aev(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j,1)+0.5*u(i+1,j,1))/d))^5)+max(0,-raw*dy*(0.5*u(i,j,1)+0.5*u(i+1,j,1)));
  162. awv(i,j)=2*d*max(0,(1-0.1*abs(raw*dy*(0.25*u(i,j-1,1)+0.25*u(i+1,j-1,1))/d))^5)+max(0,raw*dy*(0.5*u(i,j-1,1)+0.5*u(i+1,j-1,1)));
  163. asv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i-1,j,1)+0.5*v(i,j,1))/d))^5)+max(0,raw*dy*(0.5*v(i-1,j,1)+0.5*v(i,j,1)));
  164. anv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i+1,j,1)+0.5*v(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*v(i+1,j,1)+0.5*v(i,j,1)));
  165. apv(i,j)=aev(i,j)+awv(i,j)+asv(i,j)+anv(i,j);
  166. else if j==nx+1
  167. aev(i,j)=2*d*max(0,(1-0.1*abs(raw*dy*(0.25*u(i,j,1)+0.25*u(i+1,j,1))/d))^5)+max(0,-raw*dy*(0.5*u(i,j,1)+0.5*u(i+1,j,1)));
  168. awv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j-1,1)+0.5*u(i+1,j-1,1))/d))^5)+max(0,raw*dy*(0.5*u(i,j-1,1)+0.5*u(i+1,j-1,1)));
  169. asv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i-1,j,1)+0.5*v(i,j,1))/d))^5)+max(0,raw*dy*(0.5*v(i-1,j,1)+0.5*v(i,j,1)));
  170. anv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i+1,j,1)+0.5*v(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*v(i+1,j,1)+0.5*v(i,j,1)));
  171. apv(i,j)=aev(i,j)+awv(i,j)+asv(i,j)+anv(i,j);
  172. else
  173. aev(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j,1)+0.5*u(i+1,j,1))/d))^5)+max(0,-raw*dy*(0.5*u(i,j,1)+0.5*u(i+1,j,1)));
  174. awv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j-1,1)+0.5*u(i+1,j-1,1))/d))^5)+max(0,raw*dy*(0.5*u(i,j-1,1)+0.5*u(i+1,j-1,1)));
  175. asv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i-1,j,1)+0.5*v(i,j,1))/d))^5)+max(0,raw*dy*(0.5*v(i-1,j,1)+0.5*v(i,j,1)));
  176. anv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i+1,j,1)+0.5*v(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*v(i+1,j,1)+0.5*v(i,j,1)));
  177. apv(i,j)=aev(i,j)+awv(i,j)+asv(i,j)+anv(i,j);
  178. end
  179. end
  180. end
  181. end

  182. for i=1:ny
  183. for j=2:nx-1
  184. aepc(i,j)=raw*dy^2/apu(i+1,j+1);
  185. awpc(i,j)=raw*dy^2/apu(i+1,j);
  186. end
  187. end
  188. for i=2:ny-1
  189. for j=1:nx
  190. anpc(i,j)=raw*dx^2/apv(i+1,j+1);
  191. aspc(i,j)=raw*dx^2/apv(i,j+1);
  192. end
  193. end
  194. for i=1:ny
  195. awpc(i,1)=0;
  196. aepc(i,1)=raw*dy^2/apu(i+1,2);
  197. awpc(i,nx)=raw*dy^2/apu(i+1,nx);
  198. aepc(i,nx)=0;
  199. end
  200. for j=1:nx
  201. anpc(1,j)=raw*dx^2/apv(2,j+1);
  202. aspc(1,j)=0;
  203. anpc(ny,j)=0;
  204. aspc(ny,j)=raw*dx^2/apv(ny,j+1);
  205. end
  206. for i=1:ny
  207. for j=1:nx
  208. appc(i,j)=aepc(i,j)+awpc(i,j)+anpc(i,j)+aspc(i,j);
  209. end
  210. end

  211. for i=1:ny
  212. for j=1:nx
  213. mp(i,j)=raw*dx*((u(i+1,j+1,1)-u(i+1,j,1))+(v(i+1,j+1,1)-v(i,j+1,1)));
  214. end
  215. end

  216. for ll=1:1000
  217. for i=2:ny+1
  218. for j=2:nx+1
  219. pc(i,j,1)=(pc(i,j+1,1)*aepc(i-1,j-1)+pc(i,j-1,1)*awpc(i-1,j-1)+pc(i+1,j,1)*anpc(i-1,j-1)+...
  220. pc(i-1,j,1)*aspc(i-1,j-1)-mp(i-1,j-1))/appc(i-1,j-1); %求出p'
  221. end
  222. end
  223. end
  224. ref=pc(2,2,1);
  225. for i=2:ny+1
  226. for j=2:nx+1
  227. pc(i,j,1)=pc(i,j,1)-ref;
  228. end
  229. end
  230. for i=1:ny
  231. for j=1:nx
  232. p(i,j,1)=p(i,j,1)+0.01*pc(i+1,j+1,1);
  233. end
  234. end

  235. for i=2:ny+1
  236. for j=2:nx
  237. u(i,j,1)=u(i,j,1)+dx/apu(i,j)*(pc(i,j,1)-pc(i,j+1,1));
  238. end
  239. end
  240. for i=2:ny
  241. for j=2:nx
  242. v(i,j,1)=v(i,j,1)+dy/apv(i,j)*(pc(i,j,1)-pc(i+1,j,1));
  243. end
  244. end
  245. err=norm(mp(:));
  246. if err<1e-5;break, end
  247. for i=2:ny-1
  248. for j=2:nx-1
  249. mp(i,j)=raw*dx*((u(i,j+1,1)-u(i,j,1))+(v(i+1,j,1)-v(i,j,1)));
  250. end
  251. end
  252. end

  253. contourf(u(1:31,:,1),30);axis equal
  254. set(gcf,'color','w')
复制代码
上面的方程比较简单,再附上一个,其实通过矩阵整体迭代求解可以适当加快求解过程,
matlab的向量迭代优势可以进一步体现出来,流场不管是否迎风模式,都可以采用。
看到有考虑多重求解雷诺方程的,雷诺方程本质上和Navier-Stokes是一样的,只是一个变种。
做这方面的都可以参与讨论。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2013-12-24 19:21:06 | 显示全部楼层 来自 上海
本帖最后由 scott198510 于 2013-12-24 19:26 编辑
  1. clear all;clc;close all;
  2. %initialization
  3. % Guess a temporary pressure and velocity fields
  4. N=100;
  5. a=0.0525;
  6. R=15;
  7. p_star = zeros(N);
  8. u_star =a*ones(N);
  9. v_star = zeros(N);
  10. p_prime = zeros(N);
  11. p_prime2= zeros(N);
  12. u_prime = zeros(N);
  13. v_prime = zeros(N);
  14. p = p_star+p_prime;
  15. u = u_star+u_prime;
  16. v = v_star+v_prime;
  17. for i=1:N
  18.   for j=1:N
  19.       if (i-N/2)^2+(j-N/2)^2<=R^2
  20.         u_star(i,j)=0;
  21.         v_star(i,j)=0;
  22.       end
  23.   end
  24. end
  25. alpha=0.4;
  26. dt=0.004;
  27. dx=0.4;
  28. dy=0.4;
  29. ro=1000;
  30. MU=10;
  31. for itr = 1:4000
  32.     for i = 2:N-1
  33.         for j = 2:N-1
  34.            if (i-N/2)^2+(j-N/2)^2>R^2
  35.             A_star1 = MU*((u(i+1,j)-2*u(i,j)+u(i-1,j))/dx^2+(u(i,j+1)-2*u(i,j)+u(i,j-1))/dy^2);
  36.             A_star2 = u(i,j)*(u(i+1,j)-u(i-1,j))/2/dx+v(i,j)*(u(i,j+1)-u(i,j-1))/2/dy;
  37.             A_star=A_star1-A_star2;
  38.             B_star1 =  MU*((v(i+1,j)-2*v(i,j)+v(i-1,j))/dx^2 + (v(i,j+1)-2*v(i,j)+v(i,j-1))/dy^2);
  39.             B_star2 =  u(i,j)*(v(i+1,j)-v(i-1,j))/2/dx+v(i,j)*(v(i,j+1)-v(i-1,j))/2/dy;
  40.             B_star=B_star1-B_star2;
  41.             u_star(i,j) = u_star(i,j) + A_star*dt-dt/dx*(p_star(i+1,j) - p_star(i,j))/ro;
  42.             v_star(i,j) = v_star(i,j) + B_star*dt-dt/dx*(p_star(i,j+1) - p_star(i,j))/ro;
  43.            end
  44.         end
  45.     end
  46.     u = u_star;
  47.     v = v_star;

  48.     for itrate = 1:2000
  49.         for i = 2:N-1
  50.             for j = 2:N-1
  51.                 p_prime2(i,j) = 0.25*(p_prime(i-1,j)+p_prime(i+1,j)+p_prime(i,j-1)+p_prime(i,j+1))+...
  52.                     dx*(u_star(i-1,j)-u_star(i+1,j)+v_star(i,j-1)-v_star(i,j+1))/2;
  53.             end
  54.         end
  55.         mx = max(max(abs(p_prime-p_prime2)));
  56.         p_prime = p_prime2;
  57.         if mx<0.001, break, end
  58.     end

  59.     p = p_star + alpha*p_prime;
  60.     p_star = p;

  61. end

  62. figure,surf(p) %  pressure distribution in cavity
  63. figure,contour(p,100) % pressure distribution in cavity
  64. figure,surf(u) % u component of velocity
  65. figure,contour(u,100) %u component of velocity
  66. figure,surf(v) %v component of velocity
  67. figure,contour(v,100)%v component of velocity

  68. S=ones(N,N);
  69. for i=1:N
  70.   for j=1:N
  71.       if (i-N/2)^2+(j-N/2)^2<=R^2
  72.         S(i,j)=0;
  73.       end
  74.   end
  75. end
  76. figure,imshow(S);
  77. hold on
  78. xmax=N;
  79. ymax=N;
  80. nx=2;
  81. ny=2;
  82. [x,y]=meshgrid(1:nx:xmax,1:ny:ymax);
  83. quiver(x,y,u(1:nx:xmax,1:ny:ymax)',v(1:nx:xmax,1:ny:ymax)',3);
  84. axis equal;
复制代码
控制方程如图中所示,忽略重力作用gx,gy,模拟流体中含有固体障碍物时,流场分布

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-6-16 20:49 , Processed in 0.040102 second(s), 18 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表