- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我最近开始学习 PETSc,在尝试完成一些简单任务时遇到了问题。这段代码有什么问题:
static char help[] = "Test 2d DMDAs Vecs.\n\n";
#include <petscdm.h>
#include <petscdmda.h>
#include <petscsys.h>
PetscReal process_value(int rank, int i) {
return i*PetscPowScalar(10,rank*2);
}
int main(int argc,char **argv) {
PetscErrorCode ierr;
PetscMPIInt rank;
PetscInt M = -5,N = -3;
DM da;
Vec local,global;
ierr = PetscInitialize(&argc,&argv,(char*)0,help);CHKERRQ(ierr);
ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
ierr = DMDACreate2d(PETSC_COMM_WORLD , DM_BOUNDARY_NONE , DM_BOUNDARY_NONE
, DMDA_STENCIL_BOX , M , N , PETSC_DECIDE, PETSC_DECIDE
, 1 , 1 , NULL , NULL , &da); CHKERRQ(ierr);
ierr = DMCreateGlobalVector(da,&global);CHKERRQ(ierr);
ierr = DMCreateLocalVector(da,&local);CHKERRQ(ierr);
{
PetscInt v,i, j, xm, ym, xs, ys;
PetscScalar **array;
ierr = DMDAGetCorners(da, &xs, &ys, 0, &xm, &ym, 0); CHKERRQ(ierr);
PetscSynchronizedPrintf(PETSC_COMM_WORLD,"%d:xs=%d\txm=%d\tys=%d\tym=%d\n",rank,xs,xm,ys,ym);
PetscSynchronizedFlush(PETSC_COMM_WORLD,PETSC_STDOUT);
ierr = DMDAVecGetArray(da, global, &array); CHKERRQ(ierr);
v=0;
for (j = ys; j < ys + ym; j++) {
for (i = xs; i < xs + xm; i++) {
array[j][i] = process_value(rank,v+=1);
}
}
ierr = DMDAVecRestoreArray(da, global, &array); CHKERRQ(ierr);
}
ierr = VecView(global,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
ierr = VecDestroy(&local);CHKERRQ(ierr);
ierr = VecDestroy(&global);CHKERRQ(ierr);
ierr = DMDestroy(&da);CHKERRQ(ierr);
ierr = PetscFinalize();
return 0;
}
它用进程级别标记的数量填充小数组。编译链接成功后,结果如下:
> mpiexec -n 2 ./problem
0:xs=0 xm=3 ys=0 ym=3
1:xs=3 xm=2 ys=0 ym=3
Vec Object: 2 MPI processes
type: mpi
Vec Object:Vec_0x84000004_0 2 MPI processes
type: mpi
Process [0]
1.
2.
3.
100.
200.
4.
5.
6.
300.
Process [1]
400.
7.
8.
9.
500.
600.
>
VecView 显示进程已经写入属于其他进程的地方。错误在哪里? DMDAVecGetArray/DMDAVecRestoreArray 给出错误的数组或 VecView 不适合查看从 DM 对象获取的 Vec?
最佳答案
DMDAVecGetArray()
和 DMDAVecRestoreArray()
工作得很好。实际上,您正在处理 mailing list of petsc 中描述的 VecView()
功能。几年前。
照原样,VecView()
使用自然顺序打印来自 DMDA 的 vector 。
proc0 proc1
1 2 | 3 4
5 6 | 7 8
___________
9 10 | 11 12
13 14 | 15 16
proc2 proc3
documentation of Petsc 中强调了自然排序和 Petsc 排序之间的区别。 ,在关于结构化网格的 2.5 节中。以下是 Petsc 的订购方式:
proc0 proc1
1 2 | 5 6
3 4 | 7 8
___________
9 10 | 13 14
11 12 | 15 16
proc2 proc3
正如线程中的信号 VecView doesn't work properly with DA global vectors ,仍然可以使用 Petsc 的排序打印 vector :
PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_NATIVE);
VecView(global,PETSC_VIEWER_STDOUT_WORLD);
PetscViewerPopFormat(PETSC_VIEWER_STDOUT_WORLD);
让我们仔细看看 Petsc 的源代码,看看它是如何工作的。当调用 DMCreateGlobalVector_DA()
函数时,DMDA vector 的 VecView()
操作被重载(参见 dadist.c ):新方法是 VecView_MPI_DA()
在gr2.c .不出所料,它调用函数 DMDACreateNaturalVector()
,然后使用原生 VecView()
打印自然 vector 。如果使用格式 PETSC_VIEWER_NATIVE
,则 vector interface调用操作 *vec->ops->viewnative
,它可能指向 pdvec.c 中的原生 VecView()
函数 VecView_MPI_ASCII()
.这解释了 VecView 对于 DMDA vector 的奇怪(但非常实用!)行为。
如果您希望保持自然顺序,您可以删除无意义的 Process[0]...Process[3]
,方法是:
PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_ASCII_COMMON);
关于c++ - PETSC DMDA vec 值分配给 wrang 位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38794889/
我有 Windows 7 操作系统。我已按照 PETSc web page 的说明进行操作;在 VS 2005 的命令提示符中,我打开了 cygwin 并使用以下命令安装了 PETSc: ./conf
我对 PETSC 有疑问。我在 matlab 中编写了一段代码,我正在尝试使用 PETSC 库将这段代码翻译成 C++。我正在为多相流编写流体动力学模拟,我正在尝试以一种简单的方式进行与此 matla
我有一个非常初学者的问题,但我现在真的迷路了。我从 PETSc 开始,但我在编译代码时遇到问题。我正在尝试使用我自己的 Makefile,但编译器一直大喊“ undefined reference ”
在没有 Petsc 的情况下,我可以看到哪些文件、哪些函数以及哪些行发生错误并从中传播。使用 Petsc,我总是收到相同的错误消息。 Petsc 中是否有任何我遗漏的标志? 谢谢。 [0]PETSC
我正在尝试在 PETSc 中编写 LU 分解应用程序。我的想法是,程序将打印未因式分解的矩阵,然后打印因式分解的矩阵并计算因式分解本身所花费的时间。 我根据在互联网上找到的少量信息编写了代码(我使用
下面这个问题可能比较容易回答,但是我在网上没有找到任何解决办法。简而言之,我将一些 petsc 函数调用放在一个类中。 下面的方程式求解器脚本没有任何问题: static char help[] =
我正在使用 C 代码进行辐射传输的水力模拟。需要 PETSc,我在本地机器上编译了它。但在编译我的代码时,我收到错误消息:error: '__SDIR__' undeclared(在此函数中首次使用)
我正在尝试创建并打印 MATDENSE PETSc 中的矩阵。我的 MWE 看起来像这样: static char help[] = ""; #include #include int main(
我有一个使用 PETSC 的非常基本的程序 #include "PETSC/petsc.h" #include "PETSC/petscsys.h" #include "PETSC/petscm
我正在尝试在 Windows 7 上安装 PETSc 库以与 Visual Studio Express 2008 一起使用,但到目前为止我没有成功。我用 python、make、diff 安装了 c
我在 Ubuntu 13.04 64 位上,我正在尝试使用 CMake 在 PETSc 中构建一个“Hello world”程序。 我有以下程序 solve1.c (松散地基于 PETSc 示例中的
我想制作PETSc(的子集) Haskell 通过 FFI 接口(interface)提供库,以便对用户隐藏内存和错误管理; 使用如下所示的命令构建带有共享库的 PETSc 3.5.3,测试套件运行成
我正在使用Petsc,我想组合一个分布式Vec,以便每个进程都有一个完整的Vec副本。我有一个最小的示例,它从一个数据数组开始,从中构造一个 MPI Vec,然后尝试使用 VecScatter 来组合
我正在学习在 c/c++ 中使用 petsc,以便在其中使用稀疏矩阵分解函数 (MatICCFactor)。我做的第一步是将玩具矩阵读入 petsc 以创建稀疏矩阵并在对其进行任何操作之前查看该矩阵。
您好,我有一个用 C++ 编写的程序,其中许多函数中有一个或两个正在使用 PETSc。 当我调用这些函数时,这将是使用 PETSc 的正确方法 1) a)change all MPI_COMM_WOR
我正在从事科学计算并为多 CPU 系统开发基于 petsc 的应用程序。 出于调试目的,我想在我自己的电脑上安装那个软件,这是一个运行 Ubuntu (Karmic Koala) 的双核系统。 但我不
我开始使用 PETSc 库来并行求解线性方程组。我已经安装了所有软件包,构建并成功运行了 petsc/src/ksp/ksp/examples/tutorials/文件夹中的示例,例如 ex.c 但是
这里是 hello.cpp。我在 OS X 上。我直接从源代码构建了 PETSc。 #include int main(int argc,char **argv) { Vec x; PetscI
我最近开始学习 PETSc,在尝试完成一些简单任务时遇到了问题。这段代码有什么问题: static char help[] = "Test 2d DMDAs Vecs.\n\n"; #include
在 3.3 中他们有一个 grate news - 在 GPU 上仅使用 PETC SNES 进行 FEM 求解的示例。我是 PETSc 的新手并且有一个问题 - 我需要在 3d 空间中创建一个球体并
我是一名优秀的程序员,十分优秀!