《PETSc Manual》学习笔记02

《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;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值