📄 connectivity.cpp
字号:
for(i=0; i<g_netModel.nNodeSum; i++)
{
*(pMatrixLocal+i) = new int[g_netModel.nNodeSum+2];
memset(*(pMatrixLocal+i),0,sizeof(int)*(g_netModel.nNodeSum+2));
*(*(pMatrixLocal+i)+i) = 1;
}
return AV_NO_ERR;
}
/*****************************************************************************
【函数名称】 AVInitNodeMatrix()
【函数功能】 由初始状态初始化节点连通性分析矩阵(After state init)
【输入参数】 无
【输出参数】 无
【特殊说明】 该函数只能在进行全局初始化的时候调用,因为它只是对节点矩阵进行重新计算
而没有重新初始化计算过程所依赖的节点信息、元件信息等网络模型基本信息
*****************************************************************************/
AV_EXPORT USHORT AVInitNodeMatrix()
{
if(g_netModel.nComponentSum == 0 || g_netModel.pComponentInfo == NULL) return AVERR_NOT_FOUND;
if(g_pMatrixNodeOrigin == NULL) return AVERR_NOT_FOUND;
//由元件状态初始化网络拓扑模型的节点矩阵(为完全对称矩阵)
for(int i=0; i<g_netModel.nComponentSum; i++)
{
if((g_netModel.pComponentInfo+i)->nState != 1) continue;
if((g_netModel.pComponentInfo+i)->nPortSum <= 1) continue;
for(int j=0; j<(g_netModel.pComponentInfo+i)->nPortSum; j++)
{
if(((g_netModel.pComponentInfo+i)->pPortInfo+j)->nType == PORT_TYPE_SINGLE) continue;
int nNodeRef = ((g_netModel.pComponentInfo+i)->pPortInfo+j)->nNode;
if(nNodeRef < 0 || nNodeRef >= g_netModel.nNodeSum) continue;
for(int k=j; k<(g_netModel.pComponentInfo+i)->nPortSum; k++)
{
if(((g_netModel.pComponentInfo+i)->pPortInfo+k)->nType == PORT_TYPE_SINGLE) continue;
int nNodeTag = ((g_netModel.pComponentInfo+i)->pPortInfo+k)->nNode;
if(nNodeTag < 0 || nNodeTag >= g_netModel.nNodeSum) continue;
*(*(g_pMatrixNodeOrigin+nNodeRef)+nNodeTag) = 1;
*(*(g_pMatrixNodeOrigin+nNodeTag)+nNodeRef) = 1;
}
}
}
CopyNodeMatrix(g_pMatrixNodeCurrent,g_pMatrixNodeOrigin);
CalcNodeMatrix(g_pMatrixNodeCurrent);
CopyNodeMatrix(g_pMatrixNodePrev,g_pMatrixNodeCurrent);
return AV_NO_ERR;
}
/*****************************************************************************
【函数名称】 AVRefreshPrevNodeMatrix()
【函数功能】 由后一状态更新前一状态节点联通性分析矩阵
【输入参数】 无
【输出参数】 无
*****************************************************************************/
AV_EXPORT USHORT AVRefreshPrevNodeMatrix()
{
if(g_pMatrixNodePrev == NULL) return AVERR_OVER;
CopyNodeMatrix(g_pMatrixNodePrev,g_pMatrixNodeCurrent);
return AV_NO_ERR;
}
/*****************************************************************************
【函数名称】 AVGetPrevConnectiveSubsetSum(int* nSum,int** pNodeRef)
【函数功能】 获取当前分析模型下的连通子集数目
【输入参数】 无
【输出参数】 连通子集数目
*****************************************************************************/
AV_EXPORT USHORT AVGetPrevConnectiveSubsetSum(int* nSum,int** pNodeRef)
{
if(g_pMatrixNodePrev == NULL) return AVERR_OVER;
CIntArray flagArray;
CIntArray nodeArray;
int nCount = g_netModel.nNodeSum;
for(int i=0; i<nCount; i++)
{
BOOL bFind = FALSE;
for(int j=0; j<flagArray.GetSize(); j++)
{
if(*(*(g_pMatrixNodePrev+i)+nCount) == flagArray[j])
{
bFind = TRUE;
break;
}
}
if(!bFind)
{
//独立节点认为是子集(2003.05.19 By Luo kaiming for AutoTicket)
flagArray.Add(*(*(g_pMatrixNodePrev+i)+nCount));
nodeArray.Add(i);
/* int nNodeCount = 0;
for(j=0; j<nCount; j++)
{
if(*(*(g_pMatrixNodePrev+i)+j) == 1) nNodeCount ++;
if(nNodeCount >= 2)
{
flagArray.Add(*(*(g_pMatrixNodePrev+i)+nCount));
nodeArray.Add(i);
break;
}
}*/
}
}
*nSum = nodeArray.GetSize();
if(*nSum >= 1 && pNodeRef != NULL)
{
*pNodeRef = new int[*nSum];
for(i=0; i<*nSum; i++)
*(*pNodeRef+i) = nodeArray[i];
}
return AV_NO_ERR;
}
/*****************************************************************************
【函数名称】 AVGetPrevConnectiveSubsetByNode(AV_NET_SUBSET* pSubset,int nNodeID)
【函数功能】 由节点ID获取当前分析模型该节点所在的连通子集
【输入参数】 指定节点nNodeID
【输出参数】 指定节点所在的连通子集pSubset
*****************************************************************************/
AV_EXPORT USHORT AVGetPrevConnectiveSubsetByNode(AV_NET_SUBSET* pSubset,int nNodeID)
{
if(nNodeID < 0 || nNodeID >= g_netModel.nNodeSum) return AVERR_OVER;
if(g_pMatrixNodePrev == NULL) return AVERR_OVER;
//收集并填充节点序列、元件(必须所有节点均在子集内的)序列
CIntArray intArray;
typedef CTypedPtrList<CPtrList,AV_COMPONENT_INFO*>CComponentInfoList;
CComponentInfoList componentInfoList;
for(int i=0; i<g_netModel.nNodeSum; i++)
{
if(*(*(g_pMatrixNodePrev+nNodeID)+i) != 1) continue;
intArray.Add(i);
AV_NODE_INFO* pNodeInfo = g_netModel.pNodeInfo + i;
for(int j=0; j<pNodeInfo->nComponentSum; j++)
{
//此处元件的由于需要考虑状态,因此必须到元件集中查找
AV_COMPONENT_INFO* pComponent = NULL;
pComponent = GetComponentInfoByID(pNodeInfo->pKeyInfo+j);
if(!pComponent) continue;
//状态为1的元件必然在此子集内
if(pComponent->nState == 1)
{
//如果某个元件只有中性点端子在此子集内则应该排除(2003.11.24 for not process single port function)
BOOL bNodeOnlySinglePort = TRUE;
for(int k=0; k<pComponent->nPortSum; k++)
{
int nPortNode = (pComponent->pPortInfo+k)->nNode;
if(nPortNode < 0 || nPortNode >= g_netModel.nNodeSum) break;
if(*(*(g_pMatrixNodePrev+nNodeID)+nPortNode) == 1)
{
if((pComponent->pPortInfo+k)->nType != PORT_TYPE_SINGLE)
{
bNodeOnlySinglePort = FALSE;
break;
}
}
}
if(!bNodeOnlySinglePort)
{
if(!componentInfoList.Find(pComponent))
componentInfoList.AddTail(pComponent);
}
}
else
{
BOOL bAllNodeInSubset = TRUE;
for(int k=0; k<pComponent->nPortSum; k++)
{
int nPortNode = (pComponent->pPortInfo+k)->nNode;
if(nPortNode < 0 || nPortNode >= g_netModel.nNodeSum)
{
bAllNodeInSubset = FALSE;
break;
}
if(*(*(g_pMatrixNodePrev+nNodeID)+nPortNode) == 0)
{
bAllNodeInSubset = FALSE;
break;
}
}
//如果状态不为1,但是其上所有节点均在子集内,则该元件也在子集内
if(bAllNodeInSubset)
{
if(!componentInfoList.Find(pComponent))
componentInfoList.AddTail(pComponent);
}
}
}
}
pSubset->nNodeSum = intArray.GetSize();
if(pSubset->nNodeSum >= 1)
{
pSubset->pNodeInfo = new int[pSubset->nNodeSum];
for(i=0; i<pSubset->nNodeSum; i++)
*(pSubset->pNodeInfo+i) = intArray[i];
}
pSubset->nComponentSum = componentInfoList.GetCount();
if(pSubset->nComponentSum >= 1)
{
pSubset->pKeyInfo = new AV_KEY_INFO[pSubset->nComponentSum];
int i = 0;
POSITION pos = componentInfoList.GetHeadPosition();
while(pos)
{
AV_COMPONENT_INFO* pComponent = (AV_COMPONENT_INFO*)componentInfoList.GetNext(pos);
*(pSubset->pKeyInfo+i) = pComponent->keyInfo;
i++;
}
}
return AV_NO_ERR;
}
/*****************************************************************************
【函数名称】 AVGetCurrentConnectiveSubsetSum(int* nSum,int** pNodeRef)
【函数功能】 获取当前分析模型下的连通子集数目
【输入参数】 无
【输出参数】 连通子集数目
*****************************************************************************/
AV_EXPORT USHORT AVGetCurrentConnectiveSubsetSum(int* nSum,int** pNodeRef)
{
if(g_pMatrixNodeCurrent == NULL) return AVERR_OVER;
CIntArray flagArray;
CIntArray nodeArray;
//对矩阵进行行扫描
int nCount = g_netModel.nNodeSum;
for(int i=0; i<nCount; i++)
{
//一旦i行的连通子集标志已经被计数则继续下一行
BOOL bFind = FALSE;
for(int j=0; j<flagArray.GetSize(); j++)
{
if(*(*(g_pMatrixNodeCurrent+i)+nCount) == flagArray[j])
{
bFind = TRUE;
break;
}
}
if(!bFind)
{
//独立节点认为是子集(2003.05.19 By Luo kaiming for AutoTicket)
flagArray.Add(*(*(g_pMatrixNodeCurrent+i)+nCount));
nodeArray.Add(i);
/* int nNodeCount = 0;
for(j=0; j<nCount; j++)
{
if(*(*(g_pMatrixNodeCurrent+i)+j) == 1) nNodeCount ++;
if(nNodeCount >= 2)
{
flagArray.Add(*(*(g_pMatrixNodeCurrent+i)+nCount));
nodeArray.Add(i);
break;
}
}*/
}
}
*nSum = nodeArray.GetSize();
if(*nSum >= 1 && pNodeRef != NULL)
{
*pNodeRef = new int[*nSum];
for(i=0; i<*nSum; i++)
*(*pNodeRef+i) = nodeArray[i];
}
return AV_NO_ERR;
}
/*****************************************************************************
【函数名称】 AVGetCurrentConnectiveSubsetByNode(AV_NET_SUBSET* pSubset,int nNodeID)
【函数功能】 由节点ID获取当前分析模型该节点所在的连通子集
【输入参数】 指定节点nNodeID
【输出参数】 指定节点所在的连通子集pSubset
*****************************************************************************/
AV_EXPORT USHORT AVGetCurrentConnectiveSubsetByNode(AV_NET_SUBSET* pSubset,int nNodeID)
{
if(nNodeID < 0 || nNodeID >= g_netModel.nNodeSum) return AVERR_OVER;
if(g_pMatrixNodeCurrent == NULL) return AVERR_OVER;
//收集并填充节点序列、元件(必须所有节点均在子集内的)序列
CIntArray intArray;
typedef CTypedPtrList<CPtrList,AV_COMPONENT_INFO*>CComponentInfoList;
CComponentInfoList componentInfoList;
for(int i=0; i<g_netModel.nNodeSum; i++)
{
if(*(*(g_pMatrixNodeCurrent+nNodeID)+i) != 1) continue;
intArray.Add(i);
AV_NODE_INFO* pNodeInfo = NULL;
AVGetNetNodeInfo(i,&pNodeInfo);
if(!pNodeInfo) continue;
for(int j=0; j<pNodeInfo->nComponentSum; j++)
{
//此处元件的由于需要考虑状态,因此必须到元件集中查找
AV_COMPONENT_INFO* pComponent = NULL;
pComponent = GetComponentInfoByID(pNodeInfo->pKeyInfo+j);
if(!pComponent) continue;
//状态为1的元件不一定必然在此子集内
if(pComponent->nState == 1)
{
//如果某个元件只有中性点端子在此子集内则应该排除(2003.11.24 for not process single port function)
BOOL bNodeOnlySinglePort = TRUE;
for(int k=0; k<pComponent->nPortSum; k++)
{
int nPortNode = (pComponent->pPortInfo+k)->nNode;
if(nPortNode < 0 || nPortNode >= g_netModel.nNodeSum) break;
if(*(*(g_pMatrixNodeCurrent+nNodeID)+nPortNode) == 1)
{
if((pComponent->pPortInfo+k)->nType != PORT_TYPE_SINGLE)
{
bNodeOnlySinglePort = FALSE;
break;
}
}
}
if(!bNodeOnlySinglePort)
{
if(!componentInfoList.Find(pComponent))
componentInfoList.AddTail(pComponent);
}
}
else
{
BOOL bAllNodeInSubset = TRUE;
for(int k=0; k<pComponent->nPortSum; k++)
{
int nPortNode = (pComponent->pPortInfo+k)->nNode;
if(nPortNode < 0 || nPortNode >= g_netModel.nNodeSum)
{
bAllNodeInSubset = FALSE;
break;
}
if(*(*(g_pMatrixNodeCurrent+nNodeID)+nPortNode) == 0)
{
bAllNodeInSubset = FALSE;
break;
}
}
//如果状态不为1,但是其上所有节点均在子集内,则该元件也在子集内
if(bAllNodeInSubset)
{
if(!componentInfoList.Find(pComponent))
componentInfoList.AddTail(pComponent);
}
}
}
}
pSubset->nNodeSum = intArray.GetSize();
if(pSubset->nNodeSum >= 1)
{
pSubset->pNodeInfo = new int[pSubset->nNodeSum];
for(i=0; i<pSubset->nNodeSum; i++)
*(pSubset->pNodeInfo+i) = intArray[i];
}
pSubset->nComponentSum = componentInfoList.GetCount();
if(pSubset->nComponentSum >= 1)
{
pSubset->pKeyInfo = new AV_KEY_INFO[pSubset->nComponentSum];
int i = 0;
POSITION pos = componentInfoList.GetHeadPosition();
while(pos)
{
AV_COMPONENT_INFO* pComponent = (AV_COMPONENT_INFO*)componentInfoList.GetNext(pos);
*(pSubset->pKeyInfo+i) = pComponent->keyInfo;
i++;
}
}
return AV_NO_ERR;
}
#ifdef __cplusplus
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -