gpt4 book ai didi

c++ - 使用 Petsc 库用 vector 构造稀疏矩阵

转载 作者:行者123 更新时间:2023-11-30 16:38:05 40 4
gpt4 key购买 nike

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

 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 吗?

最佳答案

如果你想在控制台运行代码时查看矩阵,可以使用 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查看器。

关于c++ - 使用 Petsc 库用 vector 构造稀疏矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47611258/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com