📄 maafbsub.cpp
字号:
//===========================================================================
//
// EMS高级应用软件
//
//===========================================================================
// rev 0.0 8-9-2004 initial release Qwbin
// 版本 0.0 8-9-2004 第一次发布 齐文斌
//---------------------------------------------------------------------------
//***********************************************************************
// maafbsub - forward / backward substitution for sparse asymmetric matrix
// 只有maasolve()调用
//************************************************************************
#include <malib.h>
//************************************************************************
int EmsMatrix::maafbsub (void)
{
if ( nmastate > 0 )
{
opfinitialize();
opfforward_sub();
opfdivide_diagonal();
opfbackward_sub();
}
return ( SUCCESS );
}
//************************************************************************
// initialize
//************************************************************************
void EmsMatrix::opfinitialize (void)
{
int i;
struct maorderst *maorderpt;
struct mastatest *mastatept, *base_mastatept;
for ( i = 0; i < nmastate; i++)
{
maorderpt = maorder_vt[i];
mastatept = mastate_vt[maorderpt->mastate_itm-1];
maorderpt->link.mastatept = mastatept;
}
return;
}
//************************************************************************
// formard_sub - Forward substitution
//************************************************************************
void EmsMatrix::opfforward_sub (void)
{
int i, j;
double value;
struct maorderst *col_maorderpt, *base_maorderpt;
struct magmtrxst *magmtrpt, *base_magmtrpt;
for ( i=1;i<=nmastate;i++)
{
value = 0.0;
maorderpt= maorder_vt[i-1];
magmtrpt = magmtrx_vt[maorderpt->magmtrx_itm-1];
for ( j=0; j<maorderpt->magmtrx_cnt; j++)
{
magmtrpt =magmtrx_vt[j+maorderpt->magmtrx_itm-1];
if ( i > magmtrpt->colitm )
{
//col_maorderpt = base_maorderpt + magmtrpt->colitm;
col_maorderpt = maorder_vt[magmtrpt->colitm-1];
value += magmtrpt->element * col_maorderpt->link.mastatept->x;
}
}
maorderpt->link.mastatept->x -= value;
}
return;
}
//************************************************************************
// divide_diagonal
//************************************************************************
void EmsMatrix::opfdivide_diagonal (void)
{
int i;
for ( i=0; i<nmastate; i++)
{
maorderpt= maorder_vt[i-1];
maorderpt->link.mastatept->x *= maorderpt->diag;
}
return;
}
//************************************************************************
// backward_sub
//************************************************************************
void EmsMatrix::opfbackward_sub(void)
{
int i, j;
int nmastate;
double value;
struct maorderst *maorderpt, *col_maorderpt;
struct magmtrxst *magmtrpt;
int k=0;
for ( i=nmastate; i>0; i--)
{
maorderpt =maorder_vt[i-1];
value = 0.0;
magmtrpt = magmtrx_vt[maorderpt->magmtrx_itm-1];
for ( j=0; j<maorderpt->magmtrx_cnt; j++ )
{
magmtrpt =magmtrx_vt[j+maorderpt->magmtrx_itm-1];
if ( i < magmtrpt->colitm )
{
col_maorderpt = maorder_vt[magmtrpt->colitm-1];
value += magmtrpt->element * col_maorderpt->link.mastatept->x;
}
}
maorderpt->link.mastatept->x -= value;
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -