【问题标题】:Construct sparse matrix with vectors using Petsc library使用 Petsc 库构建带有向量的稀疏矩阵
【发布时间】:2017-12-02 18:42:22
【问题描述】:

我正在学习在 c/c++ 中使用 petsc,以便在其中使用稀疏矩阵分解函数 (MatICCFactor)。我做的第一步是将一个玩具矩阵读入 petsc 以创建一个稀疏矩阵并在我对它做任何事情之前查看该矩阵。我是 c/c++ 编码 BTW 的初学者。 这是我使用的代码:

 static char help[] = "Tests Petscmat functions.\n\n";

    #include<petscmat.h>
    #include <petscsys.h>

    int main(int argc,char **args)
    {
      PetscInitialize(&argc,&args,(char*)0, help);

      Mat            *A;
      PetscInt       m = 3;
      PetscInt       n = 3;
      //to build sparse matrix(CSR)
      /*
       * 1 0 0
       * 2 0 3
       * 4 5 6
       */
      PetscInt Iv[4]={0,1,3,6};     //i vec size nrow+1
      PetscInt Jv[6]={0,0,2,0,1,2}; //j vec size nnz
      PetscScalar vv[6]={1,2,3,4,5,6}; //v vec size nnz
      PetscInt nzrv[3]={1,2,3}; // nnz per row

      PetscViewer viewer;

      //MatSeqAIJSetPreallocation(A,n,nzrv);//If nnz is given then nz is ignored
      MatCreateSeqAIJWithArrays(PETSC_COMM_WORLD, m, n, Iv,Jv,vv, A);
      MatView(A,viewer);
      PetscViewerDestroy(&viewer);

      MatDestroy(&A);
      PetscFinalize();
      return 0;
    }

它编译但在运行时会导致分段冲突。我发现MatView() 是分段错误的根源。谁能帮我正确使用 MatView 吗?

【问题讨论】:

    标签: c++ c matrix petsc


    【解决方案1】:

    如果您想在控制台中运行代码时查看矩阵,可以使用MatView(Mat, PETSC_VIEWER_STDOUT_SELF) 用于顺序矩阵,或MatView(Mat, PETSC_VIEWER_STDOUT_WORLD) 用于并行矩阵。

    如果你想使用自己的查看器上下文,过程应该是这样的:

    PetscViewer viewer;
    
    char matrixOutputFile[PETSC_MAX_PATH_LEN];//output file name
    
    PetscViewerBinaryOpen(PETSC_COMM_WORLD,matrixOutputFile,FILE_MODE_WRITE,&viewer);    
    
    PetscViewerPushFormat(viewer,PETSC_VIEWER_ASCII_INFO_DETAIL);
    
    MatView(A,viewer); 
    
    PetscViewerDestroy(&viewer);
    

    以上代码会将矩阵存储到PetscViewerBinaryOpen的二进制文件中。而且PetscViewerASCIIOpen()可以用来存储ASCII格式的矩阵,PetscViewerDrawOpen()可以用来在X窗口显示矩阵,PetscViewerSocketOpen()可以将矩阵输出到Socket查看器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      • 2012-09-23
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      相关资源
      最近更新 更多