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
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);
|
|
}
|
|
}
|