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

📄 cktsencomp.c

📁 支持数字元件仿真的SPICE插件
💻 C
字号:
/* * Copyright (c) 1985 Thomas L. Quarles *//* CKTsenComp(ckt) * this is a program to solve the sensitivity equation  * of the given circuit  */#include "prefix.h"#include <stdio.h>#include "SMPdefs.h"#include "CKTdefs.h"#include "DEVdefs.h"#include "SPerror.h"#include "TRANdefs.h"#include "suffix.h"RCSID("CKTsenComp.c $Revision: 1.1 $ on $Date: 91/04/02 12:08:11 $")intCKTsenComp(ckt)register CKTcircuit *ckt;{    register int size;    int row;    int col;    SENstruct *info;#ifdef SENSDEBUG    char *rowe;    SMPelement *elt;#endif /* SENSDEBUG */#ifdef SENSDEBUG    printf("CKTsenComp\n");#endif /* SENSDEBUG */    size = SMPmatSize(ckt->CKTmatrix);    info = ckt->CKTsenInfo;    if((info->SENmode == DCSEN)||        (info->SENmode == TRANSEN))    {        /*  loop throgh all the columns of RHS            matrix - each column corresponding to a design            parameter */        for (col=1;col<=info->SENparms;col++) {            for(row=1;row<=size;row++){                *(ckt->CKTsenRhs + row ) = *(info->SEN_RHS[row] + col);            }            /* solve for the sensitivity values */            SMPsolve(ckt->CKTmatrix,ckt->CKTsenRhs,ckt->CKTrhsSpare);             /* store the sensitivity values */            for(row=1;row<=size;row++){                *(info->SEN_Sap[row] + col) = *(ckt->CKTsenRhs+row);                *(info->SEN_RHS[row] + col) = *(ckt->CKTsenRhs+row);            }        }#ifdef SENSDEBUG        printf("\n");        printf("Sensitivity matrix :\n");        for(row=1;row<=size;row++){            rowe=CKTnodName(ckt,row) ;            if(strcmp("4",rowe)==0){                for (col=1;col<=info->SENparms;col++) {                    printf("\t");                    printf("Sap(%s,%d) = %.5e\t",rowe,col,                            *(info->SEN_Sap[row] + col));                }                printf("\n\n");            }        }        printf("  RHS matrix   :\n");        for(row=1;row<=size;row++){            for (col=1;col<=info->SENparms;col++) {                printf("  ");                printf("RHS(%d,%d) = %.7e ",row,col,                        *(info->SEN_RHS[row] + col));            }            printf("\n");        }        printf("      Jacobian  matrix :\n");        for(row=1; row<=size; row++){            for(col=1; col<=size; col++){                if(elt = SMPfindElt(ckt->CKTmatrix, row , col , 0)){                    printf("%.7e ",elt->SMPvalue);                }                else{                    printf("0.0000000e+00 ");                }            }            printf("\n");        }#endif     }    if(info->SENmode == ACSEN){        /*  loop throgh all the columns of RHS            matrix - each column corresponding to a design            parameter */        for (col=1;col<=info->SENparms;col++) {            for(row=1;row<=size;row++){                *(ckt->CKTsenRhs+row) = *(info->SEN_RHS[row] + col);                *(ckt->CKTseniRhs+row) = *(info->SEN_iRHS[row] + col);            }            /* solve for the sensitivity values ( both real and imag parts)*/            SMPcSolve(ckt->CKTmatrix,ckt->CKTsenRhs,ckt->CKTseniRhs,                    ckt->CKTrhsSpare,ckt->CKTirhsSpare);            /* store the sensitivity values ( both real and imag parts)*/            for(row=1;row<=size;row++){                *(info->SEN_RHS[row] + col) = *(ckt->CKTsenRhs+row);                *(info->SEN_iRHS[row] + col) = *(ckt->CKTseniRhs+row);            }           }#ifdef SENSDEBUG        printf("\n");        printf("CKTomega = %.7e rad/sec\t\n",ckt->CKTomega);        printf("Sensitivity matrix :\n");        for(row=1;row<=size;row++){            rowe=CKTnodName(ckt,row);            for (col=1;col<=info->SENparms;col++) {                printf("\t");                printf("RHS(%s,%d) = %.5e",rowe,col,                        *(info->SEN_RHS[row] + col));                printf(" + j %.5e\t",*(info->SEN_iRHS[row] + col));                printf("\n\n");            }            printf("\n");        }        printf("CKTomega = %.7e rad/sec\t\n",ckt->CKTomega);        printf("  RHS matrix   :\n");        for(row=1;row<=size;row++){            for (col=1;col<=info->SENparms;col++) {                printf("  ");                printf("RHS(%d,%d) = %.7e ",row,col,                        *(info->SEN_RHS[row] + col));                printf("+j %.7e ",*(info->SEN_iRHS[row] + col));            }            printf("\n");        }        printf("      Jacobian  matrix for AC :\n");        for(row=1; row<=size; row++){            for(col=1; col<=size; col++){                if(elt = SMPfindElt(ckt->CKTmatrix, row , col , 0)){                    printf("%.7e ",elt->SMPvalue);                    printf("+j%.7e\t",elt->SMPiValue);                }                else{                    printf("0.0000000e+00 ");                    printf("+j0.0000000e+00\t");                }            }            printf("\n\n");        }#endif    }    return(OK);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -