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

📄 pp.hpp

📁 微分方程数值解法实验--二维有限元(用C++实现)
💻 HPP
📖 第 1 页 / 共 2 页
字号:
double Pp::f_j(Pos j)
{
	double ret=0.0;
	int k1,k2,l1,l2,m1,m2;
	k2=(j.getN()-1)%ord;
	k1=(j.getN()-1-k2)/ord;

	int u=0;
	while(u++<6){
		if(u==1){l1=k1;l2=k2-1;m1=k1+1;m2=k2-1;}
		else {l1=m1;l2=m2;}
		if(u==2){m1=k1+1;m2=k2;}
		if(u==3){m1=k1;m2=k2+1;}
		if(u==4){m1=k1-1;m2=k2+1;}
		if(u==5){m1=k1-1;m2=k2;}
		if(u==6){m1=k1;m2=k2-1;}
	    ret+=T6(A[k1][k2].getX(),A[k1][k2].getY(),A[l1][l2].getX(),A[l1][l2].getY(),A[m1][m2].getX(),A[m1][m2].getY())/s(A[k1][k2],A[l1][l2],A[m1][m2]);
	}

	return ret/2.0;

}

void Pp::formMat()
{
	Mat=new double*[xN];          //申请空间
	int i,j;
	for(i=0;i<xN;i++)
		Mat[i]=new double[xN];
	b=new double[xN];
	X=new double[xN];

	int count=0;
	Pos *temp;                 //内点数组
    Pos *e;                    //边界节点数组

            
	temp=new Pos[xN]; 
	e=new Pos[eN];
	INN=new Pos[xN];

	for(i=1,count=0;i<ord-1;i++){
		for(j=1;(j<ord-1)&&(i*ord+j<nodN-1);j++,count++)
		{
			INN[count]=A[i][j];
			temp[count]=A[i][j];
		}
	}

	//放边节点坐标
	for(j=0;j<ord;j++){e[j]=A[0][j];e[end[0]+j]=A[ord-1][j];}
	for(j=1;j<ord-1;j++){e[end[1]+j-1]=A[j][0];e[end[2]+j-1]=A[j][ord-1];}
    //边值
	for(i=0;i<4;i++){
		if(flag[i]!=0){
			if(i<2){
				for(j=0;j<ord;j++){
					if(i==0)eV[i*ord+j]=Ef1(e[i*ord+j].getX(),e[i*ord+j].getY());//input>>eV[i*ord+j]>>c;
					else if(i==1)eV[i*ord+j]=Ef2(e[i*ord+j].getX(),e[i*ord+j].getY());
				}
			}
			else{
				for(j=0;j<ord-2;j++){
					if(i==2)eV[2*ord+(i-2)*(ord-2)+j]=Ef3(e[2*ord+(i-2)*(ord-2)+j].getX(),e[2*ord+(i-2)*(ord-2)+j].getY());
					if(i==3)eV[2*ord+(i-2)*(ord-2)+j]=Ef4(e[2*ord+(i-2)*(ord-2)+j].getX(),e[2*ord+(i-2)*(ord-2)+j].getY());
				}
			}
		}
	}

	//for(i=0;i<eN;i++)cout<<"eV:"<<eV[i]<<endl;cout<<endl;
	for(i=0;i<count;i++){               //内节点
		for(j=0;j<count;j++){
			Mat[i][j]=a(temp[j],temp[i]);
		}
		double r=0.0;              //处理第一边值条件
		for(int l=0;l<4;l++){
			if(flag[l]==1){
				int k=l-1>=0?end[l-1]:0;
				for(;k<end[l];k++)
					r+=a(e[k],temp[i])*eV[k];
			}                      //-----------------
		}
		b[i]=f_j(temp[i])-r;
	}

	delete []temp;
	delete []e;
}

void Pp::Matsolve()
{
	int m,i,j,k;
	int n=xN;
	double **aa;

	aa=new double*[n];              //中间矩阵
	for(i=0;i<n;i++)
		aa[i]=new double[n];
	X=new double[n];

	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
			aa[i][j]=Mat[i][j];
		X[i]=b[i];
	}

	for(m=0;m<n;m++)
		{
			for(i=m;i<n;i++)
				for(k=0;k<m;k++)
					aa[i][m]-=aa[i][k]*aa[k][m];
			for(j=m+1;j<n;j++)
			{
				for(k=0;k<m;k++)
					aa[m][j]-=aa[m][k]*aa[k][j];
				aa[m][j]/=aa[m][m];
			}
		}
		for(i=0;i<n;i++)
		{
			for(k=0;k<i;k++)
				X[i]-=aa[i][k]*X[k];
			X[i]/=aa[i][i];
		}
		for(i=n-1;i>=0;i--)
		{
			for(k=i+1;k<n;k++)
				X[i]-=aa[i][k]*X[k];
		}
		for(i=0;i<n;i++)           //回收
			delete[] aa[i];
		delete[] aa;
		return;
}
/*******************设置边值条件*********************/
void Pp::setE1(double (*func)(double,double),int flag1)
{
	flag[0]=flag1;
	Ef1=func;
	return;
}

void Pp::setE2(double (*func)(double ,double), int flag2)
{
	flag[1]=flag2;
	Ef2=func;
	return;
}
void Pp::setE3( double (*func)(double ,double),int flag3)
{
	flag[2]=flag3;
	Ef3=func;
	return;
}
void Pp::setE4( double (*func)(double ,double),int flag4)
{
	flag[3]=flag4;
	Ef4=func;
	return;
}
/***********************private functions********************************/
int Pp::next(int i,int j)
{
	int ret=-1;
	if((i<=0||i>nodN)||(j<=0||j>nodN))ret=-1;
	if(i==j)ret=0;
	else {
	int k1,k2,l1,l2;
	k2=(i-1)%ord;
	k1=(i-1-k2)/ord;
	l2=(j-1)%ord;
	l1=(j-1-l2)/ord;
	int temp;
	if(k2>l2){temp=k1;k1=l1;l1=temp;temp=k2;k2=l2;l2=temp;}
	if(k2==l2){if((k1==l1-1)||(k1==l1+1))ret=1;}
	else {if(((k1==l1)&&(k2==l2-1))||((k1==l1+1)&&(k2==l2-1)))ret=1;}
	}

	return ret;
}

double Pp::s(Pos i,Pos j,Pos k)
{
	double x1,y1,x2,y2,x3,y3;
	x1=i.getX();y1=i.getY();
	x2=j.getX();y2=j.getY();
	x3=k.getX();y3=k.getY();
	double temp=fabs((x2*y3-x3*y2)-(x1*y3-x3*y1)+(x1*y2-x2*y1))/2;
	return temp;
}

double Pp::ai(Pos i,Pos j,Pos k)
{
	double x2,y2,x3,y3;
	x2=j.getX();y2=j.getY();
	x3=k.getX();y3=k.getY();
	return x2*y3-x3*y2;
}

double Pp::bi(Pos i,Pos j,Pos k)
{
	double y2,y3;
	y2=j.getY();y3=k.getY();
	return y2-y3;
}

double Pp::ci(Pos i,Pos j,Pos k)
{
	double x2,x3;
	x2=j.getX();x3=k.getX();
	return x3-x2;
}

double Pp::point_i(Pos i)         //内点的共i点的三角形"和"
{
	double ret=0.0;
	int k1,k2,l1,l2,m1,m2;
	double b,c;
	k2=(i.getN()-1)%ord;
	k1=(i.getN()-1-k2)/ord;

	int u=0;
	while(u++<6){
		if(u==1){l1=k1;l2=k2-1;m1=k1+1;m2=k2-1;}
		else {l1=m1;l2=m2;}
		if(u==2){m1=k1+1;m2=k2;}
		if(u==3){m1=k1;m2=k2+1;}
		if(u==4){m1=k1-1;m2=k2+1;}
		if(u==5){m1=k1-1;m2=k2;}
		if(u==6){m1=k1;m2=k2-1;}
	    b=bi(i,A[l1][l2],A[m1][m2]);c=ci(i,A[l1][l2],A[m1][m2]);
	    ret+=(b*b+c*c)/fabs(s(i,A[l1][l2],A[m1][m2]));
	}

	return ret;
}

double Pp::edg_ij(Pos i,Pos j)
{
	double ret=0.0;
	int k1,k2,l1,l2,m11,m12,m21,m22;
	double b1,c1,b2,c2;
	k2=(i.getN()-1)%ord;
	k1=(i.getN()-1-k2)/ord;
	l2=(j.getN()-1)%ord;
	l1=(j.getN()-1-l2)/ord;

	if(k2==l2){
		if(k1==l1+1){
			m11=k1-1;m12=k2+1;m21=k1;m22=k2-1;
		}
		else{
			m11=k1+1;m12=k2-1;m21=k1;m22=k2+1;
		}
	}
	else if(k2>l2){
		if(k1==l1){
			m11=k1-1;m12=k2;m21=k1+1;m22=k2-1;
		}
		else {
			m11=k1;m12=k2-1;m21=k1+1;m22=k2;
		}
	}
	else {
		if(k1==l1){
		    m11=k1+1;m12=k2;m21=k1-1;m22=k2+1;
		}
		else {
			m11=k1;m12=k2+1;m21=k1-1;m22=k2;
		}
	}	
	b1=bi(i,A[m11][m12],j);c1=ci(i,A[m11][m12],j);b2=bi(j,i,A[m11][m12]);c2=ci(j,i,A[m11][m12]);
	ret+=(b1*b2+c1*c2)/fabs(s(i,j,A[m11][m12]));
    b1=bi(i,j,A[m21][m22]);c1=ci(i,j,A[m21][m22]);b2=bi(j,A[m21][m22],i);c2=ci(j,A[m21][m22],i);
	ret+=(b1*b2+c1*c2)/fabs(s(i,j,A[m11][m12]));

	return ret;
}


bool Pp::is(int i,int j)   //判断是否有效节点
{
	int c;
	c=i*ord+j;
	if(c>=1&&c<nodN)return true;
	return false;

}




#endif //PP_HPP

⌨️ 快捷键说明

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