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

[学习资源] Anderson英文版计算流体力,SIMPLE 算法计算流场程序分享

[复制链接]
发表于 2013-10-8 20:58:57 | 显示全部楼层 |阅读模式 来自 上海
本帖最后由 scott198510 于 2013-10-8 22:34 编辑


  1. % A program of incompressible Couette flow in 2D
  2. % based on pressure correction (SIMPLE) algorithm.
  3. % Written by scott , Oct, 2013

  4. % Based on John D. Anderson, JR., section 9.4, Chapter 9, In
  5. % Computational Fluid Dynamics, The Basics with Applications,McGraw-Hill, 2002, 4
  6. clc;clear all; close all;
  7. nx=21;%x方向网格数
  8. ny=11;%y方向网格数
  9. nstop=1000;%迭代步数
  10. x=zeros(nx,1);%矩阵预分配
  11. y=zeros(ny,1);%矩阵预分配
  12. p=zeros(nx,ny);%矩阵预分配
  13. u=zeros(nx+1,ny);%矩阵预分配
  14. v=zeros(nx+2,ny+1);%矩阵预分配


  15. ru=zeros(nx+1,ny);%矩阵预分配
  16. rv=zeros(nx+2,ny+1);%矩阵预分配
  17. ux=zeros(nx+1,ny);%矩阵预分配
  18. vx=zeros(nx+2,ny+1);%矩阵预分配


  19. px=zeros(nx,ny);%矩阵预分配
  20. rux=zeros(nx+1,ny);%矩阵预分配
  21. rvx=zeros(nx+2,ny+1);%矩阵预分配
  22. d=zeros(nx,ny);%矩阵预分配

  23. ppm=zeros(nx,ny);%矩阵预分配
  24. ppb=zeros(nx,ny);%矩阵预分配
  25. pp=zeros(nx,ny);%矩阵预分配
  26. cri=zeros(nx,ny);%矩阵预分配
  27. % initial parameter
  28. xl=0.5; %x方向长度 单位英尺
  29. yl=0.01;%y方向长度 单位英尺
  30. dx=xl/(nx-1); %x方向单位长度
  31. dy=yl/(ny-1);%y方向单位长度
  32. dt=0.001;%单位时间
  33. re=63.6;%雷诺数
  34. r=0.002377;%密度ρ
  35. vis=yl*1*r/re;%粘性系数
  36. fct1=0.5;
  37. fct2=0.1;
  38. for i=1:nx
  39. x(i)=(i-1)*xl/(nx-1);%x方向区域网格化
  40. end
  41. for j=1:ny
  42. y(j)=(j-1)*yl/(ny-1);%x方向区域网格化
  43. end
  44. for i=1:nx+1 %u迭代区域 x:1-22, y:1-11
  45. for j=1:ny
  46. ux(i,j)=0.0;%u*初始化
  47. u(i,j)=0.0; %u初始化
  48. if (j==ny) %u的上边界位置特定值
  49. u(i,j)=1.0; %u=1
  50. rux(i,j)=r*ux(i,j);%ρu*
  51. end
  52. end
  53. end
  54. for i=1:nx+2 %u迭代区域 x:1-23, y:1-12
  55. for j=1:ny+1
  56. vx(i,j)=0.0; %v*初始化
  57. v(i,j)=0.0; %v初始化
  58. if (i==15&&j==5) %设置特殊点(15,5)速度
  59. vx(i,j)=0.5;
  60. rvx(i,j)=r*vx(i,j);%ρv*
  61. end
  62. end
  63. end
  64. for i=1:nx %压力场p迭代区域 x:1-21, y:1-11
  65. for j=1:ny
  66. px(i,j)=0.0; %p*初始化
  67. p(i,j)=0.0; %p初始化
  68. pp(i,j)=0.0; % p'初始化
  69. end
  70. end

  71. for nstep=1:nstop; %迭代计算部分

  72. % Pressure correction (SIMPLE) algorithm
  73. % step 1. solve at n+1 step : ρu* and ρv*
  74. % 1. for ru and u

  75. for i=1:nx-1 %以(5,3)作为中心点 即(i,j)对应(5,3)
  76. for j=2:ny-1
  77. vb=0.5*(v(i+1,j+1)+v(i+2,j+1));%v平
  78. vbb=0.5*(v(i+1,j)+v(i+2,j));%v2平
  79. ruu53=r*u(i+2,j)*u(i+2,j);%(ρu^2)53
  80. ruu33=r*u(i,j)*u(i,j);%(ρu^2)33
  81. ruv44=r*u(i+1,j+1)*vb; %(ρuvb)44
  82. ruv42=r*u(i+1,j-1)*vbb;%(ρuvbb)42
  83. uu1=(u(i+2,j)-2*u(i+1,j)+u(i,j))/dx/dx;%u(i+2,j):u53,u(i+1,j):u43,u(i,j):u33
  84. uu2=(u(i+1,j+1)-2*u(i+1,j)+u(i+1,j-1))/dy/dy;%u(i+1,j+1):u44,u(i+1,j):u43,u(i+1,j-1):u42
  85. ax=-((ruu53-ruu33)/2/dx+(ruv44-ruv42)/2/dy)+vis*(uu1+uu2);%A*整项
  86. rux(i+1,j)=rux(i+1,j)+ax*dt-dt/dx*(px(i+1,j)-px(i,j));%(ρu*)43 in n+1 step 对应式子(9.58)
  87. ux(i+1,j)=rux(i+1,j)/r; %(u*)43 in n+1 step
  88. end
  89. end

  90. for j=2:ny-1
  91. ux(1,j)=ux(2,j);%上边界赋值 u1j*=u2j*
  92. ux(nx+1,j)=ux(nx,j);%下边界赋值 u22j*=u21j*
  93. end

  94. % 2. for rv and v

  95. for i=1:nx %以(3,3)作为中心点 即(i,j)对应(3,3)
  96. for j=1:ny-1
  97. ub=0.5*(u(i+1,j)+u(i+1,j+1));%u平
  98. ubb=0.5*(u(i,j)+u(i,j+1)); %u2平
  99. rvv45=r*v(i+1,j+2)*v(i+1,j+2); %(ρv^2)45
  100. rvv43=r*v(i+1,j)*v(i+1,j); %(ρv^2)43
  101. rvu54=r*v(i+2,j+1)*ub; %(ρvub)54
  102. rvu34=r*v(i,j+1)*ubb; %(ρvubb)34
  103. vv1=(v(i+2,j+1)-2*v(i+1,j+1)+v(i,j+1))/dx/dx;%u(i+2,j+1):v54,u(i+1,j+1):v44,u(i,j+1):v34
  104. vv2=(v(i+1,j+2)-2*v(i+1,j+1)+v(i+1,j))/dy/dy;%u(i+1,j+2):v45,u(i+1,j+1):v44,v(i,j+1):v43
  105. bx=-((rvv45-rvv43)/2/dy+(rvu54-rvu34)/2/dx)+vis*(vv1+vv2);%B*整项
  106. rvx(i+1,j+1)=rvx(i+1,j+1)+bx*dt-dt/dy*(px(i,j+1)-px(i,j));%(ρv*)44 in n+1 step 对应式子(9.59)
  107. vx(i+1,j+1)=rvx(i+1,j+1)/r; %(v*)44 in n+1 step
  108. end
  109. end

  110. for j=2:ny
  111. vx(nx+2,j)=vx(nx+1,j);%下边界赋值 v23j*=v22j*
  112. end

  113. % step 2. solve p' from pressure correction formula
  114. % by relaxation method (inner iteration)
  115. a=2*(dt/dx/dx+dt/dy/dy);% 对应(6.104)式子a值
  116. b=-dt/dx/dx; % 对应(6.104)式子b值
  117. c=-dt/dy/dy;% 对应(6.104)式子c值
  118. tiny2=0; %设定值
  119. for i=2:nx-1
  120. for j=2:ny-1
  121. pp(i,j)=0;
  122. d(i,j)=(rux(i+1,j)-rux(i,j))/dx+(rvx(i+1,j+1)-rvx(i+1,j))/dy;% 对应(6.104)式子d值
  123. end
  124. end
  125. for nii=1:1000
  126. tiny1=0;
  127. for i=2:nx-1
  128. for j=2:ny-1 %再以(3,3)作为中心点 即(i,j)对应(3,3)
  129. ppb(i,j)=-1/a*(b*pp(i+1,j)+b*pp(i-1,j)+c*pp(i,j+1)+c*pp(i,j-1)+d(i,j));% 式(9.60) p33'
  130. ppm(i,j)=pp(i,j)+fct1*(ppb(i,j)-pp(i,j));%迭代后的pp
  131. cri(i,j)=abs(ppm(i,j)-pp(i,j))/abs(ppm(i,j));%计算增量
  132. pp(i,j)=ppm(i,j);%迭代后赋值
  133. if (cri(i,j)>=tiny1)
  134. tiny1=cri(i,j);
  135. end
  136. if (abs(d(i,j))>=tiny2)
  137. tiny2=d(i,j);
  138. end
  139. end
  140. end
  141. if (tiny1<=0.0001); break,end %小于设定值时,即认为已经收敛
  142. end
  143. % step 3. calculate p at n+1 step
  144. for i=2:nx-1
  145. for j=2:ny-1
  146. p(i,j)=px(i,j)+fct2*pp(i,j);%对应 式子(6.106)
  147. end
  148. end
  149. % step 4. calculate u and v at n+1 step
  150. for i=1:nx-1
  151. for j=1:ny
  152. u(i+1,j)=ux(i+1,j)-dt/dx/r*(pp(i+1,j)-pp(i,j)); % u更新
  153. end
  154. end
  155. for i=1:nx
  156. for j=1:ny-1
  157. v(i+1,j+1)=vx(i+1,j+1)-dt/dy/r*(pp(i,j+1)-pp(i,j));% v更新
  158. end
  159. end
  160. % update boundary conditions
  161. for i=1:nx
  162. pp(i,ny)=0;
  163. pp(i,1)=0;
  164. end
  165. for i=1:nx+1
  166. u(i,ny)=1;
  167. u(i,1)=0;
  168. end
  169. for i=1:nx+2
  170. v(i,ny+1)=0;
  171. v(i,1)=0;
  172. end
  173. for j=1:ny
  174. pp(1,j)=0;
  175. pp(nx,j)=0;
  176. end
  177. for j=1:ny
  178. u(1,j)=u(2,j);
  179. u(nx+1,j)=u(nx,j);
  180. end
  181. for j=1:ny+1
  182. v(1,j)=0;
  183. v(nx+2,j)=v(nx+1,j);
  184. end

  185. % step 5. check the primary iteration
  186. for i=2:nx-1
  187. for j=2:ny-1
  188. px(i,j)=p(i,j);
  189. end
  190. end
  191. end
  192. figure,surf(p) % pressure distribution in cavity
  193. figure,contour(p,15) % pressure distribution in cavity
  194. figure,surf(u) % u component of velocity
  195. figure,contour(u,15) %u component of velocity
  196. figure,surf(v) %v component of velocity
  197. figure,contour(v,15)%v component of velocity</P>
  198. set(gcf,'color','w');


复制代码
SIMPLE 算法在不可压缩流场中应用广泛,看到有不少做这方面的开发的,附上 John D. Anderson  英文版计算流体力学,
section 9.4, Chapter 9,采用SIMPLE 算法的算例的程序,程序采用matlab语言编写,属原创。

本帖子中包含更多资源

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

×
发表于 2013-10-9 12:27:54 | 显示全部楼层 来自 广东广州
Simdroid开发平台
好资料 谢谢分享
回复 不支持

使用道具 举报

发表于 2013-10-19 11:24:37 | 显示全部楼层 来自 湖南长沙
不错,好好学习一下,一直先做这个开发
回复 不支持

使用道具 举报

 楼主| 发表于 2013-10-19 23:18:51 | 显示全部楼层 来自 上海
pank 发表于 2013-10-19 11:24
不错,好好学习一下,一直先做这个开发
  1.       
  2.      clc;clear all;close all;
  3.       u=zeros(32,1);uf=zeros(33,1);
  4.       a=zeros(33,1);p=zeros(32,1);
  5.       pp=zeros(32,1);aa=zeros(32,1);
  6.       su=zeros(32,1); aup=zeros(33,1);
  7.       aue=zeros(33,1);auw=zeros(33,1);
  8.       ap=zeros(32,1);ae=zeros(32,1);
  9.       aw=zeros(32,1);s=zeros(32,1);
  10.       
  11.      dx=0.01;
  12.       for i=1:33
  13.                 aaa=0.1/16^2;
  14.                 bb=0.1;
  15.                 a(i)=aaa*((i-17).^2)+bb;
  16.       end
  17.                 for i=1:32
  18.                    aa(i)=0.5*(a(i)+a(i+1));
  19.         end
  20.   % 密度参数设置
  21.                 den=1000;
  22.   % 边界条件设置
  23.                 u(1)=10;
  24.                 u(32)=10;
  25.                 viscos=0.001;
  26.    %面对速度的边界条件
  27.                 uf(1)=10;
  28.                 uf(33)=10;
  29.    % 初始条件设置
  30.           for i=2:32
  31.              u(i)=10;
  32.              uf(i)=10;
  33.              p(i)=0;
  34.       end
  35.    % 循环 (迭代开始)
  36. for N=1:1000
  37.   % 二维网格解动量守恒方程
  38.           for i=2:32
  39.           aue(i)=max(abs(den*u(i)*aa(i)/2),viscos*aa(i)/dx)-den*u(i)*aa(i)/2;
  40.           auw(i)=max(abs(den*u(i-1)*aa(i-1)/2),viscos*aa(i-1)/dx) +den*u(i-1)*aa(i-1)/2;
  41.           su(i)=a(i)*(p(i-1)-p(i));
  42.           aup(i)=auw(i)+aue(i);
  43.       end
  44. %==== write(6,*)aue(10),auw(10),aup(10),su(10),' aue,auw,aup,su'
  45. %  small iterations
  46.           for i=2:32
  47.             uf(i)=(aue(i)*uf(i+1)+auw(i)*uf(i-1)+su(i))/aup(i);
  48.           end
  49. % extrapolation
  50.           aue(1)=aue(2);
  51.           auw(1)=auw(2);
  52.           aue(33)=aue(32);
  53.           auw(33)=auw(32);
  54. %  主网格解压力修正方程
  55.           for i=2:31
  56.           aw(i)=den*a(i).^2/aup(i);
  57.           ae(i)=den*a(i+1).^2/aup(i+1);
  58.           ap(i)=aw(i)+ae(i);
  59.           s(i)=den*a(i)*uf(i)-den*a(i+1)*uf(i+1);
  60.       end
  61. % set pp=0
  62.           for i=1:32
  63.              pp(i)=0;
  64.       end
  65. % small iterations
  66.           for its=1:30
  67.           for i=2:31
  68.           pp(i)=(ae(i)*pp(i+1)+aw(i)*pp(i-1)+s(i))/ap(i);
  69.           end
  70.           end  
  71. % correct velocity
  72.           for i=2:32
  73.           uf(i)=uf(i)+(pp(i-1)-pp(i))*a(i)/aup(i);
  74.           end
  75. % interpolation
  76.           for i=1:32
  77.           u(i)=0.5*(uf(i+1)+uf(i));
  78.           end
  79. % correct pressure
  80.           for i=2:31
  81.             p(i)=p(i)+0.1*pp(i);
  82.       end         
  83. % extrapolation
  84.           p(1)=2.*p(2)-p(3);
  85.           p(32)=2.*p(31)-p(30);
  86. end
复制代码
再发一个。
回复 不支持

使用道具 举报

发表于 2013-10-23 09:15:41 | 显示全部楼层 来自 湖南长沙
非常感谢scott198510的无私共享!
回复 不支持

使用道具 举报

发表于 2014-4-8 17:14:32 | 显示全部楼层 来自 美国
感谢楼主,先收藏了,细细拜读
回复 不支持

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-17 09:45 , Processed in 0.035619 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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