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

📄 spmatrix.h

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 H
字号:
/* *  EXPORTS for sparse matrix routines with SPICE3. * *  Author:                     Advising professor: *      Kenneth S. Kundert          Alberto Sangiovanni-Vincentelli *      UC Berkeley * *  This file contains definitions that are useful to the calling *  program.  In particular, this file contains error keyword *  definitions, some macro functions that are used to quickly enter *  data into the matrix and the type definition of a data structure *  that acts as a template for entering admittances into the matrix. *  Also included is the type definitions for the various functions *  available to the user. * *  This file is a modified version of spMatrix.h that is used when *  interfacing to Spice3. *//* *  Revision and copyright information. * *  Copyright (c) 1985,86,87,88,89,90 *  by Kenneth S. Kundert and the University of California. * *  Permission to use, copy, modify, and distribute this software and *  its documentation for any purpose and without fee is hereby granted, *  provided that the copyright notices appear in all copies and *  supporting documentation and that the authors and the University of *  California are properly credited.  The authors and the University of *  California make no representations as to the suitability of this *  software for any purpose.  It is provided `as is', without express *  or implied warranty. * *  $Date: 88/06/24 05:03:01 $ *  $Revision: 1.1 $ */#ifndef  spOKAY/* *  IMPORTS * *  >>> Import descriptions: *  spConfig.h *      Macros that customize the sparse matrix routines. */#include "spconfig.h"/* *  ERROR KEYWORDS * *  The actual numbers used in the error codes are not sacred, they can be *  changed under the condition that the codes for the nonfatal errors are *  less than the code for spFATAL and similarly the codes for the fatal *  errors are greater than that for spFATAL. * *  >>> Error descriptions: *  spOKAY *      No error has occurred. *  spSMALL_PIVOT *      When reordering the matrix, no element was found which satisfies the *      threshold criteria.  The largest element in the matrix was chosen *      as pivot.  Non-fatal. *  spZERO_DIAG *      Fatal error.  A zero was encountered on the diagonal the matrix.  This *      does not necessarily imply that the matrix is singular.  When this *      error occurs, the matrix should be reconstructed and factored using *      spOrderAndFactor().  In spCOMPATIBILITY mode, spZERO_DIAG is *      indistinguishable from spSINGULAR. *  spSINGULAR *      Fatal error.  Matrix is singular, so no unique solution exists. *  spNO_MEMORY *      Fatal error.  Indicates that not enough memory is available to handle *      the matrix. *  spPANIC *      Fatal error indicating that the routines are not prepared to *      handle the matrix that has been requested.  This may occur when *      the matrix is specified to be real and the routines are not *      compiled for real matrices, or when the matrix is specified to *      be complex and the routines are not compiled to handle complex *      matrices. *  spFATAL *      Not an error flag, but rather the dividing line between fatal errors *      and warnings. */#include "sperror.h"  /* Spice error definitions. *//* Begin error macros. */#define  spOKAY                 OK#define  spSMALL_PIVOT          OK#define  spZERO_DIAG            E_SINGULAR#define  spSINGULAR             E_SINGULAR#define  spNO_MEMORY            E_NOMEM#define  spPANIC                E_BADMATRIX#define  spFATAL                E_BADMATRIX#if spCOMPATIBILITY#define  NO_ERROR               spOKAY#define  UNDER_FLOW             spOKAY#define  OVER_FLOW              spOKAY#define  ILL_CONDITIONED        spSMALL_PIVOT#define  SINGULAR               spSINGULAR#define  NO_MEMORY              spNO_MEMORY#define  RANGE                  spPANIC#define  FATAL                  spFATAL#undef   spZERO_DIAG#define  spZERO_DIAG            spSINGULAR#endif /* spCOMPATIBILITY *//* *  KEYWORD DEFINITIONS * *  Here we define what precision arithmetic Sparse will use.  Double *  precision is suggested as being most appropriate for circuit *  simulation and for C.  However, it is possible to change spREAL *  to a float for single precision arithmetic.  Note that in C, single *  precision arithmetic is often slower than double precision.  Sparse *  internally refers to spREALs as RealNumbers. * *  Some C compilers, notably the old VMS compiler, do not handle the keyword *  "void" correctly.  If this is true for your compiler, remove the *  comment delimiters from the redefinition of void to int below. */#define  spREAL double/* #define  void    int   */#if spCOMPATIBILITY#define SPARSE_REAL     spREAL#endif/* *  PARTITION TYPES * *  When factoring a previously ordered matrix using spFactor(), Sparse *  operates on a row-at-a-time basis.  For speed, on each step, the row *  being updated is copied into a full vector and the operations are *  performed on that vector.  This can be done one of two ways, either *  using direct addressing or indirect addressing.  Direct addressing *  is fastest when the matrix is relatively dense and indirect addressing *  is quite sparse.  The user can select which partitioning mode is used. *  The following keywords are passed to spPartition() and indicate that *  Sparse should use only direct addressing, only indirect addressing, or *  that it should choose the best mode on a row-by-row basis.  The time *  required to choose a partition is of the same order of the cost to factor *  the matrix. * *  If you plan to factor a large number of matrices with the same structure, *  it is best to let Sparse choose the partition.  Otherwise, you should *  choose the partition based on the predicted density of the matrix. *//* Begin partition keywords. */#define spDEFAULT_PARTITION     0#define spDIRECT_PARTITION      1#define spINDIRECT_PARTITION    2#define spAUTO_PARTITION        3/* *  MACRO FUNCTION DEFINITIONS * *  >>> Macro descriptions: *  spADD_REAL_ELEMENT *      Macro function that adds data to a real element in the matrix by a *      pointer. *  spADD_IMAG_ELEMENT *      Macro function that adds data to a imaginary element in the matrix by *      a pointer. *  spADD_COMPLEX_ELEMENT *      Macro function that adds data to a complex element in the matrix by a *      pointer. *  spADD_REAL_QUAD *      Macro function that adds data to each of the four real matrix elements *      specified by the given template. *  spADD_IMAG_QUAD *      Macro function that adds data to each of the four imaginary matrix *      elements specified by the given template. *  spADD_COMPLEX_QUAD *      Macro function that adds data to each of the four complex matrix *      elements specified by the given template. *//* Begin Macros. */#define  spADD_REAL_ELEMENT(element,real)       *(element) += real#define  spADD_IMAG_ELEMENT(element,imag)       *(element+1) += imag#define  spADD_COMPLEX_ELEMENT(element,real,imag)       \{   *(element) += real;                                 \    *(element+1) += imag;                               \}#define  spADD_REAL_QUAD(template,real)         \{   *((template).Element1) += real;             \    *((template).Element2) += real;             \    *((template).Element3Negated) -= real;      \    *((template).Element4Negated) -= real;      \}#define  spADD_IMAG_QUAD(template,imag)         \{   *((template).Element1+1) += imag;           \    *((template).Element2+1) += imag;           \    *((template).Element3Negated+1) -= imag;    \    *((template).Element4Negated+1) -= imag;    \}#define  spADD_COMPLEX_QUAD(template,real,imag) \{   *((template).Element1) += real;             \    *((template).Element2) += real;             \    *((template).Element3Negated) -= real;      \    *((template).Element4Negated) -= real;      \    *((template).Element1+1) += imag;           \    *((template).Element2+1) += imag;           \    *((template).Element3Negated+1) -= imag;    \    *((template).Element4Negated+1) -= imag;    \}#if spCOMPATIBILITY#define  ADD_REAL_ELEMENT_TO_MATRIX             spADD_REAL_ELEMENT#define  ADD_IMAG_ELEMENT_TO_MATRIX             spADD_IMAG_ELEMENT#define  ADD_COMPLEX_ELEMENT_TO_MATRIX          spADD_COMPLEX_ELEMENT#define  ADD_REAL_QUAD_ELEMENT_TO_MATRIX        spADD_REAL_ELEMENT#define  ADD_IMAG_QUAD_ELEMENT_TO_MATRIX        spADD_IMAG_ELEMENT#define  ADD_COMPLEX_QUAD_ELEMENT_TO_MATRIX     spADD_COMPLEX_ELEMENT#endif/* *   TYPE DEFINITION FOR COMPONENT TEMPLATE * *   This data structure is used to hold pointers to four related elements in *   matrix.  It is used in conjunction with the routines *       spGetAdmittance *       spGetQuad *       spGetOnes *   These routines stuff the structure which is later used by the spADD_QUAD *   macro functions above.  It is also possible for the user to collect four *   pointers returned by spGetElement and stuff them into the template. *   The spADD_QUAD routines stuff data into the matrix in locations specified *   by Element1 and Element2 without changing the data.  The data is negated *   before being placed in Element3 and Element4. */#if spCOMPATIBILITY#define spTemplate TemplateStruct#endif/* Begin `spTemplate'. */struct  spTemplate{   spREAL    *Element1       ;    spREAL    *Element2       ;    spREAL    *Element3Negated;    spREAL    *Element4Negated;};/* *   FUNCTION TYPE DEFINITIONS * *   The type of every user accessible function is declared here. *//* Begin function declarations. */#ifdef __STDC__/* For compilers that understand function prototypes. */extern  void     spClear( char* );extern  spREAL   spCondition( char*, spREAL, int* );extern  char    *spCreate( int, int, int* );extern  void     spDeleteRowAndCol( char*, int, int );extern  void     spDestroy( char* );extern  int      spElementCount( char* );extern  int      spError( char* );extern  int      spFactor( char* );extern  int      spFileMatrix( char*, char*, char*, int, int, int );extern  int      spFileStats( char*, char*, char* );extern  int      spFillinCount( char* );extern  int      spGetAdmittance( char*, int, int, struct spTemplate* );extern  spREAL  *spGetElement( char*, int, int );extern  char    *spGetInitInfo( spREAL* );extern  int      spGetOnes( char*, int, int, int, struct spTemplate* );extern  int      spGetQuad( char*, int, int, int, int, struct spTemplate* );extern  int      spGetSize( char*, int );extern  int      spInitialize( char*, int (*)() );extern  void     spInstallInitInfo( spREAL*, char* );extern  spREAL   spLargestElement( char* );extern  void     spMNA_Preorder( char* );extern  spREAL   spNorm( char* );extern  int      spOrderAndFactor( char*, spREAL*, spREAL, spREAL, int );extern  void     spPartition( char*, int );extern  void     spPrint( char*, int, int, int );extern  spREAL   spPseudoCondition( char* );extern  spREAL   spRoundoff( char*, spREAL );extern  void     spScale( char*, spREAL*, spREAL* );extern  void     spSetComplex( char* );extern  void     spSetReal( char* );extern  void     spStripFills( char* );extern  void     spWhereSingular( char*, int*, int* );/* Functions with argument lists that are dependent on options. */#if spCOMPLEXextern  void     spDeterminant ( char*, int*, spREAL*, spREAL* );#else /* NOT spCOMPLEX */extern  void     spDeterminant ( char*, int*, spREAL* );#endif /* NOT spCOMPLEX */#if spCOMPLEX && spSEPARATED_COMPLEX_VECTORSextern  int      spFileVector( char*, char* , spREAL*, spREAL*);extern  void     spMultiply( char*, spREAL*, spREAL*, spREAL*, spREAL* );extern  void     spMultTransposed(char*,spREAL*,spREAL*,spREAL*,spREAL*);extern  void     spSolve( char*, spREAL*, spREAL*, spREAL*, spREAL* );extern  void     spSolveTransposed(char*,spREAL*,spREAL*,spREAL*,spREAL*);#else /* NOT (spCOMPLEX && spSEPARATED_COMPLEX_VECTORS) */extern  int      spFileVector( char*, char* , spREAL* );extern  void     spMultiply( char*, spREAL*, spREAL* );extern  void     spMultTransposed( char*, spREAL*, spREAL* );extern  void     spSolve( char*, spREAL*, spREAL* );extern  void     spSolveTransposed( char*, spREAL*, spREAL* );#endif /* NOT (spCOMPLEX && spSEPARATED_COMPLEX_VECTORS) */#else /* NOT defined(__STDC__) *//* For compilers that do not understand function prototypes. */extern  void     spClear();extern  spREAL   spCondition();extern  char    *spCreate();extern  void     spDeleteRowAndCol();extern  void     spDestroy();extern  void     spDeterminant ();extern  int      spElementCount();extern  int      spError();extern  int      spFactor();extern  int      spFileMatrix();extern  int      spFileStats();extern  int      spFileVector();extern  int      spFillinCount();extern  int      spGetAdmittance();extern  spREAL  *spGetElement();extern  char    *spGetInitInfo();extern  int      spGetOnes();extern  int      spGetQuad();extern  int      spGetSize();extern  int      spInitialize();extern  void     spInstallInitInfo();extern  spREAL   spLargestElement();extern  void     spMNA_Preorder();extern  void     spMultiply();extern  void     spMultTransposed();extern  spREAL   spNorm();extern  int      spOrderAndFactor();extern  void     spPartition();extern  void     spPrint();extern  spREAL   spPseudoCondition();extern  spREAL   spRoundoff();extern  void     spScale();extern  void     spSetComplex();extern  void     spSetReal();extern  void     spSolve();extern  void     spSolveTransposed();extern  void     spStripFills();extern  void     spWhereSingular();#endif /* defined(__STDC__) */#if spCOMPATIBILITYextern  char    *AllocateMatrix();extern  spREAL  *AddElementToMatrix();extern  void     AddRealElementToMatrix();extern  void     AddImagElementToMatrix();extern  void     AddComplexElementToMatrix();extern  void     AddAdmittanceToMatrix();extern  void     AddOnesToMatrix();extern  void     AddQuadToMatrix();extern  void     AddRealQuadElementToMatrix();extern  void     AddImagQuadElementToMatrix();extern  void     AddComplexQuadElementToMatrix();extern  void     CleanMatrix();extern  void     ClearMatrix();extern  int      ClearMatrixError();extern  void     DeallocateMatrix();extern  void     DeleteRowAndColFromMatrix();extern  void     Determinant();extern  int      DecomposeMatrix();extern  int      GetMatrixSize();extern  int      MatrixElementCount();extern  int      MatrixFillinCount();extern  void     MatrixMultiply();extern  spREAL   MatrixRoundoffError();extern  int      MatrixError();extern  int      OrderAndDecomposeMatrix();extern  void     OutputMatrixToFile();extern  void     OutputStatisticsToFile();extern  void     OutputVectorToFile();extern  void     PreorderForModifiedNodal();extern  void     PrintMatrix();extern  void     SetMatrixComplex();extern  void     SetMatrixReal();extern  void     SolveMatrix();extern  void     SolveTransposedMatrix();extern  void     ScaleMatrix();#endif /* spCOMPATIBILITY */#endif  /* spOKAY */

⌨️ 快捷键说明

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