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

📄 femarix.cpp

📁 有限单元
💻 CPP
字号:
#include "StdAfx.h"
#include "FeMarix.h"
#include ".\femarix.h"
CFeMarix::CFeMarix()
{
}
CFeMarix::CFeMarix(long m_lNIn,CArray<long,long>& m_lMarixBandIn)
{
	m_lN = m_lNIn;
	Init(m_lN, m_lMarixBand);
}
CFeMarix::CFeMarix(CFeMarix& a)
{
	m_lN = a.m_lN;
	m_lMarixBand.RemoveAll();
	for(long i = 0; i < a.m_lMarixBand.GetCount(); i++)
	{
		m_lMarixBand.Add(a.m_lMarixBand[i]);
	}
	data = new double*[m_lMarixBand.GetCount()];
	ic_data = new double*[m_lMarixBand.GetCount()];
	for(long i = 0; i < m_lMarixBand.GetCount(); i++)
	{
		data[i] = new double[m_lN - m_lMarixBand[i]];
		ic_data[i] = new double[m_lN - m_lMarixBand[i]];
	}
	//zero
	for(long i = 0; i < m_lMarixBand.GetCount(); i++)
	{
		for(long j = 0; j < m_lN - m_lMarixBand[i]; j++)
		{
			data[i][j] = a.data[i][j];
			ic_data[i][j] = 0;
		}
	}
}
CFeMarix::CFeMarix(long m_lNIn, CArray<long,long>& m_lMarixBandIn,double** dataIn)
{
	m_lN = m_lNIn;
	for(long i = 0; i < m_lMarixBandIn.GetCount(); i++)
	{
		m_lMarixBand.Add(m_lMarixBandIn[i]);
	}
	data = new double*[m_lMarixBand.GetCount()];
	ic_data = new double*[m_lMarixBand.GetCount()];
	for(long i = 0; i < m_lMarixBand.GetCount(); i++)
	{
		data[i] = new double[m_lN - m_lMarixBand[i]];
		ic_data[i] = new double[m_lN - m_lMarixBand[i]];
	}
	
	//zero
	for(long i = 0; i < m_lMarixBand.GetCount(); i++)
	{
		for(long j = 0; j < m_lN - m_lMarixBand[i]; j++)
		{
			data[i][j] = dataIn[i][j];
			ic_data[i][j] = 0;
		}
	}
}
void CFeMarix::Init(long m_lNIn,CArray<long,long>& m_lMarixBandIn)
{
	m_lN = m_lNIn;
	for(long i = 0; i < m_lMarixBandIn.GetCount(); i++)
	{
		m_lMarixBand.Add(m_lMarixBandIn[i]);
	}
	data = new double*[m_lMarixBand.GetCount()];
	ic_data = new double*[m_lMarixBand.GetCount()];
	for(long i = 0; i < m_lMarixBand.GetCount(); i++)
	{
		data[i] = new double[m_lN - m_lMarixBand[i]];
		ic_data[i] = new double[m_lN - m_lMarixBand[i]];
	}
	
	//zero
	for(long i = 0; i < m_lMarixBand.GetCount(); i++)
	{
		for(long j = 0; j < m_lN - m_lMarixBand[i]; j++)
		{
			data[i][j] = 0;
			ic_data[i][j] = 0;
		}
	}
}
CFeMarix::~CFeMarix(void)
{	
	if(m_lMarixBand.GetCount())
	{
		for(long i = 0; i < m_lMarixBand.GetCount(); i++)
		{
			delete[] data[i];
			delete[] ic_data[i];
		}
		delete[] data;
		delete[] ic_data;
		m_lMarixBand.RemoveAll();
	}
}
CFeMarix& CFeMarix::operator =(CFeMarix& a )
{
	m_lN = a.m_lN;
	m_lMarixBand.RemoveAll();
	for(long i = 0; i < a.m_lMarixBand.GetCount(); i++)
	{
		m_lMarixBand.Add(a.m_lMarixBand[i]);
	}
	data = new double*[m_lMarixBand.GetCount()];
	ic_data = new double*[m_lMarixBand.GetCount()];
	for(long i = 0; i < m_lMarixBand.GetCount(); i++)
	{
		data[i] = new double[m_lN - m_lMarixBand[i]];
		ic_data[i] = new double[m_lN - m_lMarixBand[i]];
	}
	//zero
	for(long i = 0; i < m_lMarixBand.GetCount(); i++)
	{
		for(long j = 0; j < m_lN - m_lMarixBand[i]; j++)
		{
			data[i][j] = a.data[i][j];
			ic_data[i][j] = a.ic_data[i][j];
		}
	}	
	return* this;
}

CFeMarix& CFeMarix::operator-= (CFeMarix& a)
{
	for(long i = 0; i < m_lMarixBand.GetCount(); i++)
	{
		for(long j = 0; j < m_lN - m_lMarixBand[i]; j++)
		{
			data[i][j] -= a.data[i][j];
		}
	}
	return *this;
}
CFeMarix& CFeMarix::operator+= (CFeMarix& a)
{
	for(long i = 0; i < m_lMarixBand.GetCount(); i++)
	{
		for(long j = 0; j < m_lN - m_lMarixBand[i]; j++)
		{
			data[i][j] += a.data[i][j];
		}
	}
	return *this;
}
CFeMarix& CFeMarix::operator*= (double a)
{
	for(long i = 0; i < m_lMarixBand.GetCount(); i++)
	{
		for(long j = 0; j < m_lN - m_lMarixBand[i]; j++)
		{
			data[i][j] *= a;
		}
	}
	return *this;
}
CFeVector CFeMarix::operator* (CFeVector& a)
{
	double* v  = new double[m_lN];
	for(long i = 0; i < m_lN; i++)
	{
		v[i] = 0.0;
		for(long j = Judge(i); j > 0; j--)
		{
			v[i] += data[j][i - m_lMarixBand[j]]*a.v[i - m_lMarixBand[j]];
		}
		for(long j = 0; j < m_lMarixBand.GetCount() && m_lMarixBand[j]+i <m_lN ; j++)
		{
			v[i] += data[j][i]*a.v[i+m_lMarixBand[j]];
		}
	}
	return CFeVector(m_lN,v);
}
long CFeMarix::Judge(long i)
{
	for(long j = m_lMarixBand.GetCount() - 1; j >= 0; j --)
	{
		if( i >= m_lMarixBand[j])
			return j;
	}
	return -1;
}
void CFeMarix::Set(CFeMarix& a)
{
	for(long i = 0; i < m_lMarixBand.GetCount(); i++)
	{
		for(long j = 0; j < m_lN - m_lMarixBand[i]; j++)
		{
			data[i][j] = a.data[i][j];
		}
	}
}

void CFeMarix::Set_E(long i, long j, double a)
{
	if(j>=i)
	{
		for(long k = 0; k < m_lMarixBand.GetCount(); k++)
		{
			if(i + m_lMarixBand[k] == j)
			{
				data[k][i] = a;
			}
		}
	}	
}
double CFeMarix::Get_E(long i, long j)
{
	if(j>=i)
	{
		for(long k = 0; k < m_lMarixBand.GetCount(); k++)
		{
			if(i + m_lMarixBand[k] == j)
			{
				return data[k][i];
			}
			else
			{
				return 0;
			}
		}
	}
	else
	{
		return CFeMarix::Get_E(j, i);
	}
}
void CFeMarix::Add_E(long i, long j, double a)
{
	if(j>=i)
	{
		for(long k = 0; k < m_lMarixBand.GetCount(); k++)
		{
			if(i + m_lMarixBand[k] == j)
			{
				data[k][i] += a;
			}
		}
	}	
}

void CFeMarix::ICC(void)
{
	long i = 0;
	long j = 0;
	long k = 0;
	long l = 0;
	long m = 0;
	long q = 0;
	long n = 0;
	double sum = 0;
	double ca = 0;
	//data -> ic_data
	for( j = 0; j < m_lMarixBand.GetCount() && i + m_lMarixBand[j] < m_lN; j++)
	{
		::CopyMemory(ic_data[j],data[j],(m_lN - m_lMarixBand[j])*sizeof(double));
	}

	//
	for(i = 0; i < m_lN; i++)
	{
		for(j = Judge(i); j > 0; j--)
		{
			if( fabs(ic_data[0][i-m_lMarixBand[j]]) < 1.0e-20)
			{
				return;
			}
			ca = ic_data[j][i-m_lMarixBand[j]]/ic_data[0][i-m_lMarixBand[j]];
			for( k = i-m_lMarixBand[j]+1; k < i; k++)
			{
				for( l = Judge(k); l >0; l--)
				{
					if(k - m_lMarixBand[l] == i - m_lMarixBand[j])
					{
						ic_data[j][i-m_lMarixBand[j]] = ic_data[j][i-m_lMarixBand[j]] - ca*ic_data[l][k - m_lMarixBand[l]];
						break;
					}
				}
			}
		}
		ca = fabs(ic_data[0][i]);
		if( ca < 1.0e-20 )
		{
			return;
		}
		for(l = Judge(i); l > 0; l--)
		{
			 ca +=  fabs(ic_data[l][i- m_lMarixBand[l]]);
		}
		ic_data[0][i] = ca;
	}
	
}
CFeVector CFeMarix::ICCINV(CFeVector& R)
{

	CFeVector reV(R.m_lN);
	
	//解方程
	long i = 0;
	long j = 0;
	double sum = 0;
	for( i = 0; i < m_lN; i++)
	{
		for( sum = R.v[i], j = Judge(i); j > 0; j--)
		{
			sum -= ic_data[j][i-m_lMarixBand[j]]*reV.v[i-m_lMarixBand[j]]/ic_data[0][i-m_lMarixBand[j]];
		}
		reV.v[i] = sum;//ic_data[0][i];
	}
	//
	for( i = m_lN-1; i >= 0 ; i--)
	{
		for(j = 1; j < m_lMarixBand.GetCount() && i+m_lMarixBand[j] < m_lN; j++)
		{
			reV.v[i] -= reV.v[i+m_lMarixBand[j]]*ic_data[j][i];
		}
		reV.v[i] /= ic_data[0][i];
	}
	return reV;
}

void CFeMarix::Save(void)
{
	FILE* fp = fopen("E:\\data.dat","w+");
	for(long i = 0; i < m_lN; i++)
	{
		for(long j = 0; j < m_lMarixBand.GetCount() && i+m_lMarixBand[j] < m_lN ; j++)
		{
			fprintf(fp,"%f\t",data[j][i]);
		}
		fprintf(fp,"\n");
	}
	fclose(fp);
}

void CFeMarix::CreateData(long m_lNin, CArray<long,long>& m_lMarixBandIn, double** datades)
{
	datades = new double*[m_lMarixBandIn.GetCount()];
	for(long i = 0; i < m_lMarixBandIn.GetCount(); i++)
	{
		datades[i] = new double[m_lN - m_lMarixBandIn[i]];
	}
}
void CFeMarix::CholeskyEquation(CFeVector& X, CFeVector& B)
{
	//乔莱斯基分解解方程组
	double* m_dfB = B.v;
	double* m_dfX = X.v;
	long i,j,k;
	double sum;	

	double** m_dfA;
	m_dfA = new double*[m_lN];
	for( i = 0; i < m_lN; i++)
	{
		m_dfA[i] = new double[m_lN];
	}

	for( i = 0; i < m_lN; i++)
	{
		for( j = 0; j < m_lN; j++)
		{
			m_dfA[i][j] = 0.0;
		}
	}
	for(i = 0; i < m_lN;i++)
	{
		for(j = 0; j < m_lMarixBand.GetCount() && i+m_lMarixBand[j] < m_lN; j++)
		{
			m_dfA[i][i+m_lMarixBand[j]] = data[j][i];
		}
	}
	for(i = 0; i < m_lN;i++)
	{
		for(j = i; j < m_lN; j++)
		{
			for(sum = m_dfA[i][j], k = i-1; k >= 0; k--)
			{
				sum -= m_dfA[i][k]*m_dfA[j][k];
			}
			if(i == j)
			{
				if( sum <= 0.0)
				{
					//error
					sum = 1;					
				}
				m_dfA[i][i] = sqrt(sum);
            }
			else
			{
				m_dfA[j][i] = sum/m_dfA[i][i];
			}
		}
	}
	//
	for( i = 0; i < m_lN; i++)
	{
		for(sum = m_dfB[i],k = i - 1;k >= 0;k--)
		{
			sum -= m_dfA[i][k]*m_dfX[k];			
		}
		m_dfX[i] = sum/m_dfA[i][i];
	}
	for( i = m_lN-1; i>= 0; i--)
	{
		for(sum = m_dfX[i],k = i+1; k < m_lN; k++)
		{
			sum -= m_dfA[k][i]*m_dfX[k];
		}
		m_dfX[i] = sum/m_dfA[i][i];
	}
	//
	
	for( i = 0; i < m_lN; i++)
	{
		delete[] m_dfA[i];
	}
	delete[] m_dfA;

}

void CFeMarix::Zero(void)
{
	for(long i = 0; i < m_lMarixBand.GetCount(); i++)
	{
		for(long j = 0; j < m_lN - m_lMarixBand[i]; j++)
		{
			data[i][j] = 0;
		}
	}
}

⌨️ 快捷键说明

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