我开始使用PETSc库来并行求解线性方程组.我已经安装了所有软件包,构建并成功运行了petsc/src/ksp/ksp/examples/tutorials /文件夹中的示例,例如ex.c
但我无法理解如何通过从文件中读取矩阵来填充矩阵A,X和B.
这里我提供了ex2.c文件中的代码:
/* Program usage:  mpiexec -n <procs> ex2 [-help] [all PETSc options] */ 
static char help[] = "Solves a linear system in parallel with KSP.\n\
Input parameters include:\n\
  -random_exact_sol : use a random exact solution vector\n\
  -view_exact_sol   : write exact solution vector to stdout\n\
  -m <mesh_x>       : number of mesh points in x-direction\n\
  -n <mesh_n>       : number of mesh points in y-direction\n\n";
/*T
   Concepts: KSP^basic parallel example;
   Concepts: KSP^Laplacian, 2d
   Concepts: Laplacian, 2d
   Processors: n
T*/
/* …我似乎无法找到一种方法如何有效地将scipy稀疏矩阵加载csr_matrix到例如petsc4py矩阵中PETSc.Mat().createAIJ.我找到了这个帖子,但是我无法应用它.
我也很欣赏这个东西实际记录的指针.demo目录中的示例   只解释了一个部分,我看不到任何文档字符串.
在3.3他们有一个炉排新闻 - 在GPU上仅使用PETC SNES进行FEM解决的一个例子.我是PETSc的新手并且有一个问题 - 我需要在3d空间中创建一个球体并对其施加力...所以我需要一个三维有限元模块(如果可能的话,在GPU上,我的情况下不需要MPI).然而,当我看到他们提供的简单例子时,我有点伤痕累累:
static const char help[] = "Testbed for FEM operations on the GPU.\n\n";
#include<petscdmplex.h>
#include<petscsnes.h>
#define NUM_FIELDS 1
PetscInt spatialDim = 0;
typedef enum {LAPLACIAN = 0, ELASTICITY} OpType;
typedef struct {
  PetscFEM      fem;               /* REQUIRED to use DMPlexComputeResidualFEM() */
  DM            dm;                /* The solution DM */
  PetscInt      debug;             /* The debugging level */
  PetscMPIInt   rank;              /* The process rank */
  PetscMPIInt   numProcs;          /* The number of processes */
  PetscInt …我想在C函数中包装一个类似函数的C宏(然后用一个{#fun ... #}块将它包装在Haskell中),但是c2hs预处理器会在do.. while(0)语法上扼杀; 这是代码:
module TestMacro where
#c
#define TestF1(n) do{if n==0 return 0;else return 1; } while(0)
int c_testF1(int x)
{ return ( TestF1(x) ); }
#endc
这是错误:
c2hs TestMacro.chs
c2hs: C header contains errors:
TestMacro.chs.h:6: (column 12) [ERROR]  >>> Syntax error !
  The symbol `do' does not fit here.
make: *** [main] Error 1
我究竟做错了什么?我的目标是包装CHKERRQPETSc库的宏,定义如下petscerror.h(为了便于阅读,分成多行):
#define CHKERRQ(n)             
    do {if (PetscUnlikely(n)) 
        return PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,n,PETSC_ERROR_REPEAT," ");} 
    while (0)
当我在C/C++中使用这种语法时,正在阅读PETSc:
PetscInt i, n = 10, col[3], its;
PetscScalar neg_one = -1.0, one = 1.0, value[3];
我不明白这里逗号的含义.它与元组有关吗?或者有什么东西超载?
我想知道二进制格式和ASCII格式之间的区别.问题是我需要使用PETSc进行一些矩阵操作,我的所有矩阵都存储在文本文件中.
PETSc有不同的规则来处理这些格式.我不知道这些格式是什么,更不用说我的文本文件是什么格式了.
有没有办法将一种格式转换为另一种格式?
这是一个基本问题; 详细的答案将真正帮助我理解这一点.