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

📄 matrix_indirect.c

📁 有限元分析源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
          case INTEGER_ARRAY:               MatrixFreeIndirectInteger( spA->uMatrix.iaa, spA->iNoRows);               break;          case COMPLEX_ARRAY:               FatalError("In MatrixFreeIndirect() : spA->eType not implemented",                         (char *) NULL);               break;          default:               break;      }   /* (b) Free cpMatrixName and parent data structure for matrix */      if( CheckUnits() == ON ) {         for( i=1; i<=spA->iNoRows; i++ )             free ((char *) spA->spRowUnits[i-1].units_name );         for( i=1; i<=spA->iNoColumns; i++ )             free ((char *) spA->spColUnits[i-1].units_name );         free ((char *) spA->spRowUnits);         free ((char *) spA->spColUnits);      }      free ((char *) spA->cpMatrixName);      free ((char *) spA);      spA = (MATRIX *)NULL;}/* *  ======================================================================= *  MatrixFreeIndirectDouble() : Free memory for INDIRECT storage of data *                               type DOUBLE. *   *  Input  :  double **d  -- Pointer to matrix of data type double. *         :  int iNoRows -- No of Rows in Matrix. *  Output :  void *  ======================================================================= */#ifdef __STDC__void MatrixFreeIndirectDouble( double **d, int iNoRows)#else  /* Start case not STDC */void MatrixFreeIndirectDouble( d, iNoRows)double     **d;int    iNoRows;#endif /* End case not STDC */{int ii;   if( d == (double **)NULL )  return;   for(ii = 1; ii <= iNoRows; ii++)       free ((char *) d[ii-1]);   free ((char *) d);}/* *  ======================================================================= *  MatrixFreeIndirectInteger() : Free memory for INDIRECT storage of data *                                type INTEGER. *   *  Input  :  int     **i  -- Pointer to matrix of data type double. *         :  int iNoRows  -- No of Rows in Matrix. *  Output :  void *  ======================================================================= */#ifdef __STDC__void MatrixFreeIndirectInteger( int **i, int iNoRows)#else  /* Start case not STDC */void MatrixFreeIndirectInteger( i, iNoRows)int        **i;int    iNoRows;#endif /* End case not STDC */{int ii;   if( i == (int **)NULL )  return;   for(ii = 1; ii <= iNoRows; ii++)       free ((char *) i[ii-1]);   free ((char *) i);}/* *  ========================================================= *  MatrixCompareSize() : Compare sizes of matrices [A] and [B]. *                      : If(Size [A] == Size[B]) *                           return TRUE. *                        else *                           return FALSE. *  ========================================================= */#ifdef __STDC__MatrixCompareSize( MATRIX *spA, MATRIX *spB )#else  /* Start case not STDC */MatrixCompareSize( spA, spB )MATRIX *spA;MATRIX *spB;#endif /* End case not STDC */{    if((spA->iNoRows    != spB->iNoRows) ||       (spA->iNoColumns != spB->iNoColumns)) {        (void) printf("Problem : spA->iNoRows = %4d spA->iNoColumns = %4d\n",                                 spA->iNoRows, spB->iNoColumns);        (void) printf("Problem : spB->iNoRows = %4d spB->iNoColumns = %4d\n",                                 spB->iNoRows, spB->iNoColumns);        return (FALSE);    }    else        return (TRUE);}/* *  ========================================================= *  MatrixCompareInsideDimensions() : Compare inside *  dimensions of matrices [A] and [B]. * *  If(Size [A] == Size[B]) return TRUE. *  else                    return FALSE. *  ========================================================= */#ifdef __STDC__MatrixCompareInsideDimensions( MATRIX *spA, MATRIX *spB )#else  /* Start case not STDC */MatrixCompareInsideDimensions( spA, spB )MATRIX *spA;MATRIX *spB;#endif /* End case not STDC */{    if(spA->iNoColumns != spB->iNoRows) {        (void) printf("Problem : spA->iNoRows = %4d spA->iNoColumns = %4d\n",                                 spA->iNoRows, spB->iNoColumns);        (void) printf("Problem : spB->iNoRows = %4d spB->iNoColumns = %4d\n",                                 spB->iNoRows, spB->iNoColumns);        return (FALSE);    }    else        return (TRUE);}/* *  ======================================================================= *  MatrixAddIndirectDouble() : Add Matrices [C] = [A] + [B]. *   *  Input  :  MATRIX     *spA  -- Pointer to (nxn) matrix A. *         :  MATRIX     *spB  -- Pointer to (nxn) matrix B. *  Output :  MATRIX     *spC  -- Pointer to (nxn) matrix C. *  ======================================================================= */#ifdef __STDC__MATRIX *MatrixAddIndirectDouble( MATRIX *spA, MATRIX *spB )#else  /* Start case not STDC */MATRIX *MatrixAddIndirectDouble( spA, spB )MATRIX *spA;MATRIX *spB;#endif /* End case not STDC */{MATRIX *spC;int  ii, ij;int  length, length1, length2;DIMENSIONS *d1, *d2;int UNITS_SWITCH;     UNITS_SWITCH = CheckUnits();    /* [a] : Compare Dimensions of Matrices */       if(MatrixCompareSize( spA, spB ) != TRUE)          FatalError("Execution halted in MatrixAddIndirectDouble()",                     "Inconsistent Dimensions",                     (char *) NULL);       spC = MatrixAllocIndirect((char *) NULL, DOUBLE_ARRAY, spA->iNoRows, spB->iNoColumns);       switch( UNITS_SWITCH) {         case ON:            for(ii = 1; ii <= spA->iNoRows; ii++)                UnitsCopy( &(spC->spRowUnits[ii-1]), &(spA->spRowUnits[ii-1]) );            for(ij = 1; ij <= spA->iNoColumns; ij++)                UnitsCopy( &(spC->spColUnits[ij-1]), &(spA->spColUnits[ij-1]) );         /* [b] : Check Units and Add Matrices : [C] = [A] + [B] */            for(ii = 1; ii <= spA->iNoRows; ii++) {                for(ij = 1; ij <= spA->iNoColumns; ij++) {                    d1 = UnitsMult( &(spA->spRowUnits[ii-1]), &(spA->spColUnits[ij-1]) );                    d2 = UnitsMult( &(spB->spRowUnits[ii-1]), &(spB->spColUnits[ij-1]) );                    if(SameUnits(d1, d2) == TRUE)                         spC->uMatrix.daa[ii-1][ij-1]                         = spA->uMatrix.daa[ii-1][ij-1] + spB->uMatrix.daa[ii-1][ij-1];                    else {                       printf("For row No %d, column No %d \n", ii, ij);                       FatalError("In MatrixAddIndirectDouble(): Inconsistent Units",                       (char *)NULL);                    }                    free((char *) d1->units_name);                    free((char *) d1);                    free((char *) d2->units_name);                    free((char *) d2);                }            }            break;         case OFF:            for(ii = 1; ii <= spA->iNoRows; ii++) {                for(ij = 1; ij <= spA->iNoColumns; ij++) {                    spC->uMatrix.daa[ii-1][ij-1]                    = spA->uMatrix.daa[ii-1][ij-1] + spB->uMatrix.daa[ii-1][ij-1];                }            }            break;         default:            break;       }       return ( spC );}/* *  ======================================================================= *  MatrixAddReplaceIndirectDouble() : Matrix Replacement [A] = [A] + [B]. *   *  Input  :  MATRIX     *spA  -- Pointer to (nxn) matrix A. *         :  MATRIX     *spB  -- Pointer to (nxn) matrix B. *  Output :  MATRIX     *spC  -- Pointer to (nxn) matrix A. *  ======================================================================= */#ifdef __STDC__MATRIX *MatrixAddReplaceIndirectDouble( MATRIX *spA, MATRIX *spB )#else  /* Start case not STDC */MATRIX *MatrixAddReplaceIndirectDouble( spA, spB )MATRIX *spA;MATRIX *spB;#endif /* End case not STDC */{int  ii, ij;int  length1, length2;DIMENSIONS *d1, *d2;int UNITS_SWITCH;     UNITS_SWITCH = CheckUnits();    /* [a] : Compare Dimensions of Matrices */       if(MatrixCompareSize( spA, spB ) != TRUE)          FatalError("Execution halted in MatrixAddIndirectDouble()",                     "Inconsistent Dimensions",                     (char *) NULL);    /* [b] : Check Units and Add Matrices : [A] = [A] + [B] */       switch( UNITS_SWITCH) {          case ON:            for(ii = 1; ii <= spA->iNoRows; ii++) {                for(ij = 1; ij <= spA->iNoColumns; ij++) {                    d1 = UnitsMult( &(spA->spRowUnits[ii-1]),&(spA->spColUnits[ij-1]));                    d2 = UnitsMult( &(spB->spRowUnits[ii-1]),&(spB->spColUnits[ij-1]));                    if(SameUnits(d1, d2) == TRUE)                       spA->uMatrix.daa[ii-1][ij-1] += spB->uMatrix.daa[ii-1][ij-1];                    else {                     printf("For row No %d, column No %d \n", ii, ij);                     FatalError("In MatrixAddIndirectDouble(): Inconsistent Units",(char *)NULL);                    }                    free((char *) d1->units_name);                    free((char *) d1);                    free((char *) d2->units_name);                    free((char *) d2);                }            }            break;         case OFF:            for(ii = 1; ii <= spA->iNoRows; ii++) {                for(ij = 1; ij <= spA->iNoColumns; ij++) {                      spA->uMatrix.daa[ii-1][ij-1] += spB->uMatrix.daa[ii-1][ij-1];                }            }            break;         default:            break;       }       free((char *) spA->cpMatrixName);       spA->cpMatrixName = (char *)NULL;       return (spA);}/* *  ======================================================================= *  MatrixSubIndirectDouble() : Add Matrices [C] = [A] - [B]. *   *  Input  :  MATRIX     *spA  -- Pointer to (nxn) matrix A. *         :  MATRIX     *spB  -- Pointer to (nxn) matrix B. *  Output :  MATRIX     *spC  -- Pointer to (nxn) matrix C. *  ======================================================================= */#ifdef __STDC__MATRIX *MatrixSubIndirectDouble( MATRIX *spA, MATRIX *spB )#else  /* Start case not STDC */MATRIX *MatrixSubIndirectDouble( spA, spB )MATRIX *spA;MATRIX *spB;#endif /* End case not STDC */{MATRIX *spC;int  ii, ij;int  length, length1, length2;DIMENSIONS *d1, *d2;int UNITS_SWITCH;     UNITS_SWITCH = CheckUnits();    /* [a] : Compare Dimensions of Matrices */       if(MatrixCompareSize( spA, spB ) != TRUE)          FatalError("Execution halted in MatrixAddIndirectDouble()",                     "Inconsistent Dimensions",                     (char *) NULL);       spC = MatrixAllocIndirect((char *) NULL, DOUBLE_ARRAY, spA->iNoRows, spB->iNoColumns);       switch( UNITS_SWITCH) {          case ON:            for(ii = 1; ii <= spA->iNoRows; ii++)                UnitsCopy( &(spC->spRowUnits[ii-1]), &(spA->spRowUnits[ii-1]) );            for(ij = 1; ij <= spA->iNoColumns; ij++)                UnitsCopy( &(spC->spColUnits[ij-1]), &(spA->spColUnits[ij-1]) );         /* [b] : Check Units and Sub Matrices : [C] = [A] - [B] */            for(ii = 1; ii <= spA->iNoRows; ii++) {                for(ij = 1; ij <= spA->iNoColumns; ij++) {                    d1 = UnitsMult(&(spA->spRowUnits[ii-1]),&(spA->spColUnits[ij-1]));                    d2 = UnitsMult(&(spB->spRowUnits[ii-1]),&(spB->spColUnits[ij-1]));                    if(SameUnits(d1, d2) == TRUE)                       spC->uMatrix.daa[ii-1][ij-1]                       = spA->uMatrix.daa[ii-1][ij-1] - spB->uMatrix.daa[ii-1][ij-1];                    else {                     printf("For row No %d, column No %d \n", ii, ij);                     FatalError("In MatrixAddIndirectDouble(): Inconsistent Units",(char *)NULL);                    }                    free((char *) d1->units_name);                    free((char *) d1);                    free((char *) d2->units_name);                    free((char *) d2);                }            }            break;         case OFF:            for(ii = 1; ii <= spA->iNoRows; ii++) {                for(ij = 1; ij <= spA->iNoColumns; ij++) {                      spC->uMatrix.daa[ii-1][ij-1]                       = spA->uMatrix.daa[ii-1][ij-1] - spB->uMatrix.daa[ii-1][ij-1];                }            }            break;         default:            break;      }       return ( spC );}/* *  ======================================================================= *  MatrixSubReplaceIndirectDouble() : Matrix Replacement [A] = [A] - [B]. *   *  Input  :  MATRIX     *spA  -- Pointer to (nxn) matrix A. *         :  MATRIX     *spB  -- Pointer to (nxn) matrix B. *  Output :  MATRIX     *spC  -- Pointer to (nxn) matrix A. *  ======================================================================= */#ifdef __STDC__MATRIX *MatrixSubReplaceIndirectDouble( MATRIX *spA, MATRIX *spB )#else  /* Start case not STDC */MATRIX *MatrixSubReplaceIndirectDouble( spA, spB )MATRIX *spA;MATRIX *spB;#endif /* End case not STDC */

⌨️ 快捷键说明

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