C++LBM顶盖驱动流

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

这一段代码源自何雅玲的格子BOLTZMANN方法的理论及应用其后面源代码,经过调试可用,输出文件可以导入到TECPLOT中。使用时,在VISUAL STUDIO中新建一个C++工程,代码赋值进去调试即可。

#include

#include

#include

#include

#include

#include

#include

using namespace std;

const int Q=9; //D2Q9模型

const int NX=256; //X方向

const int NY=256; //Y方向

const double U=0.1; //顶盖速度

int e[Q][2]={{0,0},{1,0},{0,1},{-1,0},{0,-1},{1,1},{-1,1},{-1,-1},{1,-1}};

double w[Q]={4.0/9,1.0/9,1.0/9,1.0/9,1.0/9,1.0/36,1.0/36,1.0/36,1.0/36};

double rho[NX+1][NY+1],u[NX+1][NY+1][2],u0[NX+1][NY+1][2],f[NX+1][NY+1][Q],F[NX+1][NY+1][Q]; int i,j,k,ip,jp,n;

double c,Re,dx,dy,Lx,Ly,dt,rho0,P0,tau_f,niu,error;

void init();

double feq(int k,double rho,double u[2]);

void evolution();

void output(int m);

void Error();

int main()

{

using namespace std;

init();

for(n=0;;n++)

{

evolution();

if(n%100==0)

{

Error();

cout<<"The"<

cout<<"The max relative error of uv

is:"<

if(n>=1000)

{

if(n%1000==0) output(n);

if(error<1.0e-6) break;

}

}

}

return 0;

}

void init()

{

dx=1.0;

dy=1.0;

Lx=dx*double(NY);

Ly=dy*double(NX);

dt=dx;

c=dx/dt; //1.0

rho0=1.0;

Re=1000;

niu=U*Lx/Re;

tau_f=3.0*niu+0.5;

std::cout<<"tau_f="<

for(i=0;i<=NX;i++) //初始化

for(j=0;j<=NY;j++)

{

u[i][j][0]=0;

u[i][j][1]=0;

rho[i][j]=rho0;

u[i][NY][0]=U;

for(k=0;k

{

f[i][j][k]=feq(k,rho[i][j],u[i][j]);

}

}

}

double feq(int k,double rho,double u[2])

{

double eu,uv,feq;

eu=(e[k][0]*u[0]+e[k][1]*u[1]);

uv=(u[0]*u[0]+u[1]*u[1]);

feq=w[k]*rho*(1.0+3.0*eu+4.5*eu*eu-1.5*uv);

return feq;

}

void evolution()

{

for(i=1;i

for(j=1;j

for(k=0;k

{

ip=i-e[k][0];

jp=j-e[k][1];

F[i][j][k]=f[ip][jp][k]+(feq(k,rho[ip][jp],

u[ip][jp])-f[ip][jp][k])/tau_f;

}

for(i=1;i

for(j=1;j

{

u0[i][j][0]=u[i][j][0];

u0[i][j][1]=u[i][j][1];

rho[i][j]=0;

u[i][j][0]=0;

u[i][j][1]=0;

for(k=0;k

{

f[i][j][k]=F[i][j][k];

rho[i][j]+=f[i][j][k];

u[i][j][0]+=e[k][0]*f[i][j][k];

u[i][j][1]+=e[k][1]*f[i][j][k];

}

u[i][j][0]/=rho[i][j];

u[i][j][1]/=rho[i][j];

}

//边界处理

for(j=1;j

for(k=0;k

{

rho[NX][j]=rho[NX-1][j];

f[NX][j][k]=feq(k,rho[NX][j],u[NX][j])+f[NX-1][j][k]-feq(k,rho[NX-1][j],u[NX-1][j]);

相关文档
最新文档