📄 mafbsub.cpp
字号:
//===========================================================================
//
// EMS高级应用软件
//
//===========================================================================
// rev 0.0 8-9-2004 initial release Qwbin
// 版本 0.0 8-9-2004 第一次发布 齐文斌
//---------------------------------------------------------------------------
//************************************************************************
// mafbsub - forward/backward substitution for sparse symmetric matrix
// 线性方程求解叠代过程
//************************************************************************
#include <malib.h>
//************************************************************************
int EmsMatrix::mafbsub(void)
{
int i;
struct maorderst *maorderpt;
struct mastatest *mastatept, *base_mastatept;
if ( nmastate > 0 )
{
for (i = 0; i < nmastate; i++)
{
maorderpt = maorder_vt[i];
mastatept = mastate_vt[maorderpt->mastate_itm-1];
maorderpt->link.mastatept = mastatept;
}
forward_substitution ();
//按经典PQ分解法or修正PQ分解法选择不同数据来源 mdn 04-11-11
if( ( Q_V == 2 ) && ( lf_type == 2) )
{
for(i = 0; i< nmastate; i++)
{
maorderpt = maorder_vt[i];
maorderpt->link.mastatept->x *= maorderpt->diag1;
}
}
else
{
for(i = 0; i< nmastate; i++)
{
maorderpt = maorder_vt[i];
maorderpt->link.mastatept->x *= maorderpt->diag;
}
}
//
backward_substitution ();
}
return ( SUCCESS );
}
//************************************************************************
// forward_substitution - forward substitution
//
// Zi=Zj-Lij*Zi 前代运算
//************************************************************************
void EmsMatrix::forward_substitution (void)
{
int i;
int j;
double value;
struct maorderst *maorderpt;
struct maorderst *col_maorderpt;
struct magmtrxst *magmtrxpt;
for (i = 0; i < nmastate; i++)
{
maorderpt = maorder_vt[i];
value = 0.0;
//magmtrxpt = base_magmtrxpt + maorderpt->magmtrx_itm;
for ( j = 0; j < maorderpt->magmtrx_cnt; j++)
{
magmtrxpt =magmtrx_vt[j+maorderpt->magmtrx_itm-1];
if (magmtrxpt->colitm <1) break; //mdn 06-3-22
col_maorderpt = maorder_vt[magmtrxpt->colitm-1];
// value += magmtrxpt->element * col_maorderpt->link.mastatept->x;
//双重标识控制因子表的数据来源 mdn 04-11-10
if ( ( Q_V == 2 ) && ( lf_type == 2) )
value += magmtrxpt->xij * col_maorderpt->link.mastatept->x;
else
value += magmtrxpt->element * col_maorderpt->link.mastatept->x;
}
maorderpt->link.mastatept->x -= value;
}
return;
}
//************************************************************************
// backward_substitution - backward substitution
// 回推运算
// xi=xi-Uij*xj
//************************************************************************
void EmsMatrix::backward_substitution (void)
{
int i, magmtrx_col;
double value;
struct maorderst *maorderpt, *row_maorderpt;
for (i = 0; i < nmastate; i++)
{
maorderpt = maorder_vt[nmastate-1-i];
value = 0.0;
magmtrx_col = maorderpt->magmtrx_col;
while ( magmtrx_col >0 )
{
magmtrxpt = magmtrx_vt[magmtrx_col-1];
if (magmtrxpt->rowitm<1) break; //mdn 06-3-22
row_maorderpt = maorder_vt[magmtrxpt->rowitm-1];
// value += magmtrxpt->element * row_maorderpt->link.mastatept->x;
//双重标识控制因子表的数据来源 mdn 04-11-10
if ( ( Q_V == 2 ) && ( lf_type == 2) )
value += magmtrxpt->xij * row_maorderpt->link.mastatept->x;
else
value += magmtrxpt->element * row_maorderpt->link.mastatept->x;
//
magmtrx_col = magmtrxpt->magmtrx_itm;
}
maorderpt->link.mastatept->x -= value;
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -