bool CLinearSystem_Eigen::MultVecMassDecomp(int ivec){
	const unsigned int nlss = this->GetNLynSysSeg();
	assert( nlss == 1 );
	CVector_Blk& vec = m_ls.GetVector(ivec,0);
/*	if( ivec >= 0 ){
		assert( ivec < this->GetTmpVectorArySize() );
		pUpdate = this->m_ls.m_TmpVectorArray[ivec][0];
	}
	else if( ivec == -2 ){
		pUpdate = this->m_ls.m_Update[0];
	}
	else{ assert(0); }*/
	CDiaMat_Blk* dmat = this->m_DiaMassMatrix[0];
	const unsigned int nblk = dmat->NBlk();
	const unsigned int nlen = dmat->LenBlk();
	assert( nlen == 3 );
	if( nlen == 3 ){
		for(unsigned int iblk=0;iblk<nblk;iblk++){
			const double* pValMi = dmat->GetPtrValDia(iblk);
			double val0 = vec.GetValue(iblk,0);
			double val1 = vec.GetValue(iblk,1);
			double val2 = vec.GetValue(iblk,2);
			const double val3 = val0/pValMi[0];
			const double val4 = val1/pValMi[4];
			const double val5 = val2/pValMi[8];
			vec.SetValue(iblk,0,val3);
			vec.SetValue(iblk,1,val4);
			vec.SetValue(iblk,2,val5);
		}
	}
	return true;
}
bool CZLinearSystem_GeneralEigen::MultUpdateInvMassDecomp()
{
	const unsigned int nlss = this->GetNLynSysSeg();
	assert( nlss == 1 );
	{
		CZVector_Blk* pUpdate = this->m_Update[0];
		CDiaMat_Blk* dmat = this->m_DiaMassMatrix[0];
		const unsigned int nblk = dmat->NBlk();
		const unsigned int nlen = dmat->LenBlk();
		assert( nlen == 1 );
		for(unsigned int iblk=0;iblk<nblk;iblk++){
			const double* pValMi = dmat->GetPtrValDia(iblk);
			Com::Complex val = pUpdate->GetValue(iblk,0);
			val *= (*pValMi);
			pUpdate->SetValue(iblk,0,val);
		}
	}
	return true;
}
bool CZLinearSystem_GeneralEigen::MultVecMassDecomp(int ivec){
	const unsigned int nlss = this->GetNLynSysSeg();
	assert( nlss == 1 );
	CZVector_Blk* pVec = 0;
	if( ivec >= 0 ){
        assert( ivec < (int)this->GetTmpVectorArySize() );
		pVec = this->m_TmpVectorArray[ivec][0];
	}
	else if( ivec == -2 ){	pVec = this->m_Update[0];   }
	else{					pVec = this->m_Residual[0]; }
	CDiaMat_Blk* dmat = this->m_DiaMassMatrix[0];
	const unsigned int nblk = dmat->NBlk();
	const unsigned int nlen = dmat->LenBlk();
	assert( nlen == 1 );
	for(unsigned int iblk=0;iblk<nblk;iblk++){
		const double* pValMi = dmat->GetPtrValDia(iblk);
		Com::Complex val0 = pVec->GetValue(iblk,0);
		const Com::Complex val1 = val0/pValMi[0];
		pVec->SetValue(iblk,0,val1);
	}
	return true;
}
bool CLinearSystem_Eigen::MultUpdateInvMassDecomp()
{
	const unsigned int nlss = this->GetNLynSysSeg();
	assert( nlss == 1 );
	{
		CVector_Blk* pUpdate = this->m_ls.m_Update[0];
		CDiaMat_Blk* dmat = this->m_DiaMassMatrix[0];
		const unsigned int nblk = dmat->NBlk();
		const unsigned int nlen = dmat->LenBlk();
		if( nlen == 1 ){
			for(unsigned int iblk=0;iblk<nblk;iblk++){
				const double* pValMi = dmat->GetPtrValDia(iblk);
				double val = pUpdate->GetValue(iblk,0);
				val *= (*pValMi);
				pUpdate->SetValue(iblk,0,val);
			}
		}
		else if( nlen == 2 ){
			for(unsigned int iblk=0;iblk<nblk;iblk++){
				const double* pValMi = dmat->GetPtrValDia(iblk);
				double val0 = pUpdate->GetValue(iblk,0);
				double val1 = pUpdate->GetValue(iblk,1);
				const double val2 = pValMi[0]*val0+pValMi[1]*val1;
				const double val3 = pValMi[2]*val0+pValMi[3]*val1;
				pUpdate->SetValue(iblk,0,val2);
				pUpdate->SetValue(iblk,1,val3);
			}
		}
		else if( nlen == 3 ){
			for(unsigned int iblk=0;iblk<nblk;iblk++){
				const double* pValMi = dmat->GetPtrValDia(iblk);
				double val0 = pUpdate->GetValue(iblk,0);
				double val1 = pUpdate->GetValue(iblk,1);
				double val2 = pUpdate->GetValue(iblk,2);
				const double val3 = pValMi[0]*val0+pValMi[1]*val1+pValMi[2]*val2;
				const double val4 = pValMi[3]*val0+pValMi[4]*val1+pValMi[5]*val2;
				const double val5 = pValMi[6]*val0+pValMi[7]*val1+pValMi[8]*val2;
				pUpdate->SetValue(iblk,0,val3);
				pUpdate->SetValue(iblk,1,val4);
				pUpdate->SetValue(iblk,2,val5);
			}
		}
	}
	return true;
}