我正在学习在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?
答案 0 :(得分:0)
如果要在控制台中运行代码时查看矩阵,可以使用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查看器。