mareordr.cpp
来自「电力系统稀疏矩阵计算类,用法范例代码,包括三个目录,MALIB(类),MATES」· C++ 代码 · 共 127 行
CPP
127 行
//===========================================================================
//
// EMS高级应用软件
//
//===========================================================================
// rev 0.0 7-29-2004 initial release Qwbin
// 版本 0.0 7-29-2004 第一次发布 齐文斌
//---------------------------------------------------------------------------
//************************************************************************
// mareordr - Reordering symmetric matrix based on the optimal order
// 根据优化排序的结果,重新生成对称矩阵,cmtrxpt,用于实际计算
//
//************************************************************************
#include <malib.h>
bool cmp_as (const void *, const void * );
int cmp_as0 (const void *pt1, const void *pt2 );
//************************************************************************
int EmsMatrix::mareordr(void)
{
struct mastatest *col_mastatept;
struct maamtrxst *cmtrxstpt;
struct maamtrxst *maamtrxpt;
struct maamtrxst *cmtrxpt;
struct mastatest *mastatept;
struct maorderst *maorderpt;
int rc = SUCCESS;
int c_item = 1;
int a_count, n_count;
int i, j;
int m_recnum=0,m_sidx=0;
m_recnum = nmaamtrx/2;
//struct maamtrxst 是计算用中间结果,可以不用VECTOR. if ( cmtrxft != NULL ) { delete cmtrxft; cmtrxft =NULL; } cmtrxft = (char *)new struct maamtrxst[m_recnum ]; memset(cmtrxft, 0, m_recnum*sizeof(struct maamtrxst)); cmtrxpt =(struct maamtrxst *)cmtrxft;
//add 2006-02-18
for ( i = 1;i<= nmastate && rc == SUCCESS ; i++)
{
maorderpt = maorder_vt[i-1];
mastatept = mastate_vt[maorderpt->mastate_itm-1];
if ( mastatept->maorder_itm == i )
{
if ( mastatept->maamtrx_itm != 0 )
{
//maamtrxpt = maamtrx_vt[mastatept->maamtrx_itm-1];
a_count = mastatept->maamtrx_cnt;
cmtrxstpt = cmtrxpt;
n_count = 0;
//一行元素,以列递增排列
//m_sidx = cmtrx_vt.size();
for ( j = 1 ; j <= a_count ; j++)
{
maamtrxpt = maamtrx_vt[j+mastatept->maamtrx_itm-2];
col_mastatept = mastate_vt[maamtrxpt->colitm - 1];
if (i > col_mastatept->maorder_itm)
{
cmtrxpt->rowitm = i;
cmtrxpt->colitm = col_mastatept->maorder_itm;
cmtrxpt->element = maamtrxpt->element;
//支路电抗倒数 mdn 04-11-10
cmtrxpt->xij = maamtrxpt->xij;
//
cmtrxpt->g = maamtrxpt->g;
n_count++;
cmtrxpt++;
}
}
if ( n_count > 1 )
//std::sort(cmtrx_vt.begin()+m_sidx-1, cmtrx_vt.end(),cmp_as);
qsort(cmtrxstpt, n_count, sizeof(struct maamtrxst),&cmp_as0);
maorderpt->cmtrxitm = c_item;
maorderpt->cmtrxcnt = n_count;
c_item += n_count;
}
}
else
{
rc = !SUCCESS;
printf("mareordr:invalid order/state linkages for maorder item %d \n",i);
}
}
return( rc );
}
//************************************************************************
// cmp_as - comparing off-diags for matrix
// 按列递增顺序排列
//************************************************************************
bool cmp_as (const void *pt1, const void *pt2 )
{
struct maamtrxst *item_1pt = (struct maamtrxst *)pt1;
struct maamtrxst *item_2pt = (struct maamtrxst *)pt2;
return ( item_1pt->colitm<item_2pt->colitm );
}
//************************************************************************
// cmp_as - comparing off-diags for matrix
// 按列递增顺序排列
//************************************************************************
int cmp_as0 (const void *pt1, const void *pt2 )
{
struct maamtrxst *item_1pt = (struct maamtrxst *)pt1;
struct maamtrxst *item_2pt = (struct maamtrxst *)pt2;
return ( item_1pt->colitm-item_2pt->colitm );
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?