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

📄 spoutput.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
📖 第 1 页 / 共 2 页
字号:
 *  The calling function can query errno (the system global error variable) *  as to the reason why this routine failed. * *  >>> Arguments: *  Matrix  <input>  (char *) *      Pointer to matrix. *  File  <input>  (char *) *      Name of file into which matrix is to be written. *  Label  <input>  (char *) *      String that is transferred to file and is used as a label. *  Reordered  <input> (BOOLEAN) *      Specifies whether matrix should be output in reordered form, *      or in original order. *  Data  <input> (BOOLEAN) *      Indicates that the element values should be output along with *      the indices for each element.  This parameter must be true if *      matrix is to be read by the sparse test program. *  Header  <input> (BOOLEAN) *      Indicates that header is desired.  This parameter must be true if *      matrix is to be read by the sparse test program. * *  >>> Local variables: *  Col  (int) *      The original column number of the element being output. *  pElement  (ElementPtr) *      Pointer to an element in the matrix. *  pMatrixFile  (FILE *) *      File pointer to the matrix file. *  Row  (int) *      The original row number of the element being output. *  Size  (int) *      The size of the matrix. */intspFileMatrix( eMatrix, File, Label, Reordered, Data, Header )char *eMatrix, *Label, *File;int Reordered, Data, Header;{MatrixPtr  Matrix = (MatrixPtr)eMatrix;register  int  I, Size;register  ElementPtr  pElement;int  Row, Col, Err;FILE  *pMatrixFile, *fopen();/* Begin `spFileMatrix'. */    ASSERT( IS_SPARSE( Matrix ) );/* Open file matrix file in write mode. */    if ((pMatrixFile = fopen(File, "w")) == NULL)        return 0;/* Output header. */    Size = Matrix->Size;    if (Header)    {   if (Matrix->Factored AND Data)        {   Err = fprintf            (   pMatrixFile,                "Warning : The following matrix is factored in to LU form.\n"            );	    if (Err < 0) return 0;        }        if (fprintf(pMatrixFile, "%s\n", Label) < 0) return 0;        Err = fprintf( pMatrixFile, "%d\t%s\n", Size,                                    (Matrix->Complex ? "complex" : "real"));        if (Err < 0) return 0;    }/* Output matrix. */    if (NOT Data)    {   for (I = 1; I <= Size; I++)        {   pElement = Matrix->FirstInCol[I];            while (pElement != NULL)            {   if (Reordered)                {   Row = pElement->Row;                    Col = I;                }                else                {   Row = Matrix->IntToExtRowMap[pElement->Row];                    Col = Matrix->IntToExtColMap[I];                }                pElement = pElement->NextInCol;                if (fprintf(pMatrixFile, "%d\t%d\n", Row, Col) < 0) return 0;            }        }/* Output terminator, a line of zeros. */        if (Header)            if (fprintf(pMatrixFile, "0\t0\n") < 0) return 0;    }#if spCOMPLEX    if (Data AND Matrix->Complex)    {   for (I = 1; I <= Size; I++)        {   pElement = Matrix->FirstInCol[I];            while (pElement != NULL)            {   if (Reordered)                {   Row = pElement->Row;                    Col = I;                }                else                {   Row = Matrix->IntToExtRowMap[pElement->Row];                    Col = Matrix->IntToExtColMap[I];                }                Err = fprintf                (   pMatrixFile,"%d\t%d\t%-.15g\t%-.15g\n",                    Row, Col, (double)pElement->Real, (double)pElement->Imag                );                if (Err < 0) return 0;                pElement = pElement->NextInCol;            }        }/* Output terminator, a line of zeros. */        if (Header)            if (fprintf(pMatrixFile,"0\t0\t0.0\t0.0\n") < 0) return 0;    }#endif /* spCOMPLEX */#if REAL    if (Data AND NOT Matrix->Complex)    {   for (I = 1; I <= Size; I++)        {   pElement = Matrix->FirstInCol[I];            while (pElement != NULL)            {   Row = Matrix->IntToExtRowMap[pElement->Row];                Col = Matrix->IntToExtColMap[I];                Err = fprintf                (   pMatrixFile,"%d\t%d\t%-.15g\n",                    Row, Col, (double)pElement->Real                );                if (Err < 0) return 0;                pElement = pElement->NextInCol;            }        }/* Output terminator, a line of zeros. */        if (Header)            if (fprintf(pMatrixFile,"0\t0\t0.0\n") < 0) return 0;    }#endif /* REAL *//* Close file. */    if (fclose(pMatrixFile) < 0) return 0;    return 1;}/* *  OUTPUT SOURCE VECTOR TO FILE * *  Writes vector to file in format suitable to be read back in by the *  matrix test program.  This routine should be executed after the function *  spFileMatrix. * *  >>> Returns: *  One is returned if routine was successful, otherwise zero is returned. *  The calling function can query errno (the system global error variable) *  as to the reason why this routine failed. * *  >>> Arguments: *  Matrix  <input>  (char *) *      Pointer to matrix. *  File  <input>  (char *) *      Name of file into which matrix is to be written. *  RHS  <input>  (RealNumber []) *      Right-hand side vector. This is only the real portion if *      spSEPARATED_COMPLEX_VECTORS is true. *  iRHS  <input>  (RealNumber []) *      Right-hand side vector, imaginary portion.  Not necessary if matrix *      is real or if spSEPARATED_COMPLEX_VECTORS is set false. * *  >>> Local variables: *  pMatrixFile  (FILE *) *      File pointer to the matrix file. *  Size  (int) *      The size of the matrix. * *  >>> Obscure Macros *  IMAG_RHS *      Replaces itself with `, iRHS' if the options spCOMPLEX and *      spSEPARATED_COMPLEX_VECTORS are set, otherwise it disappears *      without a trace. */intspFileVector( eMatrix, File, RHS IMAG_RHS )char *eMatrix, *File;RealVector  RHS IMAG_RHS;{MatrixPtr  Matrix = (MatrixPtr)eMatrix;register  int  I, Size, Err;FILE  *pMatrixFile;FILE  *fopen();/* Begin `spFileVector'. */    ASSERT( IS_SPARSE( Matrix ) AND RHS != NULL)/* Open File in append mode. */    if ((pMatrixFile = fopen(File,"a")) == NULL)        return 0;/* Correct array pointers for ARRAY_OFFSET. */#if NOT ARRAY_OFFSET#if spCOMPLEX    if (Matrix->Complex)    {#if spSEPARATED_COMPLEX_VECTORS        ASSERT(iRHS != NULL)        --RHS;        --iRHS;#else        RHS -= 2;#endif    }    else#endif /* spCOMPLEX */        --RHS;#endif /* NOT ARRAY_OFFSET *//* Output vector. */    Size = Matrix->Size;#if spCOMPLEX    if (Matrix->Complex)    {#if spSEPARATED_COMPLEX_VECTORS        for (I = 1; I <= Size; I++)        {   Err = fprintf            (   pMatrixFile, "%-.15g\t%-.15g\n",                (double)RHS[I], (double)iRHS[I]            );            if (Err < 0) return 0;        }#else        for (I = 1; I <= Size; I++)        {   Err = fprintf            (   pMatrixFile, "%-.15g\t%-.15g\n",                (double)RHS[2*I], (double)RHS[2*I+1]            );            if (Err < 0) return 0;        }#endif    }#endif /* spCOMPLEX */#if REAL AND spCOMPLEX    else#endif#if REAL    {   for (I = 1; I <= Size; I++)        {   if (fprintf(pMatrixFile, "%-.15g\n", (double)RHS[I]) < 0)                return 0;        }    }#endif /* REAL *//* Close file. */    if (fclose(pMatrixFile) < 0) return 0;    return 1;}/* *  OUTPUT STATISTICS TO FILE * *  Writes useful information concerning the matrix to a file.  Should be *  executed after the matrix is factored. *  *  >>> Returns: *  One is returned if routine was successful, otherwise zero is returned. *  The calling function can query errno (the system global error variable) *  as to the reason why this routine failed. * *  >>> Arguments: *  Matrix  <input>  (char *) *      Pointer to matrix. *  File  <input>  (char *) *      Name of file into which matrix is to be written. *  Label  <input>  (char *) *      String that is transferred to file and is used as a label. * *  >>> Local variables: *  Data  (RealNumber) *      The value of the matrix element being output. *  LargestElement  (RealNumber) *      The largest element in the matrix. *  NumberOfElements  (int) *      Number of nonzero elements in the matrix. *  pElement  (ElementPtr) *      Pointer to an element in the matrix. *  pStatsFile  (FILE *) *      File pointer to the statistics file. *  Size  (int) *      The size of the matrix. *  SmallestElement  (RealNumber) *      The smallest element in the matrix excluding zero elements. */intspFileStats( eMatrix, File, Label )char *eMatrix, *File, *Label;{MatrixPtr  Matrix = (MatrixPtr)eMatrix;register  int  Size, I;register  ElementPtr  pElement;int NumberOfElements;RealNumber  Data, LargestElement, SmallestElement;FILE  *pStatsFile, *fopen();/* Begin `spFileStats'. */    ASSERT( IS_SPARSE( Matrix ) );/* Open File in append mode. */    if ((pStatsFile = fopen(File, "a")) == NULL)        return 0;/* Output statistics. */    Size = Matrix->Size;    if (NOT Matrix->Factored)        fprintf(pStatsFile, "Matrix has not been factored.\n");    fprintf(pStatsFile, "|||  Starting new matrix  |||\n");    fprintf(pStatsFile, "%s\n", Label);    if (Matrix->Complex)        fprintf(pStatsFile, "Matrix is complex.\n");    else        fprintf(pStatsFile, "Matrix is real.\n");    fprintf(pStatsFile,"     Size = %d\n",Size);/* Search matrix. */    NumberOfElements = 0;    LargestElement = 0.0;    SmallestElement = LARGEST_REAL;    for (I = 1; I <= Size; I++)    {   pElement = Matrix->FirstInCol[I];        while (pElement != NULL)        {   NumberOfElements++;            Data = ELEMENT_MAG(pElement);            if (Data > LargestElement)                LargestElement = Data;            if (Data < SmallestElement AND Data != 0.0)                SmallestElement = Data;            pElement = pElement->NextInCol;        }    }    SmallestElement = MIN( SmallestElement, LargestElement );/* Output remaining statistics. */    fprintf(pStatsFile, "     Initial number of elements = %d\n",            NumberOfElements - Matrix->Fillins);    fprintf(pStatsFile,            "     Initial average number of elements per row = %f\n",            (double)(NumberOfElements - Matrix->Fillins) / (double)Size);    fprintf(pStatsFile, "     Fill-ins = %d\n",Matrix->Fillins);    fprintf(pStatsFile, "     Average number of fill-ins per row = %f%%\n",            (double)Matrix->Fillins / (double)Size);    fprintf(pStatsFile, "     Total number of elements = %d\n",            NumberOfElements);    fprintf(pStatsFile, "     Average number of elements per row = %f\n",            (double)NumberOfElements / (double)Size);    fprintf(pStatsFile,"     Density = %f%%\n",            (double)(100.0*NumberOfElements)/(double)(Size*Size));    fprintf(pStatsFile,"     Relative Threshold = %e\n", Matrix->RelThreshold);    fprintf(pStatsFile,"     Absolute Threshold = %e\n", Matrix->AbsThreshold);    fprintf(pStatsFile,"     Largest Element = %e\n", LargestElement);    fprintf(pStatsFile,"     Smallest Element = %e\n\n\n", SmallestElement);/* Close file. */    (void)fclose(pStatsFile);    return 1;}#endif /* DOCUMENTATION */

⌨️ 快捷键说明

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