You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

139 lines
3.1 KiB

/**********
Copyright 1991 Regents of the University of California. All rights reserved.
Author: 1991 David A. Gates, U. C. Berkeley CAD Group
**********/
#include "ngspice/ngspice.h"
#include "ngspice/numglobs.h"
#include "ngspice/numenum.h"
#include "ngspice/twodev.h"
#include "ngspice/twomesh.h"
#include "ngspice/spmatrix.h"
#include "twoddefs.h"
#include "twodext.h"
extern void CiderLoaded(int);
void
TWOdestroy(TWOdevice *pDevice)
{
int index, eIndex;
TWOelem *pElem;
TWOnode *pNode;
TWOedge *pEdge;
if ( !pDevice ) return;
switch ( pDevice->solverType ) {
case SLV_SMSIG:
case SLV_BIAS:
/* free up memory allocated for the bias solution */
FREE( pDevice->dcSolution );
FREE( pDevice->dcDeltaSolution );
FREE( pDevice->copiedSolution );
FREE( pDevice->rhs );
FREE( pDevice->rhsImag );
#ifdef KLU
SMPdestroyKLUforCIDER (pDevice->matrix) ;
#else
SMPdestroy (pDevice->matrix) ;
#endif
if (pDevice->matrix) {
FREE(pDevice->matrix);
}
break;
case SLV_EQUIL:
/* free up the vectors allocated in the equilibrium solution */
FREE( pDevice->dcSolution );
FREE( pDevice->dcDeltaSolution );
FREE( pDevice->copiedSolution );
FREE( pDevice->rhs );
#ifdef KLU
SMPdestroyKLUforCIDER (pDevice->matrix) ;
#else
SMPdestroy (pDevice->matrix) ;
#endif
if (pDevice->matrix) {
FREE(pDevice->matrix);
}
break;
case SLV_NONE:
break;
default:
fprintf( stderr, "Panic: Unknown solver type in TWOdestroy.\n" );
exit( -1 );
break;
}
/* destroy the mesh */
if ( pDevice->elements ) {
for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) {
pElem = pDevice->elements[ eIndex ];
for ( index = 0; index <= 3; index++ ) {
if ( pElem->evalNodes[ index ] ) {
pNode = pElem->pNodes[ index ];
FREE( pNode );
}
if ( pElem->evalEdges[ index ] ) {
pEdge = pElem->pEdges[ index ];
FREE( pEdge );
}
}
FREE( pElem );
}
FREE( pDevice->elements );
for (int xIndex = 1; xIndex < pDevice->numXNodes; xIndex++) {
FREE(pDevice->elemArray[xIndex]);
}
FREE( pDevice->elemArray );
}
if (pDevice->pChannel) {
TWOchannel* pCtmp = pDevice->pChannel;
while (pCtmp) {
TWOchannel* pCtmpnext = pCtmp->next;
FREE(pCtmp);
pCtmp = pCtmpnext;
}
}
if (pDevice->pMaterials) {
TWOmaterial* pMtmp = pDevice->pMaterials;
while (pMtmp) {
TWOmaterial* pMtmpnext = pMtmp->next;
FREE(pMtmp);
pMtmp = pMtmpnext;
}
}
if (pDevice->pFirstContact) {
struct sTWOcontact* pFCtmp = pDevice->pFirstContact;
while (pFCtmp) {
struct sTWOcontact* pFCtmpnext = pFCtmp->next;
if (pFCtmp->pNodes) {
FREE(pFCtmp->pNodes);
}
FREE(pFCtmp);
pFCtmp = pFCtmpnext;
}
}
if (pDevice->pStats) {
FREE(pDevice->pStats);
}
if (pDevice->xScale) {
FREE(pDevice->xScale);
}
if (pDevice->yScale) {
FREE(pDevice->yScale);
}
FREE( pDevice );
{
CiderLoaded(-1);
}
}