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

📄 structure.cpp

📁 用VC写得计算电磁学的有限元分析程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -