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 + -
显示快捷键?