《PETSc Manual》:
Petsc学习笔记02
二:PETSc向量使用基础:
0. 头文件:
petscvec.h
(petsc.h头文件包含了petscvec.h,因为petsc.h头文件包含了所有petsc使用,所以若只使用向量可以只用petscvec.h头文件。petscvec.h头文件同样包含了所有petsc基本框架)
1.声明向量名
向量类型:Vec类型
作用:使得这个声明的名称能够用来表示向量
2.向量初始化
即初始化一个可以使用的向量,必须经过下列3个函数的设置
(1).创建空向量(向量初始化Ⅰ):VecCreate函数
函数原型:
PetscErrorCode VecCreate(
MPI_Comm comm /*in*/ ,
Vec* vec_name_p /*out*/){...}
参数解释:
①MPI_Comm comm
通信子名称:PETSC_COMM_WORLD
②Vec* vec_name_p
向量名称指针,用来将函数创建好的空向量返回给vec_name
函数作用:
函数在名称为comm
的通信子中创建一个空向量(未被设置,还不可以使用),并将其返回给vec_name。
(2).设置向量大小(向量初始化Ⅱ):VecSetSizes函数
函数原型:
PetscErrorCode VecSetSizes(
Vec vec_name /*in*/,
PetscInt vec_local_dim /*in*/,
PetscInt vec_global_dim /*in*/){...}
参数解释:
①Vec vec_name
向量名称
②PetscInt vec_local_dim
向量的本地维度(向量在VecCreate后是在通信子中创建,这个向量也就是属于整个通信子的多有进程,或者说是由通信子中所有进程组成的。每个进程在本地分担这个向量的部分元素)
③PetscInt vec_global_dim
向量的总维度(向量在VecCreate后是在通信子中创建,也就是说是由通信子中所有进程组成的。这是只得整个向量的总维度)
函数作用:
设置向量vec_name
的大小,此向量在一个进程中的元素个数为vec_local_dim
(注意:由于可以不均分,所以并不是每个进程所分得的元素个数一样,如一个向量总维度为3,一共2个进程,那么0进程分2个元素,1进程分3个元素),此向量的总体维度为vec_global_dim
。
注意事项:
第2个参数vec_local_dim与第3个参数vec_global_dim不可同时被用户设置,二者只能由一个被用户设置,另一个被系统设置,要系统设置,将参数设置为PETSC_DECIDE
。比如:用户设置总体维度vec_global_dim为5(2个进程),系统PETSC_DECIDE本地维度vec_local_dim,则0进程分得2个元素,1进程分得3个元素;用户设置本地维度vec_local_dim为2(2个进程),系统PETSC_DECIDE总体维度,则总体维度vec_global_dim为:comm_szvec_local_dim=22=4
(3).设置向量类型(向量初始化Ⅲ):VecSetFromOptions和VecSetType函数
说明:
这两函数都是用来设定向量的类型的,只是VecSetFromOptions时根据选项(Option)来自动设置,而VecSetType时由用户手动设置,通常我们选择VecSetFromOptions。
函数原型:
PetscErrorCode VecSetFromOptions(Vec vec_name /*in*/){...}
参数解释:
①Vec vec_name
向量名称
注意事项:
无论是VecSetFromOptions还是VecSetType都必须在VecCreate函数调用后调用!(VecSetSizes同样也必须在VecCreate函数调用后调用,但VecSetSizes的调用与上述两个函数之间的调用无顺序关系)
3.设置向量初始化的一套组合拳:
第一拳:
声明一个向量:Vec i_am_vector;
第二拳:
创建一个空向量:VecCreate(PETSC_COMM_WORLD,&i_am_verctor);
第三拳:
设置向量大小(维度):VecSetSizes(i_am_vector,PETSC_DECIDE,总体维度)
第四拳:
设置向量类型:VecSetFromOptions(i_am_vector)
这一套组合拳下来便生成好了一个可以使用的向量。
那么框架+向量初始化例子如下:
#include <stdio.h>
#include <petsc.h>
/*-------------------Set Global Variables-------------------*/
static char help[] = "This is a basic framework of PETSc's Vector!/n";
MPI_Comm;
PetscInt comm_sz;
PetscInt my_rank;
PetscErrorCode ierr;
/*-------------------Set Global Variables-------------------*/
int main(int argc,char* argv[]){
/*No PETSc or MPI calls before this*/
ierr = PetscInitialize(&argc,&argv,NULL,help);
if(ierr) return ierr;
/*MPI original basic initial settings*/
comm = PETSC_COMM_WORLD;
ierr = MPI_Comm_size(comm,&comm_sz); CHKERRQ(ierr);
ierr = MPI_Comm_rank(comm,&my_rank); CHKERRQ(ierr);
/**---------------------------------------------**/
/*Vector:*/
PetscInt vec_global_dim;
ierr=PetscOptionsGetInt(NULL,NULL,"dim",&vec_global_dim,NULL);CHKERRQ(ierr);
Vec i_am_vector;
ierr=VecCreate(comm,&i_am_vector);CHKERRQ(ierr);
ierr=VecSetSizes(i_am_vector,PETSC_DECIDE,vec_global_dim);CHKERRQ(ierr);
ierr=VecSetFromOptions(i_am_vector);CHKERRQ(ierr);
/* You can code whatever you want in this section*/
/**---------------------------------------------**/
ierr = PetscFinalize();
/*No PETSc or MPI calls after this*/
return ierr;
}