2017-12-02 150 views
0

我正在學習在c/C++中使用petsc以便在其中使用稀疏矩陣分解函數(MatICCFactor)。我做的第一步是將玩具矩陣讀入petsc中以創建一個稀疏矩陣並在我做任何事情之前查看矩陣。我是一個用c/C++編寫的BTW初學者。 這裏是我使用的代碼:使用Petsc庫構造具有向量的稀疏矩陣

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

如果要在控制檯中運行代碼時查看矩陣,可以將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查看器。