📄 load.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 + -