📄 structure.cpp
字号:
ar.WriteString("|+输出数据-结点电压值+|\r\n");
ar.WriteString("+++++++++++++++++++++++\r\n");
for(i=0;i<m_nodecount;i++)
{
pNode=(CNode*)(m_nodeArray.GetAt(i));
temstr.Format("%d\t%7.4f\r\n",pNode->m_nodeid,pNode->m_nodeValue);
ar.WriteString(temstr);
}
ar.WriteString("\r\n");
ar.WriteString("+++++++++++++++++++++++++\r\n");
ar.WriteString("|+总刚度矩阵-半带宽存储+|\r\n");
ar.WriteString("+++++++++++++++++++++++++\r\n");
for(i=0;i<m_nodecount;i++)
{
ar.WriteString("\r\n");
for(j=0;j<m_halfband;j++)
{
temstr.Format("%7.4f\t",m_aStiffMatrix[i][j]);
ar.WriteString(temstr);
}
}
ar.WriteString("\r\n\r\n");
ar.WriteString("+++++++++++++++++++++\r\n");
ar.WriteString("|+总刚度矩阵-全存储+|\r\n");
ar.WriteString("+++++++++++++++++++++\r\n");
for(i=0;i<m_nodecount;i++)
{
ar.WriteString("\r\n");
for(j=0;j<m_nodecount;j++)
{
temstr.Format("%7.4f\t",m_aStiffMatrixAll[i][j]);
ar.WriteString(temstr);
}
}
ar.WriteString("\r\n\r\n");
ar.WriteString("+++++++++++++++++++++++\r\n");
ar.WriteString("|+输出数据-结点电压值+|\r\n");
ar.WriteString("+++++++++++++++++++++++\r\n");
for(i=0;i<m_nodecount;i++)
{
pNode=(CNode*)(m_nodeArray.GetAt(i));
temstr.Format("%7.4f\r\n",pNode->m_nodeValue);
ar.WriteString(temstr);
}
///////////////////////////////////////
}
else
{ //加载数据
Init(); //初始化数据
CFile* pfin = ar.GetFile();
nChar=pfin->GetLength();
m_strStructureData.GetBufferSetLength(nChar);
for(loop=0;loop<nChar;loop++)
{
ar>>cBuf;
m_strStructureData.SetAt(loop,cBuf);
}
if(DataInput(m_strStructureData))
{
m_done=1;
// AnalysisStructure();分析结构,转到第二步运行。通过菜单。
}
else
{
m_done=0;
Init();//复位数据体。
}
}
}
/////////////////////////////////
//数据输入,通过文件建立数据体
int CStructure::DataInput(CString &sData)
{
int i,j;//循环变量
int id; //单元结点标志
int tag1,tag2,tag3;//结点码
double dbuf1=0.0,dbuf2=0.0,dbuf3;//双精度缓冲区
int tempInt;
int iCurCharPos; //当前文件光标位置
CString sBuf; //字符串缓冲区
//-----------------------------------------------------
sBuf="结点总数\0";
if((iCurCharPos=FindKeyWordsPos(sBuf,sData))<0) return 0;
m_nodecount=ReadInt(iCurCharPos,sData);
sBuf="单元总数\0";
if((iCurCharPos=FindKeyWordsPos(sBuf,sData))<0) return 0;
m_elementcount=ReadInt(iCurCharPos,sData);
//----------------------给结点和单元分配内存空间--------
m_nodeArray.SetSize(m_nodecount);
m_elementArray.SetSize(m_elementcount);
for(i=0;i<m_nodecount;i++)
{
m_nodeArray.SetAt(i,new CNode(i+1));
}
for(j=0;j<m_elementcount;j++)
{
m_elementArray.SetAt(j,new CElement(j+1));
}
//---------读入结点相关数据----------
sBuf="结点相关数据\0";
if((iCurCharPos=FindKeyWordsPos(sBuf,sData))<0) return 0;
for(j=0;j<m_nodecount;j++){
id=ReadInt(iCurCharPos,sData);
dbuf1=ReadDouble(iCurCharPos,sData);
dbuf2=ReadDouble(iCurCharPos,sData);
dbuf3=ReadDouble(iCurCharPos,sData);
tempInt=ReadInt(iCurCharPos,sData);
((CNode*)(m_nodeArray.GetAt(id-1)))->SetXY(dbuf1,dbuf2);
((CNode*)(m_nodeArray.GetAt(id-1)))->SetLoad(dbuf3);
((CNode*)(m_nodeArray.GetAt(id-1)))->SetNodeType(tempInt);
}
//---------读入单元相关数据-----------
sBuf="单元相关数据\0";
if((iCurCharPos=FindKeyWordsPos(sBuf,sData))<0) return 0;
for(j=0;j<m_elementcount;j++){
id=ReadInt(iCurCharPos,sData);
tag1=ReadInt(iCurCharPos,sData);
tag2=ReadInt(iCurCharPos,sData);
tag3=ReadInt(iCurCharPos,sData);
((CElement*)(m_elementArray.GetAt(id-1)))->SetNode(
(CNode*)(m_nodeArray.GetAt(tag1-1)),
(CNode*)(m_nodeArray.GetAt(tag2-1)),
(CNode*)(m_nodeArray.GetAt(tag3-1)));
}
//------------------------------------------------------
//读取数据成功,返回1
return 1;
}
//============================
//++++++++++++++++++++++++++++
double CStructure::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 );
}
//============================================
int CStructure::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);
}
//===================================
int CStructure::FindKeyWordsPos(CString &sKeyWords, CString &sData)
{
int iCharPos;
CString sBuf;
if((iCharPos=sData.Find(sKeyWords))<0){
// sBuf.Format("Can not find the data: %s",sKeyWords);
sBuf.Format("找不到数据点: %s",sKeyWords);
AfxMessageBox( sBuf, MB_OK, 0 );
}
else{
iCharPos+=sKeyWords.GetLength();
}
return iCharPos;
}
////////////////////////////////////////
///从模型类生成数据体//新建数据体
int CStructure::GetDataFromModal()
{
CNode* pNode;
CElement* pElement;
int nodeid;
if(m_model.m_nodecount==0)
{
m_done=0;
m_solved=0;
return 0;
}
//---------------------
m_nodecount=m_model.m_nodecount;
m_elementcount=m_model.m_elementcount;
m_strExamName=m_model.m_strExamName;
int i,j;
//结点数据
m_nodeArray.SetSize(m_model.m_nodeArray.GetSize());
for(i=0;i<m_nodeArray.GetSize();i++)
{
pNode=new CNode(*(CNode*)(m_model.m_nodeArray.GetAt(i)));
//内存拷贝
// memcpy(pNode,(CNode*)(m_model.m_nodeArray.GetAt(i)),sizeof(CNode));
m_nodeArray.SetAt(i,pNode);
}
//单元数据
CElement* pOldElement;
m_elementArray.SetSize(m_model.m_elementArray.GetSize());
for(i=0;i<m_elementArray.GetSize();i++)
{
//--------结点更新-------------
pOldElement=(CElement*)(m_model.m_elementArray.GetAt(i));
pElement=new CElement(*pOldElement);
for(j=0;j<3;j++)
{
if(pElement->m_pNodes[j]->m_nodetype>100)//重复结点
{//结点类型有别,三种
nodeid=(pElement->m_pNodes[j]->m_nodetype-100);
}
else//普通结点
{
nodeid=pElement->m_pNodes[j]->m_nodeid;
}
pElement->m_pNodes[j]=(CNode*)(m_nodeArray.GetAt(nodeid-1));
pOldElement->m_pNodes[j]=(CNode*)(m_model.m_nodeArray.GetAt(nodeid-1));
}
// memcpy(pElement,(CElement*)(m_model.m_elementArray.GetAt(i)),sizeof(CElement));
m_elementArray.SetAt(i,pElement);
}
// m_model.Init();//获取数据后清除模型建立器的数据/
m_done=1;//数据体已经准备好
return 1;
}
//初始化或删除方程组矩阵和向量
void CStructure::InitEquation(int create)
{
int i,j;
if(create==1&&m_nodecount!=0)
{
m_aStiffMatrix=new double*[m_nodecount];//半带刚度矩阵
for(i=0;i<m_nodecount;i++)
{
m_aStiffMatrix[i]=new double[GetHalfBand()];
}
m_aLoadVector=new double[m_nodecount];//荷载向量
//-----------------------------------------------
m_aStiffMatrixAll=new double*[m_nodecount];//全刚度矩阵
for(i=0;i<m_nodecount;i++)
{
m_aStiffMatrixAll[i]=new double[m_nodecount];
}
//-----------------------------------------------
//初始化数据
for(i=0;i<m_nodecount;i++)
{
m_aLoadVector[i]=0.0f;
for(j=0;j<m_halfband;j++)
{
m_aStiffMatrix[i][j]=0.0f;
}
}
for(i=0;i<m_nodecount;i++)
{
for(j=0;j<m_nodecount;j++)
{
m_aStiffMatrixAll[i][j]=0.0f;
}
}
}
///////////////////////////有问题
if(m_nodecount!=0&&create==0)
{
//删除new对象
for(i=0;i<m_nodecount;i++)
{
delete m_aStiffMatrix[i];
delete m_aStiffMatrixAll[i];
}
delete m_aLoadVector;
m_aStiffMatrix=NULL;
m_aStiffMatrixAll=NULL;
m_aLoadVector=NULL;
}
//--------------------
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -