C++LBM顶盖驱动流
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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]);