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

📄 dtbcomm.c

📁 用于求解大型稀疏线性方程组Ax=b的数值计算库.
💻 C
📖 第 1 页 / 共 2 页
字号:
              ubindx, ubjndx, ubnnz, lb, b, ldb,              beta, c, ldc, work, lwork);      error = resid(n*m, d, c);      if ( error >= tolerance ){         errcount++;         printf("Error for upper(or lower) general matmult");         printf("n = %d.\n",n);         printf("Residual: %10.6f \n",error);         for (i=0;i!=n*m;i++)           printf("%6.2f  %6.2f\n",d[i], c[i]);      }                                          /* Second, test symmetric matrices */      printf("   Symmetric matrices:\n");      descra[0] = 0;                      /* mat-mult with explicit matrix   */      for (i=0;i!=m;i++)                  /* Initialize c                    */        for (j=0;j!=n;j++)          c[j*m+i] = i+1;/* Call mat-mult with explicit symmtric matrix            */      transa = 0;      dbcomm( transa, mb, n, kb, alpha, descra, a,              bindx, bjndx, bnnz, lb, b, ldb,              beta, c, ldc, work, lwork);      for (i=0;i!=n*m;i++)                /* copy result to d        */        d[i] = c[i];      descra[0] = 1;                      /* symmetry is implicit    */      descra[1] = 1;                      /* lower triangular matrix */      printf("      lower triangular\n");      for (i=0;i!=m;i++)                  /* Initialize c            */        for (j=0;j!=n;j++)          c[j*m+i] = i+1;/* Call symmetric mat-mult with lower triangular matrix     */      transa = 0;      dbcomm( transa, mb, n, kb, alpha, descra, la,              lbindx, lbjndx, lbnnz, lb, b, ldb,              beta, c, ldc, work, lwork);                                          /* compare explicit to implicit */      error = resid(n*m, d, c);      if ( error >= tolerance ){         errcount++;         printf("Error for symmetric matmult (lower triangular)");         printf("n = %d.\n",n);         printf("Residual: %10.6f \n",error);         for (i=0;i!=n*m;i++)           printf("%6.2f  %6.2f\n",d[i], c[i]);      }        descra[1] = 2;                      /* upper triangular matrix */      printf("      upper triangular\n");      for (i=0;i!=m;i++)                  /* Initialize c            */        for (j=0;j!=n;j++)          c[j*m+i] = i+1;/* Call symmetric mat-mult with upper triangular matrix     */      transa = 0;      dbcomm( transa, mb, n, kb, alpha, descra, ua,              ubindx, ubjndx, ubnnz, lb, b, ldb,              beta, c, ldc, work, lwork);                                          /* compare explicit to implicit */      error = resid(n*m, d, c);      if ( error >= tolerance ){         errcount++;         printf("Error for symmetric matmult (upper triangular)");         printf("n = %d.\n",n);         printf("Residual: %10.6f \n",error);         for (i=0;i!=n*m;i++)           printf("%6.2f  %6.2f\n",d[i], c[i]);      }                                           /* Third, test skew-symmetric matrices */      printf("   Skew-Symmetric matrices:\n");      descra[0] = 0;                      /* mat-mult with explicit matrix   */      for (i=0;i!=m;i++)                  /* Initialize c                    */        for (j=0;j!=n;j++)          c[j*m+i] = i+1;/* Call mat-mult with explicit skew-symmetric matrix            */      transa = 0;      dbcomm( transa, mb, n, kb, alpha, descra, ka,              bindx, bjndx, bnnz, lb, b, ldb,              beta, c, ldc, work, lwork);      for (i=0;i!=n*m;i++)                /* copy result to d        */        d[i] = c[i];      descra[0] = 4;                      /* symmetry is implicit    */      descra[1] = 1;                      /* lower triangular matrix */      printf("      lower triangular (no transp)\n");      for (i=0;i!=m;i++)                  /* Initialize c            */        for (j=0;j!=n;j++)          c[j*m+i] = i+1;/* Call skew-symmetric mat-mult with lower triangular matrix     */      transa = 0;      dbcomm( transa, mb, n, kb, alpha, descra, la,              lbindx, lbjndx, lbnnz, lb, b, ldb,              beta, c, ldc, work, lwork);                                          /* compare explicit to implicit */      error = resid(n*m, d, c);      if ( error >= tolerance ){         errcount++;         printf("Error for skew-symmetric matmult (lower triangular)");         printf("n = %d.\n",n);         printf("Residual: %10.6f \n",error);         for (i=0;i!=n*m;i++)           printf("%6.2f  %6.2f\n",d[i], c[i]);      }        descra[1] = 2;                      /* upper triangular matrix */      printf("      upper triangular (transp)\n");      for (i=0;i!=m;i++)                  /* Initialize c            */        for (j=0;j!=n;j++)          c[j*m+i] = i+1;/* Call skew-symmetric mat-mult with upper triangular matrix     */      transa = 1;                         /* Use transpose to get same    */                                          /* matrix as lower triangular   */      dbcomm( transa, mb, n, kb, alpha, descra, ua,              ubindx, ubjndx, ubnnz, lb, b, ldb,              beta, c, ldc, work, lwork);                                          /* compare explicit to implicit */      error = resid(n*m, d, c);      if ( error >= tolerance ){         errcount++;         printf("Error for skew-symmetric matmult (upper triangular)");         printf("n = %d.\n",n);         printf("Residual: %10.6f \n",error);         for (i=0;i!=n*m;i++)           printf("%6.2f  %6.2f\n",d[i], c[i]);      }                                          /* Now, work with transp of lower */                                          /* and upper triangular matrix,   */                                          /* results should be negation of  */                                          /* explicit matrix multiply       */                                          /* check by taking alpha = -alpha */      descra[1] = 1;                      /* lower triangular matrix */      printf("      lower triangular (transp)\n");      for (i=0;i!=m;i++)                  /* Initialize c            */        for (j=0;j!=n;j++)          c[j*m+i] = i+1;/* Call skew-symmetric mat-mult with lower triangular matrix     */      transa = 1;      dbcomm( transa, mb, n, kb, -1.0*alpha, descra, la,              lbindx, lbjndx, lbnnz, lb, b, ldb,              beta, c, ldc, work, lwork);                                          /* compare explicit to implicit */      error = resid(n*m, d, c);      if ( error >= tolerance ){         errcount++;         printf("Error for skew-symmetric matmult (lower triangular)");         printf("n = %d.\n",n);         printf("Residual: %10.6f \n",error);         for (i=0;i!=n*m;i++)           printf("%6.2f  %6.2f\n",d[i], c[i]);      }        descra[1] = 2;                      /* upper triangular matrix */      printf("      upper triangular (no transp)\n");      for (i=0;i!=m;i++)                  /* Initialize c            */        for (j=0;j!=n;j++)          c[j*m+i] = i+1;/* Call skew-symmetric mat-mult with upper triangular matrix     */      transa = 0;                         /* Use transpose to get same    */                                          /* matrix as lower triangular   */      dbcomm( transa, mb, n, kb, -1.0*alpha, descra, ua,              ubindx, ubjndx, ubnnz, lb, b, ldb,              beta, c, ldc, work, lwork);                                          /* compare explicit to implicit */      error = resid(n*m, d, c);      if ( error >= tolerance ){         errcount++;         printf("Error for skew-symmetric matmult (upper triangular)");         printf("n = %d.\n",n);         printf("Residual: %10.6f \n",error);         for (i=0;i!=n*m;i++)           printf("%6.2f  %6.2f\n",d[i], c[i]);      }} /* close loop on n */if ( errcount > 0 )   printf("%d errors in dtbcomm run for alpha = %e, beta = %e\n",errcount,alpha, beta);return errcount;} /* end main */double resid(int m, double *x1, double *x2) {   double norm;   int i;   norm = 0.0;    for (i=0;i<m;i++) norm += abs(x1[i] - x2[i]);   if ( m == 0 ) {     return norm;   } else {     return norm/m;   } }

⌨️ 快捷键说明

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