PETSc 两类(结构化)数据结构

来源:互联网 发布:衣服淘宝专柜代购 编辑:程序博客网 时间:2024/05/07 02:34

    一、向量


    1.1 定义

     串行向量定义:

     VecCreateSeq(PETSC_COMM SELF,int m,Vec *x);

    分布式向量定义:

     VecCreateMPI(MPI_Comm comm,int m,int M,Vec *x);   /* # of processors = M / m */

     或者

     VecCreate(MPI_Comm comm,Vec *v);
     VecSetSizes(Vec v, int m, int M);
     VecSetFromOptions(Vec v);


     1.2 赋值

     (串行/分布式) 向量元素赋相同的值:VecSet(Vec x,PetscScalar value);

      对数组中一段连续编号的元素赋值:VecSetValues(Vec x,int n,int *indices,PetscScalar *values,INSERT VALUES);

     /* n is number of components being set */

     赋值结束,必须调用:

     VecAssemblyBegin(Vec x);
     VecAssemblyEnd(Vec x); 

     

     1.3 常见操作

     返回全局向量分配在当前节点的子块(block): 

     VecGetOwnershipRange(Vec vec,int *low,int *high); 

     对子块内的元素操作:

     VecGetArray(Vec v,PetscScalar **array);  /*  返回要操作元素块的起始指针*array */

     操作结束,必须调用,以返回操作权:

     VecRestoreArray(Vec v, PetscScalar **array);

     

      1.4 规则的(结构化)分布式DA数组操作

      DMDACreate1d(MPI Comm comm,DMDABoundaryType xperiod,int M,int w,int s,int *lc,DM *inra);

      /* M global size; w local size; s 子块间重叠方式 */

     为实现子块重叠区域元素的信息互通,PETSc实际上使用了两套数组描述分布式DA数组:

      DMCreateGlobalVector(DM da,Vec *g) : DA全局数组

      DMCreateLocalVector(DM da,Vec *l) : DA局部数组(包含重叠边界的虚粒子,这里只给虚粒子留了内存空间,但没有赋值)

      给这些虚粒子赋值,需要调用:

      DMGlobalToLocalBegin(DM da,Vec g,InsertMode iora,Vec l);
      DMGlobalToLocalEnd(DM da,Vec g,InsertMode iora,Vec l);

      调用结束,各个节点都完成了各自边界虚拟子的赋值。


       1.5 子块信息

        返回节点所包含的全局数组子块的左下角元素全局编号、及子块大小:

       DMDAGetCorners(DM da,int *x,int *y,int *z,int *m,int *n,int *p);
       DMDAGetGhostCorners(DM da,int *x,int *y,int *z,int *m,int *n,int *p);  /* 包含当边界虚粒子的子块 */

       访问(赋值)子块元素(包括边界虚粒子),类似1.3常见操作:

       DMGetLocalVector(DM da,Vec *l);

       /* use the local vector l */

      DMRestoreLocalVector(DM da,Vec *l);

      DA数组赋值并按全局索引:

      DMDAVecGetArray(DM da,Vec l,void *array);

     DMDAVecRestoreArray(DM da,Vec l,void *array);

     /* vector l is the values given to *array /

     

      


           二、矩阵

           

            2.1 矩阵定义、赋值操作同向量:

             MatCreate(MPI Comm comm,Mat *A) MatSetSizes(Mat A,int m,int n,int M,int N)

             MatSetValues(Mat A,int m,const int idxm[],int n,const int idxn[],const PetscScalar values[],INSERT VALUES);

             /*矩阵元素可按m*n子块赋值,indxm, indxn表示子块的全局索引 */

             赋值完成,同样需要调用:

             MatAssemblyBegin(Mat A,MAT FINAL ASSEMBLY);

             MatAssemblyEnd(Mat A,MAT FINAL ASSEMBLY);

             获取当前节点所存储矩阵子块的范围:

             MatGetOwnershipRange(Mat A,int *first row,int *last row);

            

              2.2 稀疏矩阵

              串行稀疏矩阵:

              MatCreateSeqAIJ(PETSC COMM SELF,int m,int n,int nz,int *nnz,Mat *A);

              /* 高效稀疏存储要求根据每行非零元素个数进行内存预分配 */

              分布式稀疏矩阵:

              MatCreateMPIAIJ(MPI Comm comm,int m,int n,int M,int N,int d_nz, int *d_nnz, int o_nz,int *o nnz,Mat *A);

              /* M, N 为矩阵全局维度;m, n为各个节点上子块的维度 */

             

               2.3 稠密矩阵

               MatCreateSeqDense(PETSC COMM SELF,int m,int n,PetscScalar *data,Mat *A);  /*串行*/

               MatCreateDense(MPI Comm comm,int m,int n,int M,int N,PetscScalar *data,Mat *A)  /*分布式*/

               

               2.4 其他矩阵 

              

              

            参考:petsc user manuals 

  

原创粉丝点击