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

📄 平面应力分析.cpp

📁 以上上传的内容是有关于平面应力分析的程序
💻 CPP
字号:
#include<iostream.h>
#include<math.h>
#include<iomanip.h>
const int sunyongle=0;
class CST{
public:
	double RY[60],RX[60],B[3],C[3],DEL;
	double SK[12000],EK[21];
	double D1,D2,D3,EO,PO,t;
	double X[500],Y[500],U[1000];
	int NRX[60],NRY[60],JU[50],JV[50],JE[700][3],JD[1000],JLL[6];
	int NN,NE,NF,LK,KU,KV,KRX,KRY;
	int K1,K2,K3,KK;
	double BM[3][6],CM[3][6];
	 
public:
	//数据初始化
	CST(){
		t=1;
	}
	//数据输入程序
	void dataInput1(){
		//输入弹性模量EO,泊松比PO,厚度t
         
		//输入结点数NN,单元总数NE

		//输入结点坐标X[N],Y[N]
		//输入结点编号JE[N][3]

		//输入约束:

		//输入X约束结点数KU
		//输入X方向位移约束的结点号JU[KU]
		//输入Y约束结点数KV
		//输入Y方向位移约束的结点号JV[KV]

		//输入载荷:

		//输入X载荷结点数KRX
		//输入X方向载荷结点编号NRX[KRX]
		//输入X方向结点载荷大小NX[KRX]
		//输入Y方向载荷结点数KRY
		//输入Y方向载荷结点编号NRY[KRY]
		//输入Y方向结点载荷大小NY[KRY]
	}
	void dataInput2(){
		cout<<"请输入弹性模量EO,泊松比PO,厚度t:";
		cin>>EO>>PO>>t;
        //输入结点和单元数
		cout<<"请输入结点数NN,单元总数NE:";
		cin>>NN>>NE;
        //输入结点坐标
		cout<<"请输入"<<NN<<"个结点坐标X:";
		for(int i=0;i<NN;i++)
			cin>>X[i];
		cout<<"请输入"<<NN<<"个结点坐标Y:";
		for(int j=0;j<NN;j++)	 
			cin>>Y[j];
        //输入结点编号
		cout<<"请输入"<<NN<<"×3个结点编号JE:"<<endl;
		for(i=0;i<NE;i++)
		{
			cout<<"第"<<i+1<<"个单元结点编号:";
			for(j=0;j<3;j++){
				cin>>JE[i][j];
				JE[i][j]--;
			}
		}
        //输入约束
		cout<<"请输入X约束结点数KU,Y约束结点数KV:";
		cin>>KU>>KV;		
		cout<<"请输入X方向位移约束的结点号JU:";
		for(i=0;i<KU;i++){
			cin>>JU[i];
			JU[i]--;
		}
		cout<<"请输入Y方向位移约束的结点号JV:";
		for(i=0;i<KV;i++){
			cin>>JV[i];
			JV[i]--;
		}
        //输入载荷
		cout<<"请输入X载荷结点数KRX,Y载荷结点数KRY:";
		cin>>KRX>>KRY;
		cout<<"请输入X方向载荷结点编号NRX:";
		for(i=0;i<KRX;i++){
			cin>>NRX[i];
			NRX[i]--;
		}
		cout<<"请输入X方向结点载荷大小NX:";
		for(i=0;i<KRX;i++)
			cin>>RX[i];
		cout<<"请输入Y方向载荷结点编号NRY:";
		for(i=0;i<KRY;i++){
			cin>>NRY[i];
			NRY[i]--;
		}	
		cout<<"请输入Y方向结点载荷大小NY:";
		for(i=0;i<KRY;i++)
			cin>>RY[i];
	}
	//数据测试1
	void dataTest1(){	
		EO=6.93;PO=0.3;         
		NN=4;NE=2;t=2;
        //输入结点坐标
		X[0]=0;X[1]=0;X[2]=2;X[3]=2;
		Y[0]=1;Y[1]=0;Y[2]=0;Y[3]=1;
        //输入结点编号		 
		JE[0][0]=0;JE[0][1]=1;JE[0][2]=3;
		JE[1][0]=1;JE[1][1]=2;JE[1][2]=3;
        //输入约束	 
		KU=KV=2;			 
		JU[0]=0;JU[1]=1;
		JV[0]=0;JV[1]=1;
        //输入载荷	 
		KRX=2;KRY=0;
		NRX[0]=2;NRX[1]=3;
		RX[0]=1;RX[1]=1;
	}
	//数据测试2
	void dataTest2(){
		EO=1;PO=0;         
		NN=6;NE=4;//t=1;
        //输入结点坐标
		X[0]=0;X[1]=0;X[2]=1;X[3]=0;X[4]=1;X[5]=2;
		Y[0]=2;Y[1]=1;Y[2]=1;Y[3]=0;Y[4]=0;Y[5]=0;
        //输入结点编号		 
		JE[0][0]=2;JE[0][1]=0;JE[0][2]=1;
		JE[1][0]=4;JE[1][1]=1;JE[1][2]=3;
		JE[2][0]=1;JE[2][1]=4;JE[2][2]=2;
		JE[3][0]=5;JE[3][1]=2;JE[3][2]=4;
        //输入约束	 
		KU=KV=3;			 
		JU[0]=0;JU[1]=1;JU[2]=3;
		JV[0]=3;JV[1]=4;JV[2]=5;
        //输入载荷	 
		KRX=2;KRY=2;
		NRX[0]=2;NRX[1]=5;
		RX[0]=-1;RX[1]=-0.5;
		NRY[0]=0;NRY[1]=2;
		RY[0]=-1.5;RY[1]=-1;
	}
	//数据测试3
	void dataTest3(){
		EO=1;PO=0;         
		NN=3;NE=1;t=1;
        //输入结点坐标
		X[0]=3;X[1]=0;X[2]=0;
		Y[0]=0;Y[1]=0;Y[2]=4;
        //输入结点编号		 
		JE[0][0]=0;JE[0][1]=2;JE[0][2]=1;
        //输入约束	 
		KU=2;KV=1;			 
		JU[0]=1;JU[1]=2;
		JV[0]=1;
        //输入载荷	 
		KRX=0;KRY=1;
		NRY[0]=0;
		RY[0]=-1;
	}
	//核对数据信息
	bool dataCheck(){
		int s=0;char key;bool command=false;
		cout<<"请确认信息:"<<endl;		
		cout<<"弹性模量EO="<<EO<<"\t"<<"泊松比PO="<<PO<<"\t"<<"厚度t="
			<<t<<"\t"<<"结点数NN="<<NN<<"\t"<<"单元总数NE="<<NE<<endl;
        //输出结点坐标
		cout<<NN<<"个结点坐标:";
		for(int i=0;i<NN;i++){
			cout<<i+1<<"("<<X[i]<<","<<Y[i]<<")"<<"\t";
		}
		cout<<endl;
        //输出结点编号		 
		for(i=0;i<NE;i++)
		{
			cout<<"第"<<i+1<<"个单元结点编号:";
			for(int j=0;j<3;j++){
				s=JE[i][j];
				s++;
				cout<<s<<"\t";				
			}
			cout<<endl;
		}
        //输出约束
		cout<<"X约束结点数KU="<<KU<<":"<<"\t";		
		for(i=0;i<KU;i++){
			s=JU[i];
			s++;
			cout<<s<<"\t";
		}
		cout<<endl;		 
		cout<<"Y约束结点数KV="<<KV<<":"<<"\t";
		for(i=0;i<KV;i++){
			s=JV[i];
			s++;
			cout<<s<<"\t";
		}
		cout<<endl;
        //输出载荷
		//X:
		cout<<"X载荷结点数KRX="<<KRX<<":"<<"\t";
		for(i=0;i<KRX;i++){
			s=NRX[i];
			s++;
			cout<<s<<"\t";
		}
		cout<<endl;
		cout<<"X方向结点载荷大小NX"<<"\t";
		for(i=0;i<KRX;i++)
			cout<<RX[i]<<"\t";
		cout<<endl;
		//Y:
		cout<<"Y载荷结点数KRY="<<KRY<<":"<<"\t";	
		for(i=0;i<KRY;i++){
			s=NRY[i];
			s++;
			cout<<s<<"\t";
		}
		cout<<endl;	
		cout<<"Y方向结点载荷大小NY"<<"\t";
		for(i=0;i<KRY;i++)
			cout<<RY[i]<<"\t";
		cout<<endl;
		//请求用户确认
		s=1;
		while(s){
			cout<<"是否要进行计算?Y/N "<<"\t";
			cin>>key;
			if(key=='y'||key=='Y'){
				command=true;
				s=0;
			}
			else {
				if(key=='n'||key=='N'){
					command=false;
					s=0;
				}
				else
					cout<<"请输入正确的选择!"<<endl;
			}
		}
		return command;
	}
	//数据处理程序
	void dataTackle(){
		NF=2*NN;//结点位移总数		
		SKDD();        
		//平面弹性矩阵[D]
		D1=EO/(1.0-PO*PO);
	    D2=D1*PO;
		D3=D1*(1.0-PO)/2;      
		//总刚度矩阵初始化
		for(int i=0;i<LK;i++)
			SK[i]=0;	 
        //储存载荷至矩阵[U]
		for(i=0;i<NF;i++)
			U[i]=0;
		for(i=0;i<KRX;i++)
		{
			K1=2*NRX[i];
			U[K1]=RX[i];
		}
		for(i=0;i<KRY;i++)
		{
			K1=2*NRY[i]+1;
			U[K1]=RY[i];
		}
		for(i=0;i<NE;i++)
		{			
			SHAPE(i);//计算第i个单元形状参数			
			FEK(i);//计算单元刚度矩阵值EK
			SKKE();		
		}
		KDisplay();	//输出总刚度矩阵K
		//处理单元约束
		for(i=0;i<KU;i++)
			FIXED(2*JU[i]);
		for(i=0;i<KV;i++)
			FIXED(2*JV[i]+1);		
		FDisplay(); //输出处理约束后的载荷				
		SOLVE();//计算结点位移		
		UDisplay();//输出结点位移      
		//计算单元应力
		for(i=0;i<NE;i++){
			SHAPE(i);
			STRESS();
		}
	}
	//SKDD():计算总刚度矩阵主对角元一维存储序号
	void SKDD(){
		JD[0]=0;
		JD[1]=2;
		int JO,IO,KO,M1,M2,M3;
		for(int N=1;N<NN;N++)
		{
			//计算半带宽KK
			KK=0;
			for(int i=0;i<NE;i++){
				IO=JE[i][0];
				JO=JE[i][1];	
				KO=JE[i][2];
				if(IO==N||JO==N||KO==N){				
					M1=N-IO;
					M2=N-JO;
					M3=N-KO;
					if(M1>KK) KK=M1;
					if(M2>KK) KK=M2;
					if(M3>KK) KK=M3;
				}	 	
			}
			KK=2*KK;			
			JD[2*N]=JD[2*N-1]+KK+1;
			JD[2*N+1]=JD[2*N]+KK+2;
			LK=JD[NF-1]+1;								
		}
		cout<<"弹性矩阵SK的长度为:LK="<<LK<<endl;	
	}
	//SHAPE(int):计算单元形状参数
	void SHAPE(int N){	     
		double XO[6],YO[6];
		for(int I=0;I<3;I++){
			K1=JE[N][I];			
			K2=I+3;
			XO[I]=X[K1];
			XO[K2]=XO[I];
			YO[I]=Y[K1];
			YO[K2]=YO[I];
			K2=2*I;
			K3=K2+1;
			JLL[K2]=K1*2;
			JLL[K3]=K1*2+1;
		}
		for(I=0;I<3;I++){
			K1=I+1;
			K2=I+2;
			B[I]=YO[K1]-YO[K2];
			C[I]=XO[K2]-XO[K1];
		}
		DEL=(B[1]*C[2]-B[2]*C[1])/2;
	}
	//FEK(int):计算单元刚度矩阵值EK
	void FEK(int i){		
		double Z;
		for(int	I=0;I<3;I++){
			for(int J=0;J<6;J++){
				BM[I][J]=0;
				CM[I][J]=0;
			}
		}
		for(I=0;I<3;I++){
			K2=I+I+1;
			K1=K2-1;
			BM[0][K1]=B[I];
			BM[2][K2]=B[I];
			BM[1][K2]=C[I];
			BM[2][K1]=C[I];
			CM[0][K1]=D1*B[I];
			CM[0][K2]=D2*C[I];
			CM[1][K1]=D2*B[I];
			CM[1][K2]=D1*C[I];
			CM[2][K1]=D3*C[I];
			CM[2][K2]=D3*B[I];
		}		
		for(I=0;I<6;I++){			
			K1=I*(I+1)/2;
			for(int II=0;II<=I;II++){
				Z=0;
				for(int JJ=0;JJ<3;JJ++){
					Z=Z+BM[JJ][I]*CM[JJ][II];					
					EK[K1+II]=Z/DEL/4;	
				}
				EK[K1+II]*=t;
			}
		}
		//输出单元刚度矩阵
		EKDisplay(i);
	}
	//SKKE():单元刚度矩阵向总刚度矩阵传送
	void SKKE(){
		int K;
		for(int I=0;I<6;I++){
			K1=JLL[I];
			KK=I*(I+1)/2;
			for(int J=0;J<=I;J++){
				K2=JLL[J];
				if(K2<K1) K=JD[K1]-K1+K2;
				else
					K=JD[K2]-K2+K1;
				SK[K]=SK[K]+EK[KK+J];
			}
		}
	}
	//处理约束条件
	void FIXED(int K){
		int L,M,IA,IB;
		L=JD[K];
		if(K>0){
			M=JD[K-1];
			IA=M+1;                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
			IB=L-1;
			for(int	I=IA;I<=IB;I++)
				SK[I]=0;
		}
		IA=K+1;
		for(int	I=IA;I<NF;I++){
			if((JD[I]-JD[I-1])>=(I-K+1)) 
				M=JD[I]-I+K;
			SK[M]=0;
		}
		U[K]=0;		
	}
	//SOLVE():解线性代数方程组
	void SOLVE(){
		int	IG,MI,IP,JG,MJ,IJ,JI,JK,JJ,I,J,K;
		for(I=0;I<NF;I++){
			IG=JD[I]-I;
			if(I==0) 
				MI=0;
			else
				MI=JD[I-1]-IG+1; 
			for(J=MI;J<=I;J++){
				IP=IG+J;
				JG=JD[J]-J;
				if(J==0) MJ=0;
				else
					MJ=JD[J-1]-JG+1;
				IJ=MI;
				if(MJ>MI) IJ=MJ;
				JI=J-1;
				for(K=IJ;K<=JI;K++){
					JK=JD[K];				
					SK[IP]=SK[IP]-SK[IG+K]*SK[JK]*SK[JG+K];		
				}				
				if(I!=J){			
					JJ=JD[J];						
					U[I]-=SK[IP]*U[J];
					SK[IP]=SK[IP]/SK[JJ];
				}
			}
			JI=JD[I];
			U[I]=U[I]/SK[JI];
		}
		for(I=0;I<NF;I++){
			J=NF-I+1;
			IG=JD[J]-J;
			if(J==0) MI=0;
			else
				MI=JD[J-1]-IG+1;
			JI=J-1;
			for(K=MI;K<=JI;K++){
				U[K]=U[K]-SK[IG+K]*U[J];	
			}
		}		 
	}
	//STRESS():计算单元形心处应力
	void STRESS(){
		int I,J;
		double UE[6],SGM[3],S1,S2,S3,A1,A2,SM1,SM2,CETA;
		for(I=0;I<6;I++){
			K1=JLL[I];
			UE[I]=U[K1];
		}
		for(I=0;I<3;I++){
			K2=I+1;
			K1=K2-1;
			CM[0][K1]=D1*B[I];
			CM[0][K2]=D2*C[I];
			CM[1][K1]=D2*B[I];
			CM[1][K2]=D1*C[I];
			CM[2][K1]=D3*C[I];
			CM[2][K2]=D3*B[I];		
		}
		for(I=0;I<3;I++){
			SGM[I]=0;
			for(J=0;J<6;J++){
				SGM[I]=SGM[I]+CM[I][J]*UE[J]/DEL/2;
			}
		}
      S1=SGM[1];
	  S2=SGM[2];
	  S3=SGM[3];
	  A1=sqrt(pow((S1-S2)/2,2)+pow(S3,2));
	  A2=(S1+S2)/2;
	  SM1=A2+A1;
	  SM2=A2-A1;
	  if(fabs(S3)>1.E-4)
		  CETA=atan((SM1-S1)/S3)*57.29578;
	  else{
		  if(S1>S2)
			  CETA=0;
		  else CETA=90;
	  }
	}
	//KDisplay():输出总刚度矩阵K
	void KDisplay(){
		int num=1,L=0,M=0,i=0;
		cout<<"总刚度矩阵K:"<<endl;
		cout<<SK[0]<<endl;
		for(i=1;i<NF;i++){
			L=JD[i]-JD[i-1];
			M=i-L+1;			
			for(int j=0;j<=i;j++){
				if(j<M)
					cout<<setprecision(5)<<setw(7)<<sunyongle<<"  ";
				else{
					cout<<setprecision(5)<<setw(7)<<SK[num]<<"  ";
					num++;
				}
			}
			cout<<endl;
		}
	}	
	//Uisplay():输出位移值
	void UDisplay(){
		cout<<"结点位移值为:"<<endl;
		for(int i=0;i<NN;i++){
			if(i!=0&&i%4==0)
				cout<<endl;
			cout<<i+1<<"("<<U[2*i]<<","<<U[2*i+1]<<")"<<"\t";			
		}
		cout<<endl;
	}
	//Fisplay():输出结点载荷
	void FDisplay(){
		cout<<"结点载荷为:"<<endl;
		for(int i=0;i<NN;i++){
			if(i!=0&&i%4==0)
				cout<<endl;
			cout<<i+1<<"("<<U[2*i]<<","<<U[2*i+1]<<")"<<"\t";			
		}
		cout<<endl;
	}
private:
	//NDisplay():输出单元应力转换矩阵
	void NDisplay(int I){
		cout<<"第"<<I+1<<"个单元应力转换矩阵[B]:"<<endl;
		for(I=0;I<3;I++){
			for(int J=0;J<6;J++){
				cout<<BM[I][J]<<"  ";
			}
			cout<<endl;						
		}
	}
	//EKDisplay():输出单元刚度矩阵
	void EKDisplay(int I){
		cout<<"第"<<I+1<<"个单元刚度矩阵:"<<endl;
		for(I=0;I<6;I++){
			K1=I*(I+1)/2;
			for(int II=0;II<=I;II++)
				cout<<setprecision(5)<<setw(7)<<EK[K1+II]<<"  ";
			cout<<endl;
		}
	}
};
void main(){
	CST test;
	//test.dataInput1();
	//test.dataInput2();
	//test.dataTest1();
	test.dataTest2();
	if(test.dataCheck())
		test.dataTackle();
}

⌨️ 快捷键说明

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