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
- PETSc 两类(结构化)数据结构
- petsc 结构化数据使用
- PETsc安装
- petsc toy
- 数据结构循环结构类
- 数据结构<十>: 线程结构 栈的两种实现
- 数据结构<十一>: 线程结构 队列的两种实现
- 数据结构:四类基本结构
- 数据结构 - 结构
- 编译PETSc + Fortran程序
- petsc 矩阵测试
- PETSC TS 测试
- PetSc学习记录
- 数据结构基础四-----《线性结构的两种常见应用之一 栈》
- 数据结构基础五-----《线性结构的两种常见应用之一 队列》
- 《数据结构》实验【两栈】
- PETSc函数手册 and FAQ
- PETSc并行读取矩阵数据
- 小甲鱼PE详解之输入表(导入表)详解2(PE详解08)
- get中文乱码
- 将数组变量写入文件
- 解析Activity中的onCreate方法
- 显示两个版本间的差异
- PETSc 两类(结构化)数据结构
- Ajax steps
- 【Coding】Eclipse使用技巧
- 下拉列表 级联菜单操作
- 关于Android SDK使用离线包更新的说明
- DRP项目小结
- 七届二中全会 到底啥意思
- 第十四周 对字符串排序
- c++并发编程实战(3)