⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 maafbsub.cpp

📁 电力系统稀疏矩阵计算类,用法范例代码,包括三个目录,MALIB(类),MATEST(使用范例),INCLUDE(*.H),是我编写的电力系统能量管理系统基础类之一.
💻 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 + -