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

📄 clpackedcrnimatrix.cpp

📁 在GPU上实现数值模拟技术(线性方程组)的通用架构
💻 CPP
字号:
#include "clPackedCrNiMatrix.h"

void clPackedCrNiMatrix::setDeltaT(float fDeltaT)	{m_fDeltaT	= fDeltaT;	fillRows();}
void clPackedCrNiMatrix::setC(float fC)				{m_fC		= fC;		fillRows();}
void clPackedCrNiMatrix::setDeltaX(float fDeltaX)	{m_fDeltaX	= fDeltaX;	fillRows();}
void clPackedCrNiMatrix::setDeltaY(float fDeltaY)	{m_fDeltaY	= fDeltaY;	fillRows();}

float clPackedCrNiMatrix::getDeltaT()	{return m_fDeltaT;}
float clPackedCrNiMatrix::getC()		{return m_fC;}
float clPackedCrNiMatrix::getDeltaX()	{return m_fDeltaX;}
float clPackedCrNiMatrix::getDeltaY()	{return m_fDeltaY;}


void clPackedCrNiMatrix::fillRows() {
	int i;

	float fPreFactor = (m_fDeltaT*m_fDeltaT*m_fC*m_fC) / (2.0f*m_fDeltaX*m_fDeltaY);
	float *pfVectorData = new float[m_iSizeX*m_iSizeY];

	// setup diagonal-m_iSizeY
	ZeroMemory(pfVectorData, m_iSizeX*m_iSizeY*sizeof(float));
	for (i=m_iSizeY;i<m_iSizeX*m_iSizeY;i++) pfVectorData[i] = -fPreFactor;
	getRow(m_iSizeX*(m_iSizeY-1))->setData(pfVectorData);

	// setup diagonal-1
	ZeroMemory(pfVectorData, m_iSizeX*m_iSizeY*sizeof(float));
	for (i=0;i<m_iSizeX*m_iSizeY;i++) pfVectorData[i] = (i%m_iSizeX) ? -fPreFactor : 0;
	getRow(m_iSizeX*m_iSizeY-1)->setData(pfVectorData);

	// setup diagonal
	float fDiagFactor = 1+4*fPreFactor;
	for (i=0;i<m_iSizeX*m_iSizeY;i++) pfVectorData[i] = fDiagFactor;
	getRow(m_iSizeX*m_iSizeY)->setData(pfVectorData);

	// setup diagonal+1
	ZeroMemory(pfVectorData, m_iSizeX*m_iSizeY*sizeof(float));
	for (i=0;i<m_iSizeX*m_iSizeY;i++) pfVectorData[i] = ((i+1)%m_iSizeX) ? -fPreFactor : 0;
	getRow(m_iSizeX*m_iSizeY+1)->setData(pfVectorData);

	// setup diagonal+m_iSizeY
	ZeroMemory(pfVectorData, m_iSizeX*m_iSizeY*sizeof(float));
	for (i=0;i<m_iSizeX*(m_iSizeY-1);i++) pfVectorData[i] = -fPreFactor;
	getRow(m_iSizeX*(m_iSizeY+1))->setData(pfVectorData);

	delete [] pfVectorData;
}


clPackedCrNiMatrix::clPackedCrNiMatrix(LPDIRECT3DDEVICE9 pd3dDevice, int iSizeX, int iSizeY, float fDeltaT, float fC, float fDeltaX, float fDeltaY) {
	// store values
	m_pd3dDevice = pd3dDevice;
	m_iSizeX	 = iSizeX;
	m_iSizeY	 = iSizeY;

	
	m_fDeltaT	= fDeltaT;
	m_fC		= fC;
	m_fDeltaX	= fDeltaX;
	m_fDeltaY	= fDeltaY;

	// define the rows
	int piRows[] = {m_iSizeX*(m_iSizeY-1),
					m_iSizeX* m_iSizeY-1,
					m_iSizeX* m_iSizeY,
					m_iSizeX* m_iSizeY+1,
					m_iSizeX*(m_iSizeY+1)}; 

	// define rows
	m_iRowCount = 0;
	createRowVectors(piRows,sizeof(piRows)/sizeof(int));

	// fillup the rows
	fillRows();
}

⌨️ 快捷键说明

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