如何将二进制文件作为矩阵读入 PETSc?

计算科学 宠物 io
2021-12-23 10:02:48

我在c中使用以下循环创建了一个二进制矩阵

char filename[6];
filename=sprintf(filename,"file01");
moutput=fopen(filename,"wb+");
for (i=0; i<2*m+1; i++){
      for (j=0; j<2*n+1; j++) {
            r=rmin+(rmax-rmin)*GetRand(N);
            fwrite(&r, sizeof(double), 1, moutput);
      }
}
fclose(moutput);

其中 r 是一个均匀分布的伪随机双精度数rminrmax. 我验证它正确地写入了值。

因此,我使用本教程作为将“file01”加载为二进制矩阵的指南。我运行了以下脚本:

make ex1
./ex1 -f0 file01

但是,它似乎不起作用。我收到一条错误消息:

[0]PETSC ERROR: Unexpected data in file!
[0]PETSC ERROR: not matrix object in file!

是我最初编写二进制文件的问题还是我使用错误的示例来加载这个特定的二进制文件?

3个回答

好的,二进制文件的完整格式在这里,并简化为:

  • int id:MAT_FILE_CLASSID
  • int nr:行数
  • int nc: 列数
  • int nnz:非零的总数
  • int[nr] nz:每行中的非零数
  • int[nnz] j:所有非零的列索引(起始索引为零)
  • PetscScalar[nnz] a:所有非零值

您还可以使用 bin/matlab/PetscBinaryWrite.m 将 Matlab 矩阵写入 PETSc 二进制格式。

我以前也有同样的问题。我的解决方案很简单。只需为每个处理器使用您语言中的 I/O 函数,例如 C 中的 fopen、fseek、fread、fclose。我假设你用 PetscInitialize()/PetscFinalize() 封装你的代码并通过 mpirun 运行可执行文件。因此,在代码中的 I/O 之前,您首先要确定每个处理器将读取的数据的位置(例如,根据文件大小和该处理器的等级)。您可以组装 Vec 以将数据保存为 petsc 格式。但我发现 VecLoad 不允许决定本地(处理器)大小。我还尝试了 MPI I/O 函数,但未能获得正确的值(可能是由于数据类型)。

我以前从未使用过 PETSc,但在我看来,您只是在以自己的格式编写二进制文件,而不是 PETSc 所期望的。

这是一个生成矩阵的示例,使用 PETSc 将其写入二进制文件,然后将矩阵读回:http ://www.mcs.anl.gov/petsc/petsc-current/src/mat/examples/tests/ ex31.c.html