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

📄 load.cpp

📁 一个计算悬臂梁的有限元vc源码
💻 CPP
字号:
// Load.cpp: implementation of the CLoad class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "afxtempl.h"
#include "fstream.h"
#include "Matrix.h"
#include "SparseMatrix.h"
#include "Node.h"
#include "BaseMaterial.h"
#include "BaseElement.h"
#include "Beam.h"
#include "Load.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

#define NODE_LOAD 0
#define BEAM_LOAD_1 1
#define BEAM_LOAD_2 2
#define BEAM_LOAD_3 3
#define BEAM_LOAD_4 4
#define BEAM_LOAD_5 5
#define SUPPORT_MOVE 6
#define LUMP_MASS 7

#define DIRECT_X 0
#define DIRECT_Y 1
#define DIRECT_R 2

#define TRUSS 0
#define BEAM 1
#define BEAM_HINGE 2
#define PLANE_ELEMENT 3

CNode* CLoad::m_pNode;
CTypedPtrArray<CPtrArray,CBaseElement*>* CLoad::m_papEle;
CTypedPtrArray <CPtrArray,CBaseMaterial*>* CLoad::m_papMaterial;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CLoad::CLoad()
{
}

CLoad::~CLoad()
{

}

void CLoad::LoadVectorAssemble(double* adLoadVector,double* adDisp)
{
	int loop,iBuf;
	int iMaterialIndex;
	int iBeamType;
	int iXDOFIndex,iYDOFIndex,iRDOFIndex;
	int iXDOFIndex1,iYDOFIndex1,iRDOFIndex1;
	int aiELeNode[30];
	double dBuf,dBuf1,dBuf2;
	double adBeamM[11],adBeamQ[11],adBeamFy[11]; 
	double dx,dDx;
	double dE,dI;
	double da,db,dc,dd,dl;
	double dRi,dRj,dMi,dMj;

	CMatrix matT(6,6),matTT(6,6),matNodeForce(6,1);

	CTypedPtrArray<CPtrArray,CBaseElement*>& apEle=*m_papEle;
	CTypedPtrArray<CPtrArray,CBaseMaterial*>& apMaterial=*m_papMaterial;

	switch(m_iType){
	case SUPPORT_MOVE:
		if(m_iDirect==DIRECT_X){
			iXDOFIndex=m_pNode->GetXDOFIndex(m_iLoadedNode);
			adDisp[iXDOFIndex]+=m_dLoad;
		}
		else if(m_iDirect==DIRECT_Y){
			iYDOFIndex=m_pNode->GetYDOFIndex(m_iLoadedNode);
			adDisp[iYDOFIndex]+=m_dLoad;
		}
		else{
			iRDOFIndex=m_pNode->GetRDOFIndex(m_iLoadedNode);
			adDisp[iRDOFIndex]+=m_dLoad;
		}		
		break;
	case NODE_LOAD:
		if(m_iDirect==DIRECT_X){
			iXDOFIndex=m_pNode->GetXDOFIndex(m_iLoadedNode);
			adLoadVector[iXDOFIndex]+=m_dLoad;
		}
		else if(m_iDirect==DIRECT_Y){
			iYDOFIndex=m_pNode->GetYDOFIndex(m_iLoadedNode);
			adLoadVector[iYDOFIndex]+=m_dLoad;
		}
		else{
			iRDOFIndex=m_pNode->GetRDOFIndex(m_iLoadedNode);
			adLoadVector[iRDOFIndex]+=m_dLoad;
		}
		break;
	case BEAM_LOAD_1:
	case BEAM_LOAD_2:
	case BEAM_LOAD_3:
	case BEAM_LOAD_4:
	case BEAM_LOAD_5:
		iBeamType=apEle[m_iLoadedEle]->GetElementType();
		if(!(iBeamType==BEAM||iBeamType==BEAM_HINGE)){
			AfxMessageBox( "Load data error in beam index!", MB_OK, 0 );
			return;
		}

		matNodeForce=0.0;
		dl=((CBeam*)apEle[m_iLoadedEle])->GetLength();
		iMaterialIndex=apEle[m_iLoadedEle]->GetMaterialIndex();
		dI=((CBeam*)apEle[m_iLoadedEle])->GetInertia();
		dE=apMaterial[iMaterialIndex]->GetE();
		switch(m_iType){
		case BEAM_LOAD_1:
			da=m_dPosition;
			db=dl-da;
			dBuf=dl*dl*dl;
			dRi=m_dLoad*db*db*(dl+2.0*da)/dBuf;
			dRj=m_dLoad-dRi;
			dBuf=dl*dl;
			dMi=m_dLoad*da*db*db/dBuf;
			dMj=-m_dLoad*da*da*db/dBuf;

			dx=dDx=dl/10.0;
			for(loop=1;loop<10;loop++){
				if(dx<=da){
					adBeamQ[loop]=-dRi;
					adBeamM[loop]=-dMi+dRi*dx;
					dBuf=6.0*dE*dI*dl*dl;
					dBuf=m_dLoad*db*db*dx*dx/dBuf;
					dBuf1=3.0*da-(1.0+2.0*da/dl)*dx;
					adBeamFy[loop]=dBuf*dBuf1;
				}
				else{
					adBeamQ[loop]=dRj;
					adBeamM[loop]=dMj+dRj*(dl-dx);
					dBuf=6.0*dE*dI*dl*dl;
					dBuf1=(dl-dx)*(dl-dx);
					dBuf=-m_dLoad*da*da*dBuf1/dBuf;
					dBuf1=da-(1.0+2.0*db/dl)*dx;
					adBeamFy[loop]=dBuf*dBuf1;
				}
				dx+=dDx;
			}
			break;
		case BEAM_LOAD_2:
			dd=m_dPosition;
			dc=m_dPosition1;
			da=dd+dc/2.0;
			db=dl-da;
			dBuf=4.0*dl*dl*dl;
			dRi=m_dLoad*dc*(12.0*db*db*dl-8.0*db*db*db+dc*dc*dl-2.0*db*dc*dc)/dBuf;
			dRj=m_dLoad*dc-dRi;
			dBuf=m_dLoad*dc/(12.0*dl*dl);
			dMi=dBuf*(12.0*da*db*db-3.0*db*dc*dc+dc*dc*dl);
			dMj=-dBuf*(12.0*da*da*db+3.0*db*dc*dc-2.0*dc*dc*dl);

			dx=dDx=dl/10.0;
			for(loop=1;loop<10;loop++){
				if(dx<=dd){
					adBeamQ[loop]=-dRi;
					adBeamM[loop]=-dMi+dRi*dx;
					dBuf=6.0*dE*dI;
					dBuf1=(-dRi*dx*dx*dx+3.0*dMi*dx*dx);
					adBeamFy[loop]=dBuf1/dBuf;
				}
				else if(dx<=dd+dc){
					adBeamQ[loop]=-dRi+m_dLoad*(dx-dd);
					adBeamM[loop]=-dMi+dRi*dx-m_dLoad*(dx-dd)*(dx-dd)/2.0;
					dBuf=6.0*dE*dI;
					dBuf1=m_dLoad*(dx-dd)*(dx-dd)*(dx-dd)*(dx-dd)/4.0;
					dBuf1=(-dRi*dx*dx*dx+3.0*dMi*dx*dx+dBuf1);
					adBeamFy[loop]=dBuf1/dBuf;
				}
				else{
					adBeamQ[loop]=dRj;
					adBeamM[loop]=dMj+dRj*(dl-dx);
					dBuf=6.0*dE*dI;
					dBuf1=m_dLoad*dc*(dx-da)*(dx-da)*(dx-da);
					dBuf2=m_dLoad*dc*dc*dc*(dx-da)/4.0;
					dBuf1=(-dRi*dx*dx*dx+3.0*dMi*dx*dx+dBuf1+dBuf2);
					adBeamFy[loop]=dBuf1/dBuf;
				}
				dx+=dDx;
			}
			break;
		case BEAM_LOAD_3:
			dd=m_dPosition;
			dc=m_dPosition1;
			da=dd+dc*2.0/3.0;
			db=dl-da;
			dBuf=12.0*dl*dl*dl;
			dRi=m_dLoad*dc*(18.0*db*db*dl-12.0*db*db*db+dc*dc*dl
				-2.0*db*dc*dc-4.0*dc*dc*dc/45.0)/dBuf;
			dRj=m_dLoad*dc/2.0-dRi;
			dBuf=m_dLoad*dc/(36.0*dl*dl);
			dMi=dBuf*(18.0*da*db*db-3.0*db*dc*dc
				+dc*dc*dl-2.0*dc*dc*dc/15.0);
			dMj=-dBuf*(18.0*da*da*db+3.0*db*dc*dc
				-2.0*dc*dc*dl+2.0*dc*dc*dc/15.0);

			dx=dDx=dl/10.0;
			for(loop=1;loop<10;loop++){
				if(dx<=dd){
					adBeamQ[loop]=-dRi;
					adBeamM[loop]=-dMi+dRi*dx;
					dBuf=6.0*dE*dI;
					dBuf1=-dRi*dx*dx*dx+3.0*dMi*dx*dx;
					adBeamFy[loop]=dBuf1/dBuf;
				}
				else if(dx<=dd+dc){
					adBeamQ[loop]=-dRi+m_dLoad*(dx-dd)*(dx-dd)/2.0/dc;
					adBeamM[loop]=-dMi+dRi*dx-m_dLoad*(dx-dd)*(dx-dd)*(dx-dd)/6.0/dc;
					dBuf=6.0*dE*dI;
					dBuf1=dx-dd;
					dBuf1=m_dLoad*dBuf1*dBuf1*dBuf1*dBuf1*dBuf1/20.0/dc;
					dBuf1=-dRi*dx*dx*dx+3.0*dMi*dx*dx+dBuf1;
					adBeamFy[loop]=dBuf1/dBuf;
				}
				else{
					adBeamQ[loop]=dRj;
					adBeamM[loop]=dMj+dRj*(dl-dx);
					dBuf=6.0*dE*dI;
					dBuf1=m_dLoad*dc*(dx-da)*(dx-da)*(dx-da)/2.0;
					dBuf2=m_dLoad*dc*dc*dc*(dx-da+2.0*dc/45.0)/12.0;
					dBuf1=(-dRi*dx*dx*dx+3.0*dMi*dx*dx+dBuf1+dBuf2);
					adBeamFy[loop]=dBuf1/dBuf;
				}
				dx+=dDx;
			}
			break;
		case BEAM_LOAD_4:
			dc=m_dPosition1;
			dd=dl-m_dPosition1;
			da=dd+dc*2.0/3.0;
			db=dl-da;
			dBuf=12.0*dl*dl*dl;
			dRi=m_dLoad*dc*(18.0*db*db*dl-12.0*db*db*db+dc*dc*dl
				-2.0*db*dc*dc-4.0*dc*dc*dc/45.0)/dBuf;
			dRj=m_dLoad*dc/2.0-dRi;
			dBuf=m_dLoad*dc/(36.0*dl*dl);
			dMi=dBuf*(18.0*da*db*db-3.0*db*dc*dc
				+dc*dc*dl-2.0*dc*dc*dc/15.0);
			dMj=-dBuf*(18.0*da*da*db+3.0*db*dc*dc
				-2.0*dc*dc*dl+2.0*dc*dc*dc/15.0);

			dx=dDx=dl/10.0;
			for(loop=1;loop<10;loop++){
				if(dx<=dd){
					adBeamQ[loop]=-dRi;
					adBeamM[loop]=-dMi+dRi*dx;
					dBuf=6.0*dE*dI;
					dBuf1=-dRi*dx*dx*dx+3.0*dMi*dx*dx;
					adBeamFy[loop]=dBuf1/dBuf;
				}
				else if(dx<=dd+dc){
					adBeamQ[loop]=-dRi+m_dLoad*(dx-dd)*(dx-dd)/2.0/dc;
					adBeamM[loop]=-dMi+dRi*dx-m_dLoad*(dx-dd)*(dx-dd)*(dx-dd)/6.0/dc;
					dBuf=6.0*dE*dI;
					dBuf1=dx-dd;
					dBuf1=m_dLoad*dBuf1*dBuf1*dBuf1*dBuf1*dBuf1/20.0/dc;
					dBuf1=-dRi*dx*dx*dx+3.0*dMi*dx*dx+dBuf1;
					adBeamFy[loop]=dBuf1/dBuf;
				}
				else{
					adBeamQ[loop]=dRj;
					adBeamM[loop]=dMj+dRj*(dl-dx);
					dBuf=6.0*dE*dI;
					dBuf1=m_dLoad*dc*(dx-da)*(dx-da)*(dx-da)/2.0;
					dBuf2=m_dLoad*dc*dc*dc*(dx-da+2.0*dc/45.0)/12.0;
					dBuf1=(-dRi*dx*dx*dx+3.0*dMi*dx*dx+dBuf1+dBuf2);
					adBeamFy[loop]=dBuf1/dBuf;
				}
				dx+=dDx;
			}
			dBuf=dRi;dRi=dRj;dRj=dBuf; 
			dBuf=dMi;dMi=-dMj;dMj=-dBuf;
			for(loop=0;loop<5;loop++){
				dBuf=adBeamQ[10-loop];
				adBeamQ[10-loop]=-adBeamQ[loop];
				adBeamQ[loop]=-dBuf;
				dBuf=adBeamM[10-loop];
				adBeamM[10-loop]=adBeamM[loop];
				adBeamM[loop]=dBuf;
				dBuf=adBeamFy[10-loop];
				adBeamFy[0-loop]=adBeamFy[loop];
				adBeamFy[loop]=dBuf;
			}
			adBeamQ[5]=-adBeamQ[5];
			break;
		case BEAM_LOAD_5:
			da=m_dPosition;
			db=dl-da;
			dBuf=dl*dl*dl;
			dRi=6.0*m_dLoad*da*db/dBuf;
			dRj=-dRi;
			dBuf=dl*dl;
			dMi=m_dLoad*db*(2.0*dl-3.0*db)/dBuf;
			dMj=m_dLoad*da*(2.0*dl-3.0*da)/dBuf;

			dx=dDx=dl/10.0;
			dBuf=6.0*dE*dI;
			for(loop=1;loop<10;loop++){
				if(dx<=da){
					adBeamQ[loop]=-dRi;
					adBeamM[loop]=-dMi+dRi*dx;
					dBuf1=3.0*dMi*dx*dx-dRi*dx*dx*dx;
					adBeamFy[loop]=dBuf1/dBuf;
				}
				else{
					adBeamQ[loop]=dRj;
					adBeamM[loop]=dMj+dRj*(dl-dx);
					dBuf1=(-m_dLoad-dMi)*(6.0*dl*dx-3.0*dx*dx-3.0*dl*dl);
					dBuf2=dRi*(2.0*dl*dl*dl-3.0*dl*dl*dx+dx*dx*dx);
					adBeamFy[loop]=(dBuf1-dBuf2)/dBuf;
				}
				dx+=dDx;
			}
			break;
		}

		if(iBeamType==BEAM_HINGE){
			dRi-=3.0*dMi/2.0/dl;
			dRj+=3.0*dMi/2.0/dl;
			dMj-=dMi/2.0;
			dBuf=3.0*dMi/2.0/10.0;
			dBuf1=3.0*dMi/2.0/dl;
			for(loop=0;loop<11;loop++){
				adBeamM[loop]+=dMi-dBuf*(double)loop;
				adBeamQ[loop]+=dBuf1;
			}
			
			dBuf=4.0*dE*dI;
			dBuf=-dMi*dl*dl/dBuf;
			for(loop=0;loop<11;loop++){
				dBuf1=loop/10.0;
				dBuf1=(dBuf1-2.0*dBuf1*dBuf1+dBuf1*dBuf1*dBuf1);
				adBeamFy[loop]+=dBuf*dBuf1;
			}
			dMi=0.0;
		}

		adBeamQ[0]=-dRi;
		adBeamQ[10]=dRj;
		adBeamM[0]=-dMi;
		adBeamM[10]=dMj;
		adBeamFy[0]=0.0;
		adBeamFy[10]=0.0;

		((CBeam*)apEle[m_iLoadedEle])->SetInitialSectionForce(adBeamQ,adBeamM);
		((CBeam*)apEle[m_iLoadedEle])->SetInitialSectionDef(adBeamFy);

		matNodeForce(0,0)=0.0;
		matNodeForce(1,0)=-dRi;
		matNodeForce(2,0)=-dMi;
		matNodeForce(3,0)=0.0;
		matNodeForce(4,0)=-dRj;
		matNodeForce(5,0)=-dMj;

		apEle[m_iLoadedEle]->GetTransferMatrixGCToLC(matT);
			matTT.Trans(matT);
			matNodeForce=matTT*matNodeForce;

		apEle[m_iLoadedEle]->GetNode(aiELeNode,iBuf);
		iXDOFIndex=m_pNode->GetXDOFIndex(aiELeNode[0]);
		iYDOFIndex=m_pNode->GetYDOFIndex(aiELeNode[0]);
		iRDOFIndex=m_pNode->GetRDOFIndex(aiELeNode[0]);
		iXDOFIndex1=m_pNode->GetXDOFIndex(aiELeNode[1]);
		iYDOFIndex1=m_pNode->GetYDOFIndex(aiELeNode[1]);
		iRDOFIndex1=m_pNode->GetRDOFIndex(aiELeNode[1]);

		adLoadVector[iXDOFIndex]+=matNodeForce(0,0);
		adLoadVector[iYDOFIndex]+=matNodeForce(1,0);
		adLoadVector[iRDOFIndex]+=matNodeForce(2,0);
		adLoadVector[iXDOFIndex1]+=matNodeForce(3,0);
		adLoadVector[iYDOFIndex1]+=matNodeForce(4,0);
		adLoadVector[iRDOFIndex1]+=matNodeForce(5,0);
		break;
	}
}

void CLoad::ReadParameter(int &iCurCharPos, CString &sData)
{
	m_iType=ReadInt(iCurCharPos,sData);
	switch(m_iType){
	case NODE_LOAD:
	case SUPPORT_MOVE: 
		m_iLoadedNode=ReadInt(iCurCharPos,sData);
		m_dLoad=ReadDouble(iCurCharPos,sData);
		m_iDirect=ReadInt(iCurCharPos,sData);
		break;
	case BEAM_LOAD_1:
	case BEAM_LOAD_5:
		m_iLoadedEle=ReadInt(iCurCharPos,sData);
		m_dLoad=ReadDouble(iCurCharPos,sData);
		m_dPosition=ReadDouble(iCurCharPos,sData);
		break;
	case BEAM_LOAD_2:
	case BEAM_LOAD_3:
	case BEAM_LOAD_4:
		m_iLoadedEle=ReadInt(iCurCharPos,sData);
		m_dLoad=ReadDouble(iCurCharPos,sData);
		m_dPosition=ReadDouble(iCurCharPos,sData);
		m_dPosition1=ReadDouble(iCurCharPos,sData);
		break;
	}
}

int CLoad::ReadInt(int &iCurCharPos, const CString &sData)
{
	int nCount,nLength;
	char cBuf,sBuf[50];

	nLength=sData.GetLength();
	cBuf=sData[iCurCharPos];
	while(cBuf<(char)43||cBuf>(char)57||cBuf==(char)44||cBuf==(char)47)
	{
		iCurCharPos++;
		if(iCurCharPos==nLength) return -1;
		cBuf=sData[iCurCharPos];
	}
	
	nCount=0;
	while((cBuf>=(char)48&&cBuf<=(char)57)||cBuf==(char)43||cBuf==(char)45)
	{
		sBuf[nCount]=cBuf;
		iCurCharPos++;
		cBuf=sData[iCurCharPos];
		nCount++;
	}
	sBuf[nCount]='\0';
	return atoi(sBuf);
}

double CLoad::ReadDouble(int &iCurCharPos, const CString &sData)
{
	char cBuf,sBuf[50],*sStopBuf;
	int nCount,nLength;
	
	nLength=sData.GetLength();
	cBuf=sData[iCurCharPos];
	while(cBuf<(char)43||cBuf>(char)57||cBuf==(char)44||cBuf==(char)47)
	{
		iCurCharPos++;
		if(iCurCharPos==nLength) return -1;
		cBuf=sData[iCurCharPos];
	}
	
	nCount=0;
	while((cBuf>=(char)48&&cBuf<=(char)57)||
		cBuf==(char)43||cBuf==(char)45||cBuf==(char)46||
		cBuf==(char)69||cBuf==(char)101)
	{
		sBuf[nCount]=cBuf;
		iCurCharPos++;
		if(iCurCharPos==nLength) break;
		cBuf=sData[iCurCharPos];
		nCount++;
	}
	sBuf[nCount]='\0';
	return strtod( sBuf, &sStopBuf );
}

void CLoad::GetLoadDescription(int& iLoadedNode,int& iLoadedEle,double& dLoad,
							   int& iDirect, double& dPosition,double& dPosition1)
{
	iLoadedNode=m_iLoadedNode;
	iLoadedEle=m_iLoadedEle;
	dLoad=m_dLoad;
	iDirect=m_iDirect;
	dPosition=m_dPosition;
	dPosition1=m_dPosition1;
}

void CLoad::OutputParameter(ofstream &fout)
{
	switch(m_iType){
	case NODE_LOAD:
		fout<<"结点荷载   "<<"作用结点:"<<m_iLoadedNode;
		fout<<"   荷载值:"<<m_dLoad;
		if(m_iDirect==DIRECT_X){
			fout<<"  X方向"<<endl;
		}
		else if(m_iDirect==DIRECT_Y){
			fout<<"  Y方向"<<endl;
		}
		else{
			fout<<"  转角方向"<<endl;
		}
		break;
	case BEAM_LOAD_1:
		fout<<"梁:"<<m_iLoadedEle<<"  梁上集中荷载  荷载值:"<<m_dLoad;
		fout<<"  距左端:"<<m_dPosition<<endl;
		break;
	case BEAM_LOAD_5:
		fout<<"梁:"<<m_iLoadedEle<<"  梁上集中弯矩  荷载值:"<<m_dLoad;
		fout<<"  距左端:"<<m_dPosition<<endl;
		break;
	case BEAM_LOAD_2:
		fout<<"梁:"<<m_iLoadedEle<<"  梁上均布荷载  荷载值:"<<m_dLoad;
		fout<<"  距左端:"<<m_dPosition;
		fout<<" 分布长度:"<<m_dPosition1<<endl;
		break;
	case BEAM_LOAD_3:
		fout<<"梁:"<<m_iLoadedEle<<"  三角分布荷载0  荷载值:"<<m_dLoad;
		fout<<"  距左端:"<<m_dPosition;
		fout<<" 分布长度:"<<m_dPosition1<<endl;
		break;
	case BEAM_LOAD_4:
		fout<<"梁:"<<m_iLoadedEle<<"  三角分布荷载1  荷载值:"<<m_dLoad;
		fout<<"  距左端:"<<m_dPosition;
		fout<<" 分布长度:"<<m_dPosition1<<endl;
		break;
	case SUPPORT_MOVE: 
		fout<<"结点位移      位移结点:"<<m_iLoadedNode;
		fout<<"  位移值:"<<m_dLoad;
		if(m_iDirect==DIRECT_X){
			fout<<"  X方向"<<endl;
		}
		else if(m_iDirect==DIRECT_Y){
			fout<<"  Y方向"<<endl;
		}
		else{
			fout<<"  转角方向"<<endl;
		}
		break;
	case LUMP_MASS: 
		fout<<"集中质量: "<<m_dLoad<<"      所在结点:"<<m_iLoadedNode;
		break;
	}
}

int CLoad::GetLoadedNode()
{
	return m_iLoadedNode;
}

double CLoad::GetLoad()
{
	return m_dLoad;
}

void CLoad::ReadMassParameter(int &iCurCharPos, CString &sData)
{
	m_iType=LUMP_MASS;
	m_iLoadedNode=ReadInt(iCurCharPos,sData);
	m_dLoad=ReadDouble(iCurCharPos,sData);
}

⌨️ 快捷键说明

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