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

📄 matrix_skyline.c

📁 有限元程序
💻 C
📖 第 1 页 / 共 5 页
字号:
/* *  =============================================================================  *  ALADDIN Version 2.1. *                                                                      *  matrix_skyline.c : Functions for Operations on Skyline Matrices. *                                                                      *  Copyright (C) 1995-2000 by Mark Austin, Xiaoguang Chen, and Wane-Jang Lin *  Institute for Systems Research,                                            *  University of Maryland, College Park, MD 20742                                    *                                                                      *  This software is provided "as is" without express or implied warranty. *  Permission is granted to use this software on any computer system *  and to redistribute it freely, subject to the following restrictions: *  *  1. The authors are not responsible for the consequences of use of *     this software, even if they arise from defects in the software. *  2. The origin of this software must not be misrepresented, either *     by explicit claim or by omission. *  3. Altered versions must be plainly marked as such and must not *     be misrepresented as being the original software. *  4. This software may not be sold or included in commercial software *     products without a license.  *  5. This notice is to remain intact. *                                                                     *  Written by: Mark Austin and Lanheng Jin                              May 1994 *  =============================================================================  */#include <stdio.h>#include <stdlib.h>#include "defs.h"#include "miscellaneous.h"#include "units.h"#include "matrix.h"#include "vector.h"/* #define MYDEBUG *//* *  ======================================================================= *  MatrixAllocSkyline() : Allocate (and free) memory for SKYLINE matrix *                         data structure.  *   *  Input  :  char *cpMatrixName -- Pointer to name of matrix. *         :  DATA_TYPE eType    -- Data type to be stored in Matrix. *         :  int  iNoRows       -- No of Rows in Matrix. *         :  int  iNoColumns    -- No of Columns in Matrix. *         :  int  *ld           -- Length of each column in skyline profile *  Output :  MATRIX *spA        -- Pointer to matrix data structure. *  ======================================================================= */#ifdef __STDC__MATRIX *MatrixAllocSkyline( char *cpMatrixName,  DATA_TYPE eType,                            int  iNoRows,  int  iNoColumns,  int  *ld)#else  /* start case not STDC */MATRIX *MatrixAllocSkyline( cpMatrixName,  eType,  iNoRows, iNoColumns, ld)char     *cpMatrixName;DATA_TYPE        eType;int            iNoRows;int         iNoColumns;int                *ld;#endif /* end case not STDC */{MATRIX *spA;int      ii;   /* [a] : Check input parameters/arrays */      if(ld == (int *)NULL)          FatalError("In MatrixAllocSkyline() : ld[] = NULL",                   (char *) NULL);   /* [b] : Allocate matrix parent data structure, and name */      spA = (MATRIX *) MyMalloc( sizeof(MATRIX) );      if(cpMatrixName != (char *)NULL)         spA->cpMatrixName = SaveString(cpMatrixName);      else          spA->cpMatrixName = (char *) NULL;   /* [c] : Set parameters and allocate memory for matrix array */      spA->eRep       = SKYLINE;      spA->eType      = eType;      spA->iNoRows    = iNoRows;      spA->iNoColumns = iNoColumns;      if( CheckUnits() == ON ) {         spA->spRowUnits = (DIMENSIONS *) MyCalloc( iNoRows, sizeof(DIMENSIONS) );         spA->spColUnits = (DIMENSIONS *) MyCalloc( iNoColumns, sizeof(DIMENSIONS) );      }      else {         spA->spRowUnits = (DIMENSIONS *)NULL;         spA->spColUnits = (DIMENSIONS *)NULL;      }      switch((int) spA->eType) {          case DOUBLE_ARRAY:               spA->uMatrix.daa = (double **)                                  MyCalloc( iNoColumns, sizeof(double*));               for(ii = 0; ii < iNoColumns; ii = ii + 1) {                   spA->uMatrix.daa[ ii ] = (double *)                                            MyCalloc((ld[ii]+1), sizeof(double));                   spA->uMatrix.daa[ ii ][0] = ld[ ii ];               }               break;          default:               FatalError("In MatrixAllocSkyline() : Undefined spA->eType",                         (char *) NULL);               break;      }      return ( spA );}/* *  ======================================================================= *  MatrixFreeSkyline() : Free memory in Skyline Matrix *   *  Input  :  MATRIX *Matrix     -- Pointer to matrix data structure. *  Output :  void *  ======================================================================= */#ifdef __STDC__void MatrixFreeSkyline( MATRIX *spA )#else  /* Start case not STDC */void MatrixFreeSkyline( spA )MATRIX *spA;#endif /* End case not STDC */{int ii;   if( spA == (MATRIX *)NULL )  return;   /* [a] : Free body of skyline matrix[][] */      switch( spA->eType ) {          case DOUBLE_ARRAY:               for(ii = 1; ii <= spA->iNoColumns; ii++)                   free ((char *) (spA->uMatrix.daa[ ii-1 ]));               free ((char *) (spA->uMatrix.daa));               break;          default:               FatalError("In MatrixFreeSkyline() : Undefined spA->eType",                         (char *) NULL);               break;      }   /* [b] : Free name and parent data structure for matrix */      if( CheckUnits() == ON ) {         for( ii=1 ; ii<=spA->iNoRows ; ii++ )             free ((char *) spA->spRowUnits[ii-1].units_name );         for( ii=1 ; ii<=spA->iNoColumns ; ii++ )             free ((char *) spA->spColUnits[ii-1].units_name );         free ((char *) spA->spRowUnits);         free ((char *) spA->spColUnits);      }      free ((char *) spA->cpMatrixName);      free ((char *) spA);      spA = (MATRIX *)NULL;}/* *  ======================================================================= *  Print a Matrix [iNoRows][iNoColumns] of data type DOUBLE  *  Dump Profile of Skyline Matrix. *   *  Where --  spA->iNoRows         = Number of rows in matrix. *            spA->iNoColumns      = Number of columns in matrix. *            COLUMNS_ACROSS_PAGE  = Number of columns printed across page. *  *            ib                   = Current No of Matrix Block. *            iFirstColumn         = Number of first column in block *            iLastColumn          = Number of last  column in block *  *  Input  :  MATRIX *spA        -- Pointer to matrix data structure. *  Output :  void *  ======================================================================= */enum { COLUMNS_ACROSS_PAGE = 6 };                                        /* Item [a] */#ifdef __STDC__                                                  void MatrixPrintSkylineDouble( MATRIX *spA )#else  /* Start case not STDC */void MatrixPrintSkylineDouble( spA )MATRIX  *spA;#endif /* End case not STDC */{int ii, ij, ik, im, ib;    int iNoBlocks; int iFirstColumn, iLastColumn; double  da;int UNITS_SWITCH;     UNITS_SWITCH = CheckUnits();    /* [a] : Compute no of blocks of rows to be printed */               /* Item [c] */    if( spA->iNoColumns % ((int) COLUMNS_ACROSS_PAGE) == 0 )                                  iNoBlocks = (spA->iNoColumns/((int) COLUMNS_ACROSS_PAGE));    else        iNoBlocks = (spA->iNoColumns/((int) COLUMNS_ACROSS_PAGE)) + 1;    /* [b] : Loop over blocks of rows */    for( ib = 1; ib <= iNoBlocks; ib++ ) {                               /* Item [d] */         iFirstColumn = (ib-1)*((int) COLUMNS_ACROSS_PAGE) + 1;         iLastColumn  = (int) MIN( ib*((int) COLUMNS_ACROSS_PAGE) ,                             spA->iNoColumns );         /* [c] : Print title of matrix at top of each block */          /* Item [e] */                if( spA->cpMatrixName != NULL )              printf("\nSKYLINE MATRIX : \"%s\"\n\n", spA->cpMatrixName);         else              printf("\nSKYLINE MATRIX : \"UNTITLED\"\n\n");         /* [d] : Label row and column nos */         printf ("row/col        ");         for( ii = iFirstColumn; ii <= iLastColumn; ii++ )             printf("        %3d   ", ii);         printf("\n");         switch( UNITS_SWITCH ) {           case ON:              printf ("        units  " );              for( ii = iFirstColumn; ii <= iLastColumn; ii++ )                 if(spA->spColUnits[ii-1].units_name != NULL) {                    printf(" %10s   ",spA->spColUnits[ii-1].units_name);                 }                 else                    printf("             ");              printf("\n");             /* [e] : Print Contents of Matrix */   /* Item [f] */              for( ii = 1; ii <= spA->iNoRows; ii++ ) {                   printf(" %3d ", ii);                   if(spA->spRowUnits[ii-1].units_name != NULL) {                      printf("%8s ",spA->spRowUnits[ii-1].units_name);                   }                   else                      printf("         ");                   for( ij  = iFirstColumn; ij <= iLastColumn; ij++) {                       da = MatrixContentScaleSkyline(spA, ii, ij);                       printf(" %12.5e ", da );                   }                   printf("\n");              }              break;           case OFF:              /* [e] : Print Contents of Matrix */                            /* Item [f] */              for( ii = 1; ii <= spA->iNoRows; ii++ ) {                   printf("%3d ", ii);                   printf("         ");                   for( ij  = iFirstColumn; ij <= iLastColumn; ij++) {                        ik = (int) MIN( ii, ij );                        im = (int) MAX( ii, ij );                        if((im-ik+1) <= spA->uMatrix.daa[im-1][0])                             printf(" %12.5e ", spA->uMatrix.daa[ im-1 ][ im-ik+1 ]);                        else                             printf(" %12.5e ", 0.0);                   }                   printf("\n");              }              break;           default:              break;         }    }}/* *  ================================================================ *  Matrix Operations : Addition, Subtraction, Multiplication, Copy. *  ================================================================ *//* *  ======================================================================== *  MatrixReallocSkyline() : Reallocate Memory for Skyline Matrix. Eliminate *                           matrix elements that are smaller than MINREAL *  *  Input  :  MATRIX *spA  -- Pointer to matrix data structure. *  Output :  MATRIX *spB  -- Pointer to new skyline matrix. *  ======================================================================== */#ifdef __STDC__MATRIX *MatrixReallocSkyline ( MATRIX *spA )#else  /* Start case not STDC */MATRIX *MatrixReallocSkyline ( spA )MATRIX *spA;#endif /* End case not STDC */{MATRIX     *spB;int ii, ij, *ld;int      length;    if( spA == NULL )        FatalError("In MatrixReallocSkyline() : spA = NULL",                  (char *) NULL);    ld = iVectorAlloc( spA->iNoColumns );     for(ii=0; ii < spA->iNoColumns; ii = ii + 1) {        for (ij = spA->uMatrix.daa[ii][0]; (ij > 1) &&             (ABS(spA->uMatrix.daa[ii][ij]) < MINREAL); ij = ij - 1);        ld[ii] = ij;    }    spB = MatrixAllocSkyline( spA->cpMatrixName, DOUBLE_ARRAY,                              spA->iNoRows, spA->iNoColumns, ld);    for(ii = 0; ii < spA->iNoColumns; ii++)        for(ij = 1; ij <= spB->uMatrix.daa[ii][0]; ij++)            spB->uMatrix.daa[ii][ij] = spA->uMatrix.daa[ii][ij];    if( CheckUnits() == ON ) {       for(ii = 1; ii <= spA->iNoRows; ii++)           UnitsCopy( &(spB->spRowUnits[ii-1]),  &(spA->spRowUnits[ii-1]) );       for(ij = 1; ij <= spA->iNoColumns; ij++)           UnitsCopy( &(spB->spColUnits[ij-1]),  &(spA->spColUnits[ij-1]) );    }    MatrixFreeSkyline(spA);    free((char *) ld);    return (spB); }/* *  ======================================================================= *  MatrixAddSkyline() : Add Skyline Matrices *  *  Input  :  MATRIX *spA        -- Pointer to matrix data structure. *         :  MATRIX *spB        -- Pointer to matrix data structure. *  Output :  MATRIX *spC        -- Pointer to matrix sum *  ======================================================================= */#ifdef __STDC__MATRIX *MatrixAddSkyline( MATRIX *spA , MATRIX *spB )#else  /* Start case not STDC */MATRIX *MatrixAddSkyline( spA, spB )MATRIX *spA, *spB;#endif /* End case not STDC */{MATRIX *spC;int *ld, min_ldi;int  ii, ij;int  length, length1, length2;DIMENSIONS *d1, *d2;int UNITS_SWITCH;

⌨️ 快捷键说明

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