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; }