level 4
刚刚接触CFD,老师要求写一个简单的CFD,只要二维、无粘滞、不可压缩,哪位大神能提供一个啊,完全不会做。。。
2014年11月10日 03点11分
1
level 6
你可以去看看Anderson的计算流体力学入门,里面有编程的例子,但是好像没代码
2014年11月12日 11点11分
3
level 6
我根据那本书的一个例子自己用c编了个,但是问题不少,勉强能运行,得出结果
2014年11月12日 11点11分
4
level 6
//美制单位,不可压缩,simple算法
#include<stdio.h>
#define UE 1
#define midu 0.002377
#define miu 3.737e-7
#define dx 0.025
#define dy 0.001
#define dt 0.001
#define songchi 0.1
#include<stdlib.h>
void main()
{
int i,j,k,steps,steps_sum;
float p[22][12]={0},u[23][12]={0},v[24][13]={0}; //编号并初始化流场
float _p[22][12]={0},d[22][12]={0};
float liuliang_u[23][12]={0},liuliang_v[24][13]={0};
float A,B,a,b,c,v_1,v_2,u_1,u_2;
for(i=1;i<=22;i++)
u[i][11]=UE;
v[15][5]=0; //给流场一个扰动(当赋给流场一个扰动时,比如0.5,无法收敛,百思不得其解)
for(i=1;i<=22;i++)
liuliang_u[i][11]=midu*UE;
liuliang_v[15][5]=midu*v[15][5];
printf("初始化流场u:\n");
for(j=1;j<=11;j++)
{
for(i=1;i<=22;i++)
printf("%.3f\t",u[i][j]);
printf("\n");
}
printf("初始化流场v:\n");
for(j=1;j<=12;j++)
{
for(i=1;i<=23;i++)
printf("%.3f\t",v[i][j]);
printf("\n");
}
printf("输入时间步数:\n");
scanf("%d",&steps_sum);
for(steps=1;steps<=steps_sum;steps++)
{for(i=2;i<=21;i++) //求流量
for(j=2;j<=10;j++)
{v_1=0.5*(v[i][j+1]+v[i+1][j+1]);
v_2=0.5*(v[i][j]+v[i+1][j]);
A=-((midu*u[i+1][j]*u[i+1][j]-midu*u[i-1][j]*u[i-1][j])/(2*dx)+(midu*u[i][j+1]*v_1-midu*u[i][j-1]*v_2)/(2*dy))
+miu*((u[i+1][j]-2*u[i][j]+u[i-1][j])/(dx*dx)+(u[i][j+1]-2*u[i][j]+u[i][j-1])/(dy*dy));
liuliang_u[i][j]=midu*u[i][j]+A*dt-(dt/dx)*(p[i][j]-p[i-1][j]);
}
for(i=2;i<=22;i++) //求流量
for(j=2;j<=11;j++)
{u_1=0.5*(u[i][j-1]+u[i][j]);
u_2=0.5*(u[i-1][j-1]+u[i-1][j]);
B=-((midu*v[i+1][j]*u_1-midu*v[i-1][j]*u_2)/(2*dx)+(midu*v[i][j+1]*v[i][j+1]-midu*v[i][j-1]*v[i][j-1])/(2*dy))
+miu*((v[i+1][j]-2*v[i][j]+v[i-1][j])/(dx*dx)+(v[i][j+1]-2*v[i][j]+v[i][j-1])/(dy*dy));
liuliang_v[i][j]=midu*v[i][j]+B*dt-(dt/dy)*(p[i-1][j]-p[i-1][j-1]);
}
for(i=2;i<=21;i++) //求u,v
for(j=2;j<=10;j++)
u[i][j]=liuliang_u[i][j]/midu;
for(i=2;i<=22;i++)
for(j=2;j<=11;j++)
v[i][j]=liuliang_v[i][j]/midu;
for(j=1;j<=11;j++) //u边界插值
{u[1][j]=u[2][j];u[22][j]=u[21][j];}
for(j=1;j<=12;j++)
v[23][j]=v[22][j];
printf("%d个时间步后:\n",steps);
printf("由u方向流量求得u:\n");
for(j=1;j<=11;j++)
{
for(i=1;i<=22;i++)
printf("%.3f\t",u[i][j]);
printf("\n");
}
printf("由v方向流量求得v:\n");
for(j=1;j<=12;j++)
{
for(i=1;i<=23;i++)
printf("%.3f\t",v[i][j]);
printf("\n");
}
//压力修正_p
a=2*(dt/(dx*dx)+dt/(dy*dy));
b=-dt/(dx*dx);
c=-dt/(dy*dy);
for(i=2;i<=20;i++)
for(j=2;j<=10;j++)
d[i][j]=(liuliang_u[i+1][j]-liuliang_u[i][j])/dx+(liuliang_v[i+1][i+1]-liuliang_v[i+1][j])/dy;
// 解压力修正的泊松方程
float _p_;
for(k=1;k<=100;k++)
{for(i=2;i<=20;i++)
for(j=2;j<=10;j++)
{_p_=-(b*_p[i+1][j]+b*_p[i-1][j]+c*_p[i][j+1]+c*_p[i][j-1]+d[i][j])/a;
_p[i][j]=_p[i][j]+0.1*(_p_-_p[i][j]);
}
}
//打印压力修正p次
printf("p次:\n");
for(j=2;j<=10;j++)
{
for(i=2;i<=20;i++)
printf("%.4f\t",_p[i][j]);
printf("\n");
}
for(i=2;i<=20;i++)
for(j=2;j<=20;j++)
p[i][j]+=(songchi*_p[i][j]);
printf("\n");
//判断收敛
}
system("pause");
}
2014年11月12日 11点11分
5
这用的是以瞬态求稳态的方法,所有里边有瞬态项了
2014年11月12日 11点11分
@鬼苹果_ 请问你这个程序求解的流场是什么形状的啊,能把求解条件,流场形状的图片发一下吗
2018年11月19日 07点11分