📄 femview.cpp
字号:
// FEMView.cpp : CFEMView 类的实现
//
//
// 黄玉洲 2008.08.01
#include "stdafx.h"
#include "FEM.h"
#include "FEMDoc.h"
#include "FEMView.h"
#include "afxtempl.h"
#include "Test.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CFEMView
IMPLEMENT_DYNCREATE(CFEMView, CView)
BEGIN_MESSAGE_MAP(CFEMView, CView)
// 标准打印命令
ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
ON_COMMAND(ID_FEM_CAL, &OnFemCal)
ON_COMMAND(ID_FEM_CURVEFIT, OnFemCurveFit)
ON_COMMAND(ID_FEM_NODE_MATRX, OnFemNodeMatrix)
ON_COMMAND(ID_FEM_BEZIER, OnFemBezier)
END_MESSAGE_MAP()
// CFEMView 构造/析构
CFEMView::CFEMView()
{
// TODO: 在此处添加构造代码
}
CFEMView::~CFEMView()
{
}
BOOL CFEMView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改
// CREATESTRUCT cs 来修改窗口类或样式
return CView::PreCreateWindow(cs);
}
// CFEMView 绘制
void CFEMView::OnDraw(CDC* /*pDC*/)
{
CFEMDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
ShowFemGrid( pDoc->GetFemUnitList() );
}
// CFEMView 打印
BOOL CFEMView::OnPreparePrinting(CPrintInfo* pInfo)
{
// 默认准备
return DoPreparePrinting(pInfo);
}
void CFEMView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加额外的打印前进行的初始化过程
}
void CFEMView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加打印后进行的清除过程
}
// CFEMView 诊断
#ifdef _DEBUG
void CFEMView::AssertValid() const
{
CView::AssertValid();
}
void CFEMView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CFEMDoc* CFEMView::GetDocument() const // 非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFEMDoc)));
return (CFEMDoc*)m_pDocument;
}
#endif //_DEBUG
// CFEMView 消息处理程序
void CFEMView::OnFemCurveFit()
{
CFemNode *femNode = new CFemNode[20];
femNode[0] = CFemNode(1, 1, 1);
femNode[1] = CFemNode(2, 2, 1.2);
femNode[2] = CFemNode(3, 3, 1.5);
femNode[3] = CFemNode(4, 6, 3);
femNode[4] = CFemNode(5, 11, 4);
int nRow = 5;
int nCol = nRow + 1;
double *nCoefMatrix = new double[nRow * nCol]; // 全局系数矩阵
memset( nCoefMatrix, 0, sizeof(double) * nRow * nCol );
// 生成全局系数矩阵
for(int i=0; i<nRow; i++)
{
// 生成叠加节点系数矩阵
for(int j=0; j<nRow; j++)
{
nCoefMatrix[i*nCol+j] = pow(femNode[i].GetX(), nRow-j-1);
}
nCoefMatrix[i*nCol+nRow] = femNode[i].GetY();
}
CClientDC dc( this );
int nZoom = 20;
double *pResult = GaussMatrixSolve(nCoefMatrix, nRow);
for (double x=0; x< 15; x+=0.1)
{
double y=0;
for (int i=0; i<nRow; i++)
{
y += pResult[i] * pow(x, nRow-i-1);
}
if (x == 0)
dc.MoveTo( x *nZoom, y* nZoom );
else
dc.LineTo( x *nZoom, y* nZoom );
}
CDoubleArray arrX;
CDoubleArray arrY;
CDoubleArray arrV;
for(int i=0; i<nRow; i++)
{
arrX.Add(femNode[i].GetX());
arrY.Add(femNode[i].GetY());
}
this->CalculateCurveParameter( &arrX, &arrY, 5, 5, &arrV );
for(int i=0; i<nRow; i++)
{
pResult[i] = arrV[i];
}
for(int i=0; i<nRow; i++)
{
if (i == 0)
dc.MoveTo( femNode[i].GetX() *nZoom, femNode[i].GetY()* nZoom );
else
dc.LineTo( femNode[i].GetX() *nZoom, femNode[i].GetY()* nZoom );
}
for (double x=0; x< 15; x+=0.1)
{
double y=0;
for (int i=0; i<nRow; i++)
{
y += pResult[i] * pow(x, nRow-i-1);
}
if (x == 0)
dc.MoveTo( x *nZoom, y* nZoom );
else
dc.LineTo( x *nZoom, y* nZoom );
}
/*for (double x=0; x< 15; x+=0.1)
{
double y=0;
for (int i=0; i<nRow; i++)
{
y += pResult[i] * pow(x, nRow-i-1);
}
if (x == 0)
dc.MoveTo( y *nZoom, x* nZoom );
else
dc.LineTo( y *nZoom, x* nZoom );
}*/
}
void CFEMView::OnFemNodeMatrix()
{
CList<CFemUnit> &lstUnit = this->GetDocument()->GetFemUnitList();
CFemNode *femNode = new CFemNode[50];
femNode[1] = CFemNode(1,2032,2629);
femNode[14] = CFemNode(14,2602,2629);
femNode[15] = CFemNode(15, 1614,3707);
femNode[16] = CFemNode(16,1614,3026);
femNode[31] = CFemNode(31,2918,3707);
femNode[32] = CFemNode(32,2267,3707);
femNode[33] = CFemNode(33,2332,3148);
femNode[36] = CFemNode(36,3169,3228);
// 定解
femNode[14].SetNodeValue(100.0);
femNode[1].SetNodeValue(100.0);
int nRow = 8;
int nCol = nRow + 1;
/*for(int i=0; i<nRow; i++)
{
femNode[i].Offset( 100 );
}
*/
lstUnit.AddTail( CFemUnit( 30, &femNode[15], &femNode[33], &femNode[32] ) );
lstUnit.AddTail( CFemUnit( 31, &femNode[16], &femNode[33], &femNode[15] ) );
lstUnit.AddTail( CFemUnit( 40, &femNode[1], &femNode[33], &femNode[16] ) );
lstUnit.AddTail( CFemUnit( 41, &femNode[32], &femNode[33], &femNode[31] ) );
lstUnit.AddTail( CFemUnit( 42, &femNode[14], &femNode[33], &femNode[1] ) );
lstUnit.AddTail( CFemUnit( 46, &femNode[33], &femNode[36], &femNode[31] ) );
lstUnit.AddTail( CFemUnit( 48, &femNode[14], &femNode[16], &femNode[33] ) );
POSITION pos;
double *nCoefMatrix = new double[nRow * nCol]; // 全局系数矩阵
memset( nCoefMatrix, 0, sizeof(double) * nRow * nCol );
int n1, n2;
// 生成全局系数矩阵
for(int i=0; i<nRow; i++)
{
if(i==0)n1=1;
else if(i==1)n1=14;
else if(i==2)n1=15;
else if(i==3)n1=16;
else if(i==4)n1=31;
else if(i==5)n1=32;
else if(i==6)n1=33;
else if(i==7)n1=36;
// 生成叠加节点系数矩阵
for(int j=0; j<nRow; j++)
{
pos = lstUnit.GetHeadPosition();
while( pos )
{
CFemUnit femUnit = lstUnit.GetNext(pos);
if(j==0)n2=1;
else if(j==1)n2=14;
else if(j==2)n2=15;
else if(j==3)n2=16;
else if(j==4)n2=31;
else if(j==5)n2=32;
else if(j==6)n2=33;
else if(j==7)n2=36;
nCoefMatrix[i*nCol+j] += femUnit.GetNodeCoefficient( n1, n2 );
}
}
}
#if _DEBUG
CFile file;
file.Open(_T("D:\\FemCoefMatrixTest.log"), CFile::modeCreate | CFile::modeWrite );
CString str;
char cMat[4096] = {0};
char cTmp[20] = {0};
int nIdx = 0;
for(int x=0; x<nRow; x++)
{
nIdx = 0;
for(int y = 0; y<nCol; y++)
{
sprintf( cTmp, "%0.6f ", nCoefMatrix[x*nCol + y] );
sprintf( cMat + nIdx, "%s", cTmp );
nIdx += strlen( cTmp );
if( nIdx > sizeof( cMat ) - 20 )
{
file.Write( cMat, nIdx);
nIdx = 0;
}
}
file.Write( cMat, nIdx);
file.Write("\r\n", 2);
}
file.Close();
#endif
memset( nCoefMatrix, 0, sizeof(double) * nRow * nCol );
// 生成全局系数矩阵
for(int i=0; i<nRow; i++)
{
if( femNode[i].IsFitValue() )
{
// 加入定解条件
nCoefMatrix[i*nCol+i] = 1.0;
nCoefMatrix[i*nCol+nRow] = femNode[i].GetNodeValue();
}
else
{
// 生成叠加节点系数矩阵
for(int j=0; j<nRow; j++)
{
pos = lstUnit.GetHeadPosition();
while( pos )
{
CFemUnit femUnit = lstUnit.GetNext(pos);
nCoefMatrix[i*nCol+j] += femUnit.GetNodeCoefficient( i+1, j+1 );
}
}
}
}
double *pResult = GaussMatrixSolve(nCoefMatrix, nRow);
// 赋节点值
for(int i=0; i<nRow; i++)
{
femNode[i].SetNodeValue(pResult[i]);
}
// 计算插值函数参数
pos = lstUnit.GetHeadPosition();
while( pos )
{
CFemUnit &femUnit = lstUnit.GetNext(pos);
femUnit.MakeInterposeFuncCoef();
}
ShowFemGrid(lstUnit);
delete nCoefMatrix;
}
void CFEMView::OnFemCal()
{
CList<CFemUnit> &lstUnit = this->GetDocument()->GetFemUnitList();
CFemNode *femNode = new CFemNode[20];
/*femNode[0] = CFemNode(1, 1, 1);
femNode[1] = CFemNode(2, 3, 1);
femNode[2] = CFemNode(3, 4, 3);
femNode[3] = CFemNode(4, 1, 3);*/
femNode[0] = CFemNode(1, 1,8);
femNode[1] = CFemNode(2, 2,6);
femNode[2] = CFemNode(3, 3,3);
femNode[3] = CFemNode(4, 2.7,1);
femNode[4] = CFemNode(5, 3.5,8.5);
femNode[5] = CFemNode(6, 4.5,6.2);
femNode[6] = CFemNode(7, 5, 2.5);
femNode[7] = CFemNode(8, 1, 3);
femNode[8] = CFemNode(9, 7, 5);
femNode[9] = CFemNode(10, 6, 9);
// 定解
/*femNode[0].SetNodeValue(0);
femNode[2].SetNodeValue(10.0);*/
//femNode[2].SetNodeValue(0);
femNode[9].SetNodeValue(0.0);
femNode[3].SetNodeValue(100.0);
int nRow = 10;
int nCol = nRow + 1;
for(int i=0; i<nRow; i++)
{
femNode[i].Offset( 50 );
}
/*lstUnit.AddTail( CFemUnit( 1, femNode[0], femNode[1], femNode[3] ) );
lstUnit.AddTail( CFemUnit( 2, femNode[1], femNode[2], femNode[3] ) );*/
lstUnit.AddTail( CFemUnit( 1, &femNode[0], &femNode[1], &femNode[4] ) );
lstUnit.AddTail( CFemUnit( 2, &femNode[1], &femNode[5], &femNode[4] ) );
//lstUnit.AddTail( CFemUnit( 3, &femNode[1], &femNode[2], &femNode[5] ) );
CFemUnit untFem( 3, &femNode[1], &femNode[2], &femNode[5] ) ;
untFem.SetDielectric( 10.0 );
untFem.MakeCoefficientMatrix();
lstUnit.AddTail( untFem );
//lstUnit.AddTail( CFemUnit( 4, &femNode[2], &femNode[6], &femNode[5] ) );
untFem = CFemUnit( 4, &femNode[2], &femNode[6], &femNode[5] ) ;
untFem.SetDielectric( 10.0 );
untFem.MakeCoefficientMatrix();
lstUnit.AddTail( untFem );
lstUnit.AddTail( CFemUnit( 5, &femNode[2], &femNode[3], &femNode[6] ) );
lstUnit.AddTail( CFemUnit( 6, &femNode[0], &femNode[7], &femNode[1] ) );
lstUnit.AddTail( CFemUnit( 7, &femNode[1], &femNode[7], &femNode[2] ) );
/*untFem = CFemUnit( 7, &femNode[1], &femNode[7], &femNode[2]) ;
untFem.SetDielectric( 10.0 );
untFem.MakeCoefficientMatrix();
lstUnit.AddTail( untFem );*/
//lstUnit.AddTail( CFemUnit( 8, &femNode[2], &femNode[7], &femNode[3] ) );
untFem = CFemUnit( 8, &femNode[2], &femNode[7], &femNode[3]) ;
untFem.SetDielectric( 10.0 );
untFem.MakeCoefficientMatrix();
lstUnit.AddTail( untFem );
lstUnit.AddTail( CFemUnit( 9, &femNode[5], &femNode[6], &femNode[8] ) );
lstUnit.AddTail( CFemUnit( 10, &femNode[5], &femNode[8], &femNode[9] ) );
lstUnit.AddTail( CFemUnit( 11, &femNode[4], &femNode[5], &femNode[9] ) );
POSITION pos;
double *nCoefMatrix = new double[nRow * nCol]; // 全局系数矩阵
memset( nCoefMatrix, 0, sizeof(double) * nRow * nCol );
// 生成全局系数矩阵
for(int i=0; i<nRow; i++)
{
// 生成叠加节点系数矩阵
for(int j=0; j<nRow; j++)
{
pos = lstUnit.GetHeadPosition();
while( pos )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -