2017-12-02 3 views
0

스파 스 행렬 인수 분해 함수 (MatICCFactor)를 사용하기 위해 c/C++에서 petsc를 사용하는 방법을 배우고 있습니다. 내가 한 첫 번째 단계는 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)을 사용할 수 있습니다. 위의 코드는 PetscViewerBinaryOpen하여 바이너리 파일로 행렬을 저장합니다

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); 

: 같은

당신이 당신의 자신의 뷰어 컨텍스트를 사용하려면

는 절차가 있어야한다. 또한 PetscViewerASCIIOpen()은 매트릭스를 ASCII 형식으로 저장하는 데 사용할 수 있으며 PetscViewerDrawOpen()은 X 윈도우 디스플레이에 매트릭스를 표시하는 데 사용할 수 있으며 PetscViewerSocketOpen()은 매트릭스 뷰어에 매트릭스를 출력 할 수 있습니다.

관련 문제