⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 顶盖驱动流(lid friven flow)格子Boltzmann模拟程序代码
💻 CPP
字号:
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <iomanip>
#include <fstream>
#include <sstream>
#include <string>

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][NX+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"<<n<<"th computation result:"<<endl<<"The u,v of point(NX/2,NY/2) is :"<<setprecision(6)<<u[NX/2][NY/2][0]<<","<<u[NX/2][NX/2][1]<<endl;
			cout<<"The max relation error of nv is :"<<setiosflags(ios::scientific)<<error<<endl;
			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 = 8000;
	niu = U*Lx/Re;
	tau_f = 3.0*niu + 0.5;
	std::cout<<"tau_f="<<tau_f<<endl;

	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 < Q;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<NX;i++)
	   for(j=1;j<NY;j++)
          for(k=0;k<Q;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 < NX;i++)
		     for(j = 1;j < NY;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 < Q;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 < NY;j++)
			    for(k = 0;k < Q;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]);
					rho[0][j] = rho[1][j];
					f[0][j][k] = feq(k,rho[0][j],u[0][j]) + f[1][j][k] - feq(k,rho[1][j],u[1][j]);
				}
             for(i = 0;i <= NX;i++)
			    for(k = 0;k < Q;k++)
				{
					rho[i][0] = rho[i][1];
					f[i][0][k] = feq(k,rho[i][0],u[i][0]) + f[i][1][k] - feq(k,rho[i][1],u[i][1]);

					rho[i][NY] = rho[i][NY - 1];
					u[i][NY][0] = U;
					f[i][NY][k] = feq(k,rho[i][NY],u[i][NY]) + f[i][NY - 1][k] - feq(k,rho[i][NY - 1],u[i][NY -1]);
				}
}

void output(int m)
{
	ostringstream name;
	name << "cavity_"<<m<<".dat";
	ofstream out(name.str().c_str());
	out << "Title = \"LBM Lid Driven Flow\"\n" << "VARIABLES = \"X\",\"Y\",\"U\",\"V\"\n" << "Zone T = \"BOX\",I = "<< NX + 1 << ",J="<<NY + 1<< ",F = POINT"<<endl;
	for(j = 0 ;j <= NY ;j++)
		for(i = 0;i <= NX ;i++)
		{
			out << double(i) /Lx << " " <<double(j)/Ly << " " <<u[i][j][0] << " " <<u[i][j][1] << endl;
		}
}

void Error()
{
	double temp1,temp2;
	temp1 = 0;
	temp2 = 0;
	for(i = 1;i < NX;i++)
	   for(j = 1;j < NY;j++)
	   {
		   temp1 += ((u[i][j][0] - u0[i][j][0])*(u[i][j][0] - u0[i][j][0]) + (u[i][j][1] - u0[i][j][1])*(u[i][j][1] - u0[i][j][1]));
		   temp2 += (u[i][j][0]*u[i][j][0] + u[i][j][1]*u[i][j][1]);
	   }
	   temp1 = sqrt(temp1);
	   temp2 = sqrt(temp2);
	    error = temp1/(temp2 + 1e-30);
}

         






⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -