petsc 矩阵测试
来源:互联网 发布:linux 播放 4k 视频 编辑:程序博客网 时间:2024/05/19 19:40
第一个PETSc矩阵测试:
static char help[] = " matrix parallel partition test\n\n"; #include <petscksp.h> int main(int argc, char **args){ Mat A; PetscInt dim, i, j, Ii, J, Istart, Iend, n=6; PetscScalar v ; PetscInitialize(&argc, &args, (char*)0,help); PetscOptionsGetReal(NULL, "-sigma1", &sigma1, NULL); PetscOptionsGetInt(NULL, "-n", &n, NULL); dim = n * n; MatCreate(PETSC_COMM_WORLD, &A); MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,dim,dim); MatSetFromOptions(A); MatSetUp(A); MatGetOwnershipRange(A,&Istart,&Iend); for (Ii = Istart; Ii < Iend; Ii++) { v = 1.0; i = Ii/n; j = Ii - i * n; if(i > 0) { J = Ii - n; MatSetValues(A,1,&Ii,1,&J,&v,ADD_VALUES); } if(i < n - 1) { J = Ii + n; MatSetValues(A,1,&Ii,1,&J,&v,ADD_VALUES); } if(j > 0) { J = Ii - 1; MatSetValues(A,1,&Ii,1,&J,&v,ADD_VALUES); } if(j < n - 1) { J = Ii + 1; MatSetValues(A,1,&Ii,1,&J,&v,ADD_VALUES); }} MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY); MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY); PetscPrintf(PETSC_COMM_WORLD, "Matrix output\n"); MatView(A,PETSC_VIEWER_STDOUT_WORLD); MatDestroy(A); PetscFinalize(); return 0;}
PETSC中矩阵按行划分分给各节点,对每个节点中的矩阵子块进行赋值。
输出矩阵:
row 0: (1, 1) (4, 1)
row 1: (0, 1) (2, 1) (5, 1)
row 2: (1, 1) (3, 1) (6, 1)
row 3: (2, 1) (7, 1)
row 4: (0, 1) (5, 1) (8, 1)
row 5: (1, 1) (4, 1) (6, 1) (9, 1)
row 6: (2, 1) (5, 1) (7, 1) (10, 1)
row 7: (3, 1) (6, 1) (11, 1)
row 8: (4, 1) (9, 1) (12, 1)
row 9: (5, 1) (8, 1) (10, 1) (13, 1)
row 10: (6, 1) (9, 1) (11, 1) (14, 1)
row 11: (7, 1) (10, 1) (15, 1)
row 12: (8, 1) (13, 1)
row 13: (9, 1) (12, 1) (14, 1)
row 14: (10, 1) (13, 1) (15, 1)
row 15: (11, 1) (14, 1)
注意:
首先,MatGetOwnershipRange 和 MatSetValue 之后,任何一个cpu节点实际上是可以修改不属于它自身“管辖”范围内矩阵元素的。其中的数据通信,属于petsc封装(省了麻烦)。
本例中给值的矩阵元素 pattern 如下:
(I, J+1)
(I-1 , J) (I + 1, J)
(I, J-1)
if (i > 0) 语句完成了对当前元素(I,J ) 正下方邻接元素(I, J -1) 的赋值;
if (i < n - 1) 语句对 (I, J +1) 赋值。
同理,其他。
这样就形成了“条状”矩阵元素带。显然,对于本程序用了4 cpu节点(按行划分),即整体矩阵的每四行属于一个节点。 对当前cpu节点(比如p0),显然不仅仅对整体“带状矩阵”的前四行相关位置赋值了,而是所有满足if条件的位置,不管该位置是不是在当前cpu节点管辖范围内。
- petsc 矩阵测试
- PETSC TS 测试
- PETSc并行读取矩阵数据
- PETsc安装
- petsc toy
- 编译PETSc + Fortran程序
- PetSc学习记录
- PETSc函数手册 and FAQ
- petsc 结构化数据使用
- Building libmesh with Petsc support
- 矩阵键盘以及测试
- 矩阵的测试
- 矩阵乘法测试
- PETSc 库解线性方程组Ax = b
- PETSc 两类(结构化)数据结构
- deal.II链接PETSc过程记录
- 迭代求解矩阵测试
- 矩阵的简单测试模板
- 十大常见Java String问题
- Redis应用场景
- 带传动产生松边和紧边的原因
- Search in Rotated Sorted Array 旋转数组里查找数 @LeetCode
- Binary Tree Level Order Traversal II 二叉树按层遍历(反向输出)@LeetCode
- petsc 矩阵测试
- Populating Next Right Pointers in Each Node II 任意(非完美)二叉树添加next指针 @LeetCode
- Apache HttpClient 4.3开发指南
- bash脚本文件注释
- qsort函数用法
- Django 学习笔记(六)
- hdoj1421 搬寝室 (dp)
- 浏览器内核比较
- [转] VIM解决中文乱码