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

📄 cflf.cpp

📁 一个基于有限差分法的水滴动画模拟
💻 CPP
字号:
//partdam
//四点平均和五点平均不同,前者流速大一些
//此程序大坝下游测边界不对????????????????????????????????
//时间越小抹的越平
#include"CFLF.h"
CFLF::CFLF(long double dtt,long double nn_time,int nngrid,int nsizex,int nsizey,long double ndxy)
{
	dt=dtt;
	n_time=nn_time;
	ngrid=nngrid;
	sizex=nsizex;
	sizey=nsizey; 
	dxy=ndxy;
//	count=0;
	gridx=new long double*[sizex+10];
	for(int k=0;k<sizex+10;k++)
	gridx[k]=new long double[sizey+10];
	gridy=new long double*[sizex+10];
	for(k=0;k<sizex+10;k++)
	gridy[k]=new long double[sizey+10];

	gv1=new long double*[sizex+10];
	for(k=0;k<sizex+10;k++)
	gv1[k]=new long double[sizey+10];

	gv2=new long double*[sizex+10];
	for(k=0;k<sizex+10;k++)
	gv2[k]=new long double[sizey+10];

	gv3=new long double*[sizex+10];
	for(k=0;k<sizex+10;k++)
	gv3[k]=new long double[sizey+10];

	cv1=new long double*[sizex+10];
	for(k=0;k<sizex+10;k++)
	cv1[k]=new long double[sizey+10];
	
	cv2=new long double*[sizex+10];
	for(k=0;k<sizex+10;k++)
	cv2[k]=new long double[sizey+10];
	
	cv3=new long double*[sizex+10];
	for(k=0;k<sizex+10;k++)
	cv3[k]=new long double[sizey+10];
}
CFLF::~CFLF()
{

	delete []gridx;//节点X坐标
    delete []gridy;

	for(int i=0;i<sizex+10;i++)
		delete []gv1[i];
	delete []gv1;

	for(i=0;i<sizex+10;i++)
		delete []gv2[i];
	delete []gv2;

	for(i=0;i<sizex+10;i++)
		delete []gv3[i];
	delete []gv3;

	for(i=0;i<sizex+10;i++)
		delete []cv1[i];
	delete []cv1;
	for(i=0;i<sizex+10;i++)
		delete []cv2[i];
	delete []cv2;

	for(i=0;i<sizex+10;i++)
		delete []cv3[i];
	delete []cv3;
}
void CFLF::form()
{
	int dummy1;
    long double gridx1,gridy1;
	//先装入结点文件
	ifstream inn("CFLF.D");//创建输入流并打开文件
	if(!inn)
	{
		cerr<<"cannt open salrbook file.\n";
		exit(1);
	}
	cout.precision(20);
	inn.precision(20);
	inn>>dummy1;//读入节点数目
	//要先定义行列数
		for(int i=0;i<=sizex;i++)//分行列存储
	for(int j=0;j<=sizey;j++)


		{
			inn>>gridx1>>gridy1;
			gridx[i][j]=gridx1;
			gridy[i][j]=gridy1;
		}
	//添加界外辅助节点
	for(i=sizex+1;i<=sizex+2;i++)
	for(int j=0;j<=sizey;j++)
	{
		gridx[i][j]=10*i;
		gridy[i][j]=10*j;
	}

	for(int j=sizey+1;j<=sizey+2;j++)
	for(int i=0;i<=sizex;i++)
	{
		gridx[i][j]=10*i;
		gridy[i][j]=10*j;
	}
   for(i=0;i<=sizex+2;i++)
	for(int j=0;j<=sizey+2;j++)
		{
			if((gridx[i][j]>=0.0)&&(gridx[i][j]<400.01))
			{
				gv1[i][j]=10.0;
			    gv2[i][j]=0.0;
			    gv3[i][j]=0.0;

			}
			else
			{
				gv1[i][j]=10.0;
			    gv2[i][j]=0.0;
			    gv3[i][j]=0.0;

			}
		}

//if ((rand() % 16) == 0) 
//	{
//		wavemap[nmap][(rand() % (MAPY-2))+1][(rand() % (MAPX-2))+1] = 50;
//		wavemap[cmap][(rand() % (MAPY-2))+1][(rand() % (MAPX-2))+1] = 50;
//	}
               
                gv1[50][50]=-10.0;
			   gv2[50][50]=0.0;
			   gv3[50][50]=0.0;
          
	inn.close();

}
long double	CFLF::fun1(long double a,long double b)
{
	long double y;
	y=a*a/b+9.8*b*b/2.0;
	return y;
}
//等价于F的表达式的三个维向量(可能有误)
long double CFLF::sv1(long double h1,long double vh1,long double h2,long double vh2,long double dt,long double dxy)
{
	long double y;
	y=0.5*(h1+h2)+0.25*dt/dxy*(vh1-vh2);
	return y;
}
long double CFLF::sv2(long double h1,long double uh1,long double vh1,long double h2,long double uh2,long double vh2,long double dt,long double dxy)
{
	long double y;
	y=0.5*(uh1+uh2)+0.25*dt/dxy*(uh1*vh1/h1-uh2*vh2/h2);
	return y;
}
long double CFLF::sv3(long double h1,long double uh1,long double vh1,long double h2,long double uh2,long double vh2,long double dt,long double dxy)
{
	long double y;
	y=0.5*(vh1+vh2)+0.25*dt/dxy*(fun1(vh1,h1)-fun1(vh2,h2));
	return y;
}
//等价于G的表达式的三个维向量(可能有误)
long double CFLF::sv4(long double h1,long double uh1,long double h2,long double uh2,long double dt,long double dxy)
{
	long double y;
	y=0.5*(h1+h2)+0.25*dt/dxy*(uh1-uh2);
	return y;
}
long double CFLF::sv5(long double h1,long double uh1,long double vh1,long double h2,long double uh2,long double vh2,long double dt,long double dxy)
{
	long double y;
	y=0.5*(uh1+uh2)+0.25*dt/dxy*(fun1(uh1,h1)-fun1(uh2,h2));
	return y;
}
long double CFLF::sv6(long double h1,long double uh1,long double vh1,long double h2,long double uh2,long double vh2,long double dt,long double dxy)
{
	long double y;
	y=0.5*(vh1+vh2)+0.25*dt/dxy*(uh1*vh1/h1-uh2*vh2/h2);
	return y;
}

void CFLF::cvpre()
	{
		long double tv1,tv2,tv3,tv4,tv5,tv6,tv11,tv21,tv31,tv41,tv51,tv61;
		for(int j=0;j<=sizey+2;j++)
	for(int i=0;i<=sizex+2;i++)
			{
				cv1[i][j]=0.0;
				cv2[i][j]=0.0;
				cv3[i][j]=0.0;
			}

			long double temp1,temp2,temp3,temp4,temp5,temp6;
			long double temp7,temp8,temp9,temp10,temp11,temp12;
		for(j=0;j<=sizey;j++)
			for(int i=0;i<=sizex;i++)
			{
						temp1=gv1[i][j];//i,j
			            temp2=gv2[i][j];
			            temp3=gv3[i][j];
					    temp4=gv1[i+1][j];//i+1,j
			            temp5=gv2[i+1][j];
			            temp6=gv3[i+1][j];
					    temp7=gv1[i][j+1];//i,j+1
			            temp8=gv2[i][j+1];
			            temp9=gv3[i][j+1];
					    temp10=gv1[i+1][j+1];//i+1,j+1
			            temp11=gv2[i+1][j+1];
			            temp12=gv3[i+1][j+1];
					    tv1=sv1(temp10,temp12,temp4,temp6,dt,dxy);//对么 ??????
				        tv2=sv2(temp10,temp11,temp12,temp4,temp5,temp6,dt,dxy);	
				        tv3=sv3(temp10,temp11,temp12,temp4,temp5,temp6,dt,dxy);
				        tv11=sv1(temp7,temp9,temp1,temp3,dt,dxy);//对么 ??????			    
					    tv21=sv2(temp7,temp8,temp9,temp1,temp2,temp3,dt,dxy);
				        tv31=sv3(temp7,temp8,temp9,temp1,temp2,temp3,dt,dxy);
					    tv4=sv4(temp10,temp11,temp7,temp8,dt,dxy);
				        tv5=sv5(temp10,temp11,temp12,temp7,temp8,temp9,dt,dxy);
				        tv6=sv6(temp10,temp11,temp12,temp7,temp8,temp9,dt,dxy);
				     	tv41=sv4(temp4,temp5,temp1,temp2,dt,dxy);
				        tv51=sv5(temp4,temp5,temp6,temp1,temp2,temp3,dt,dxy);
				        tv61=sv6(temp4,temp5,temp6,temp1,temp2,temp3,dt,dxy);
				    	cv1[i][j]=0.25*(temp1+temp4+temp7+temp10)+0.5*dt/dxy*(tv1-tv11)+0.5*dt/dxy*(tv4-tv41);
	                    cv2[i][j]=0.25*(temp2+temp5+temp8+temp11)+0.5*dt/dxy*(tv2-tv21)+0.5*dt/dxy*(tv5-tv51);
                        cv3[i][j]=0.25*(temp3+temp6+temp9+temp12)+0.5*dt/dxy*(tv3-tv31)+0.5*dt/dxy*(tv6-tv61);

			}
}
void CFLF::lfgv()
{
		long double tv1,tv2,tv3,tv4,tv5,tv6,tv11,tv21,tv31,tv41,tv51,tv61;
			long double temp1,temp2,temp3,temp4,temp5,temp6;
			long double temp7,temp8,temp9,temp10,temp11,temp12;
		for(int j=1;j<sizey;j++)
			for(int i=1;i<=sizex;i++)
			{
					temp1=cv1[i-1][j-1];//i-1/2,j-1/2
			        temp2=cv2[i-1][j-1];
			        temp3=cv3[i-1][j-1];
					temp4=cv1[i][j-1];//i+1/2,j-1/2
			        temp5=cv2[i][j-1];
			        temp6=cv3[i][j-1];
					temp7=cv1[i-1][j];//i-1/2,j+1/2
			        temp8=cv2[i-1][j];
			        temp9=cv3[i-1][j];
					temp10=cv1[i][j];//i+1/2,j+1/2
			        temp11=cv2[i][j];
			        temp12=cv3[i][j];   
					tv1=sv1(temp10,temp12,temp4,temp6,dt,dxy);//对么 ??????
				    tv2=sv2(temp10,temp11,temp12,temp4,temp5,temp6,dt,dxy);	
				    tv3=sv3(temp10,temp11,temp12,temp4,temp5,temp6,dt,dxy);
				    tv11=sv1(temp7,temp9,temp1,temp3,dt,dxy);//对么 ??????			    
					tv21=sv2(temp7,temp8,temp9,temp1,temp2,temp3,dt,dxy);
				    tv31=sv3(temp7,temp8,temp9,temp1,temp2,temp3,dt,dxy);
					tv4=sv4(temp10,temp11,temp7,temp8,dt,dxy);
				    tv5=sv5(temp10,temp11,temp12,temp7,temp8,temp9,dt,dxy);
				    tv6=sv6(temp10,temp11,temp12,temp7,temp8,temp9,dt,dxy);
					tv41=sv4(temp4,temp5,temp1,temp2,dt,dxy);
				    tv51=sv5(temp4,temp5,temp6,temp1,temp2,temp3,dt,dxy);
				    tv61=sv6(temp4,temp5,temp6,temp1,temp2,temp3,dt,dxy);
					gv1[i][j]=0.25*(temp1+temp4+temp7+temp10)+0.5*dt/dxy*(tv1-tv11)+0.5*dt/dxy*(tv4-tv41);
                    gv2[i][j]=0.25*(temp2+temp5+temp8+temp11)+0.5*dt/dxy*(tv2-tv21)+0.5*dt/dxy*(tv5-tv51);
                    gv3[i][j]=0.25*(temp3+temp6+temp9+temp12)+0.5*dt/dxy*(tv3-tv31)+0.5*dt/dxy*(tv6-tv61);
			}

}

void CFLF::cfgv()
{
	long double temp1,temp2,temp3,temp4,temp5,temp6;
	long double temp7,temp8,temp9,temp10,temp11,temp12;
  for(int j=1;j<sizey;j++)
	  for(int i=1;i<=sizex;i++)
	{
			  //应如何取周围节点???可能不对
					temp1=cv1[i-1][j-1];//i-1/2,j-1/2
			        temp2=cv2[i-1][j-1];
			        temp3=cv3[i-1][j-1];
					temp4=cv1[i][j-1];//i+1/2,j-1/2
			        temp5=cv2[i][j-1];
			        temp6=cv3[i][j-1];
					temp7=cv1[i-1][j];//i-1/2,j+1/2
			        temp8=cv2[i-1][j];
			        temp9=cv3[i-1][j];
					temp10=cv1[i][j];//i+1/2,j+1/2
			        temp11=cv2[i][j];
			        temp12=cv3[i][j]; 
				    gv1[i][j]=gv1[i][j]+0.5*dt/dxy*(temp11+temp5-temp2-temp8+temp12+temp9-temp3-temp6);//疑问???
                    gv2[i][j]=gv2[i][j]+0.5*dt/dxy*(fun1(temp11,temp10)+fun1(temp5,temp4)-fun1(temp2,temp1)-fun1(temp8,temp7)+temp11*temp12/temp10+temp8*temp9/temp7-temp2*temp3/temp1-temp5*temp6/temp4);
                    gv3[i][j]=gv3[i][j]+0.5*dt/dxy*(temp11*temp12/temp10+temp5*temp6/temp4-temp2*temp3/temp1-temp8*temp9/temp7+fun1(temp12,temp10)+fun1(temp9,temp7)-fun1(temp3,temp1)-fun1(temp6,temp4));                
	  }
}

void  CFLF::compute(long double dt,long double& m_time)
{

		for(int k=1;k<=1;k++)
		{
		    cvpre();
            cfgv();
		}
		for(int m=1;m<=1;m++)
		{
		    cvpre();
             lfgv();
		}
		m_time=m_time+2*dt;

}

⌨️ 快捷键说明

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