static char help[] = "A structured-grid Poisson problem with DMDA+KSP.\n\n";

 #include <petsc.h>

 extern PetscErrorCode formMatrix(DM, Mat);
extern PetscErrorCode formExact(DM, Vec);
extern PetscErrorCode formRHS(DM, Vec); //STARTMAIN
int main(int argc,char **args) {
PetscErrorCode ierr;
DM da;
Mat A;
Vec b,u,uexact;
KSP ksp;
double errnorm;
DMDALocalInfo info; PetscInitialize(&argc,&args,(char*),help); // default size (9 x 9) can be changed using -da_refine X or
// -da_grid_x M -da_grid_y N
ierr = DMDACreate2d(PETSC_COMM_WORLD,
DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DMDA_STENCIL_STAR,
,,PETSC_DECIDE,PETSC_DECIDE,,,NULL,NULL,&da); CHKERRQ(ierr); // create linear system matrix A
ierr = DMSetFromOptions(da); CHKERRQ(ierr);
ierr = DMSetUp(da); CHKERRQ(ierr);
ierr = DMCreateMatrix(da,&A); CHKERRQ(ierr);
ierr = MatSetFromOptions(A); CHKERRQ(ierr); // create right-hand-side (RHS) b, approx solution u, exact solution uexact
ierr = DMCreateGlobalVector(da,&b); CHKERRQ(ierr);
ierr = VecDuplicate(b,&u); CHKERRQ(ierr);
ierr = VecDuplicate(b,&uexact); CHKERRQ(ierr); // fill vectors and assemble linear system
ierr = formExact(da,uexact); CHKERRQ(ierr);
ierr = formRHS(da,b); CHKERRQ(ierr);
ierr = formMatrix(da,A); CHKERRQ(ierr); // create and solve the linear system
ierr = KSPCreate(PETSC_COMM_WORLD,&ksp); CHKERRQ(ierr);
ierr = KSPSetOperators(ksp,A,A); CHKERRQ(ierr);
ierr = KSPSetFromOptions(ksp); CHKERRQ(ierr);
ierr = KSPSolve(ksp,b,u); CHKERRQ(ierr); // report on grid and numerical error
ierr = VecAXPY(u,-1.0,uexact); CHKERRQ(ierr); // u <- u + (-1.0) uxact
ierr = VecNorm(u,NORM_INFINITY,&errnorm); CHKERRQ(ierr);
ierr = DMDAGetLocalInfo(da,&info);CHKERRQ(ierr);
ierr = PetscPrintf(PETSC_COMM_WORLD,
"on %d x %d grid: error |u-uexact|_inf = %g\n",
info.mx,info.my,errnorm); CHKERRQ(ierr); VecDestroy(&u); VecDestroy(&uexact); VecDestroy(&b);
MatDestroy(&A); KSPDestroy(&ksp); DMDestroy(&da);
return PetscFinalize();
}
//ENDMAIN //STARTMATRIX
PetscErrorCode formMatrix(DM da, Mat A) {
PetscErrorCode ierr;
DMDALocalInfo info;
MatStencil row, col[];
double hx, hy, v[];
int i, j, ncols; ierr = DMDAGetLocalInfo(da,&info); CHKERRQ(ierr);
hx = 1.0/(info.mx-); hy = 1.0/(info.my-);
for (j = info.ys; j < info.ys+info.ym; j++) {
for (i = info.xs; i < info.xs+info.xm; i++) {
row.j = j; // row of A corresponding to (x_i,y_j)
row.i = i;
col[].j = j; // in this diagonal entry
col[].i = i;
ncols = ;
if (i== || i==info.mx- || j== || j==info.my-) {
v[] = 1.0; // if on boundary, just insert diagonal entry
} else {
v[] = *(hy/hx + hx/hy); // ... everywhere else we build a row
// if neighbor is NOT a known boundary value then we put an entry
if (i- > ) {
col[ncols].j = j; col[ncols].i = i-; v[ncols++] = -hy/hx; }
if (i+ < info.mx-) {
col[ncols].j = j; col[ncols].i = i+; v[ncols++] = -hy/hx; }
if (j- > ) {
col[ncols].j = j-; col[ncols].i = i; v[ncols++] = -hx/hy; }
if (j+ < info.my-) {
col[ncols].j = j+; col[ncols].i = i; v[ncols++] = -hx/hy; }
}
ierr = MatSetValuesStencil(A,,&row,ncols,col,v,INSERT_VALUES); CHKERRQ(ierr);
}
}
ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
return ;
}
//ENDMATRIX //STARTEXACT
PetscErrorCode formExact(DM da, Vec uexact) {
PetscErrorCode ierr;
DMDALocalInfo info;
int i, j;
double hx, hy, x, y, **auexact; ierr = DMDAGetLocalInfo(da,&info); CHKERRQ(ierr);
hx = 1.0/(info.mx-); hy = 1.0/(info.my-);
ierr = DMDAVecGetArray(da, uexact, &auexact);CHKERRQ(ierr);
for (j = info.ys; j < info.ys+info.ym; j++) {
y = j * hy;
for (i = info.xs; i < info.xs+info.xm; i++) {
x = i * hx;
auexact[j][i] = x*x * (1.0 - x*x) * y*y * (y*y - 1.0);
}
}
ierr = DMDAVecRestoreArray(da, uexact, &auexact);CHKERRQ(ierr);
return ;
} PetscErrorCode formRHS(DM da, Vec b) {
PetscErrorCode ierr;
int i, j;
double hx, hy, x, y, f, **ab;
DMDALocalInfo info; ierr = DMDAGetLocalInfo(da,&info); CHKERRQ(ierr);
hx = 1.0/(info.mx-); hy = 1.0/(info.my-);
ierr = DMDAVecGetArray(da, b, &ab);CHKERRQ(ierr);
for (j=info.ys; j<info.ys+info.ym; j++) {
y = j * hy;
for (i=info.xs; i<info.xs+info.xm; i++) {
x = i * hx;
if (i== || i==info.mx- || j== || j==info.my-) {
ab[j][i] = 0.0; // on bdry the eqn is 1*u = 0
} else { // if not bdry; note f = - (u_xx + u_yy) where u is exact
f = 2.0 * ( (1.0 - 6.0*x*x) * y*y * (1.0 - y*y)
+ (1.0 - 6.0*y*y) * x*x * (1.0 - x*x) );
ab[j][i] = hx * hy * f;
}
}
}
ierr = DMDAVecRestoreArray(da, b, &ab); CHKERRQ(ierr);
return ;
}
//ENDEXACT

学习poisson.c的更多相关文章

  1. 各大公司广泛使用的在线学习算法FTRL详解

    各大公司广泛使用的在线学习算法FTRL详解 现在做在线学习和CTR常常会用到逻辑回归( Logistic Regression),而传统的批量(batch)算法无法有效地处理超大规模的数据集和在线数据 ...

  2. 各大公司广泛使用的在线学习算法FTRL详解 - EE_NovRain

    转载请注明本文链接:http://www.cnblogs.com/EE-NovRain/p/3810737.html 现在做在线学习和CTR常常会用到逻辑回归( Logistic Regression ...

  3. R语言学习路线和常用数据挖掘包(转)

    对于初学R语言的人,最常见的方式是:遇到不会的地方,就跑到论坛上吼一嗓子,然后欣然or悲伤的离去,一直到遇到下一个问题再回来.当然,这不是最好的学习方式,最好的方式是——看书.目前,市面上介绍R语言的 ...

  4. FTRL(Follow The Regularized Leader)学习总结

    摘要: 1.算法概述 2.算法要点与推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 6.适用场合 内容: 1.算法概述 FTRL是一种适用于处理超大规模数据的,含大量稀疏特征的在线学习的 ...

  5. Keras学习笔记(完结)

    使用Keras中文文档学习 基本概念 Keras的核心数据结构是模型,也就是一种组织网络层的方式,最主要的是序贯模型(Sequential).创建好一个模型后就可以用add()向里面添加层.模型搭建完 ...

  6. 学习笔记TF044:TF.Contrib组件、统计分布、Layer、性能分析器tfprof

    TF.Contrib,开源社区贡献,新功能,内外部测试,根据反馈意见改进性能,改善API友好度,API稳定后,移到TensorFlow核心模块.生产代码,以最新官方教程和API指南参考. 统计分布.T ...

  7. [zz]如何学习Polygon Mesh Processing这本书?

    图形学初学者,如何学习Polygon Mesh Processing这本书?修改修改 导师暑假让我看看这本书,目前看了一半觉得这本书比较偏重数学基础,对于具体的 implementation提及的并不 ...

  8. 图像边缘检测——几种图像边缘检测算子的学习及python 实现

    本文学习利用python学习边缘检测的滤波器,首先读入的图片代码如下: import cv2 from pylab import * saber = cv2.imread("construc ...

  9. numpy之random学习

    在机器学习中参数初始化需要进行随机生成,同时样本也需要随机生成,或者遵从一定规则随机生成,所以对随机生成的使用显得格外重要. 有的是生成随机数,有的是随机序列,有点是从随机序列中选择元素等等. 简单的 ...

随机推荐

  1. 骨灰级玩家体验带你测试体验天使纪元OL折扣端

    刘亦菲代言吸引了我才进入游戏的(不知道有多少人和我一样)这个游戏没有一些骨灰级玩家带,真的很费时间费钱.   天使纪元5折折扣端(点击下载),其实是一个良心老平台,苹果,安卓.H5都支持的平台,采用最 ...

  2. word模板导出的几种方式:第一种:占位符替换模板导出(只适用于word中含有表格形式的)

    1.占位符替换模板导出(只适用于word中含有表格形式的): /// <summary> /// 使用替换模板进行到处word文件 /// </summary> public ...

  3. return -1 、return 1 、 return 0 的区别

    根据所定义函数的需求返回不同的值. 一般0和-1或者0和1使用 0和-1使用时: 0一般表示成功执行 -1一般表示不成功 0和1使用时: 1真 0假

  4. CMS收集器产生的问题和解决方案

    垃圾收集器长时间停顿,表现在 Web 页面上可能是页面响应码 500 之类的服务器错误问题,如果是个支付过程可能会导致支付失败,将造成公司的直接经济损失,程序员要尽量避免或者说减少此类情况发生. 提升 ...

  5. 《内蒙古自治区第十三届大学生程序设计竞赛试题_H 公孙玉龙》

    这个题有点小坑,最坑的地方就是  输入的b 变量  有可能 是  负数  !   负数 !  负数!    对 ,你没有看错,就是负数,坑死我了, 一直都是  content.charAt(0) 判断 ...

  6. vue-cli 最强指南

    今天在这篇文章里,会对 vue-cli 的功能做个详细的整理,把 vue-cli 所有的功能都列出来.注:这个是官网连接:https://cli.vuejs.org/zh/guide/ ,建议多看细看 ...

  7. myeclipse编码问题

    在中文操作系统中,Eclipse中的Java类型文件的编码的默认设置是GBK, 但是对Properties资源文件的编码的默认设置是ISO-8859-1. 所以编辑Java文件中的中文不会出现问题,但 ...

  8. fabric私密数据学习笔记

    fabric私密数据学习笔记 私密数据分为两部分 一个是真正的key,value,它被存在 peer的私密数据库(private state)中. 另一部分为公共数据,它是真实的私密数据key,val ...

  9. git pull 撤销误操作

    本来想把github上的release合并到本地的release分支上,由于没有查看当前分支,直接运用git pull origin v2.8.1,结果将release合并到了v2.8.1分支中. 解 ...

  10. mysq带条件的分页查询数据结果错误

    记一次mysql分页条件查询的结果出错: 以一张用户表为例,首先我们看表中的所有数据,注意红色框住的部分: 我们使用不带条件的分页查询来查询,数据显示是OK的: SELECT id,login_nam ...