问题标签 [petsc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - C 和 MPI:函数对相同数据的工作方式不同
我已经成功地用 PETSc 库编写了一个复杂的函数(它是一个基于 MPI 的科学库,用于并行求解巨大的线性系统)。这个库提供了它自己的“malloc”版本和基本数据类型(即“PetscInt”作为标准“int”)。对于这个函数,我一直在使用 PETSc 的东西,而不是标准的东西,比如“malloc”和“int”。该功能已经过广泛测试,并且始终运行良好。尽管使用了 MPI,但该功能是完全串行的,并且所有处理器都在相同的数据上执行它(每个处理器都有它的副本):根本不涉及通信。
然后,我决定不使用 PETSc 并编写一个标准的 MPI 版本。基本上,我用经典的 C 语言重写了所有代码,用经典的 C 语言替换了 PETSc 的内容,不是用暴力而是注意替换(我的意思是,没有任何编辑器的“替换”工具!全部手动完成)。在替换期间,进行了一些小的更改,例如声明两个不同的变量 a 和 b,而不是声明 a[2]。这些是替换:
PetscMalloc -> malloc
PetscScalar -> 双
PetscInt -> int
PetscBool -> 创建了一个枚举结构来复制它,因为 C 没有布尔数据类型。
基本上,算法在替换过程中没有改变。主函数是一个“for”循环(实际上是 4 个嵌套循环)。在每次迭代中,它调用另一个函数。让我们称之为功能失调。好吧,Disfunction 在 4 周期之外完美工作(正如我单独测试的那样),但在 4 周期内,在某些情况下有效,在某些情况下无效。此外,我在每次迭代时检查了传递给 Disfunction 的数据:使用 ECXACTELY 相同的输入,Disfunction 在一次迭代和另一次迭代之间执行不同的计算。此外,计算数据似乎不是未定义的行为,因为 Disfunction 总是在程序的不同运行中返回相同的结果。我注意到更改“mpiexec”的处理器数量会产生不同的计算结果。
那是我的问题。其他几项考虑:程序广泛使用“malloc”;所有过程的计算数据都是相同的,无论正确与否;Valgrind 不检测错误(除了通过正常使用 printf 检测错误,这是另一个问题和一个 OT);Disfunction 递归调用另外两个函数(也在 PETSc 版本中进行了广泛测试);所涉及的算法在数学上是正确的;功能障碍取决于整数参数 p>0:对于 p=1,2,3,4,5,它可以完美地工作,对于 p>=6,它不会。
如果被问到,我可以发布代码,但它很长而且很复杂(科学上,而不是信息上),我认为需要时间来解释。
我的想法是我搞砸了内存分配,但我不明白在哪里。对不起我的英语和糟糕的格式。
cmake - 如何启用更强大的优化构建
我正在尝试构建 PETSc,但在启用优化时遇到了问题。如果不指定,PETSc 总是会创建一个调试版本,但我可以通过将 --with-debugging=0 传递给 cmake 来关闭它。但是,这仅默认启用 -O1,但由于我的应用程序非常耗时且非常关键,我希望至少有 -O2。我找不到除了 --CFLAGS 之外的选项,它可以工作,但总是将选项附加到末尾,所以 -O1 会覆盖我的 -O2。
我希望“-O”手动设置标志,这给了我一百万行,主要来自 configure.log 文件并且没有帮助。
有人知道在哪里设置标志的文件,或者像...另一个选项禁用最后指定的 -O# 的使用,但启用最强或第一个的解决方法?
c++ - Clang 3.4 的 creal 和 cimag 问题
我正在使用 Clang 3.4 用 Petsc 编译一个库并得到:
它遵循以下定义:
我能找到的唯一相关信息是这个,我不知道这是否是特定于编译器的东西,并且缺少某些库,或者我对 Petsc 有一些问题。
我尝试使用 `cimag()',因为它在一个小测试文件中,但我无法使用 clang3.4 和 gcc4.8 编译它。
任何人都知道发生了什么。谷歌没有显示任何类似的主题...
编辑:
所以这是一个简单的例子:
它使用Gcc4.8编译(来自 macports):g++-mp-4.8 main.cc -o main
但是在 c11 模式下它不会: g++-mp-4.8 -std=c++11 main.cc -o main
:
clang在这两种情况下都不会编译它并产生与上述相同的错误。
python - 使用python生成petsc二进制文件
我正在尝试使用 python 创建一个 PETSC 二进制文件。我尝试在 bash shell 上运行脚本,但出现错误
$ python -c 'print file.shape\n import sys,os\n sys.path.append(os.path.join(os.environ['PETSC_DIR'],'bin','pythonscripts'))\nimport PetscBinaryIO\nio=PetscBinaryIO.PetscBinaryIO()\nfile_fortran=file.transpose((2,1,0))\n io.writeBinaryFile('my_geometry.dat',(walls_fortran.rave1()).view(PetscBinaryIO.Vec),))'
我知道这是因为额外的\
,但我的代码似乎没有。我尝试使用 python -i 以交互方式运行 python 来查找代码的哪一部分有问题
我是 python 新手,所以我知道这可能是一个明显的错误。但我似乎不知道这是关于什么的
感谢约翰的回答。现在它识别出 PETSC_DIR 我得到了错误
即使我指定它,它也不识别 PETSC_DIR
c++ - 在我的用户定义的 makefile 中的 makefile 上使用 PETSc
我是新来的PETSc
。我有一个很大的 c++ 代码,我想添加PETSc
到我已经拥有的一些文件中,所以我必须更改我的 makefile 以使其也可以编译 PETSc。
是否可以有两个不同的makefile,然后PETSc
在我自己的makefile中调用makefile?如果是这样,我该怎么做?
有没有人有任何链接PETSc
到自己的代码的经验?
顺便说一句,我使用 Linux 作为我的操作系统。
c - PetscMalloc vs PetscMallocX
使用 PetscMalloc2 (PetscMallocX) 而不是 PetscMalloc 两次(X 次)的经验法则是什么?这些块是否应该具有相似的大小,或者将它们一起/同时分配总是更有效?该手册说“分配 2 (X) 块内存都与 PETSC_MEMALIGN 对齐”用于定义,但对于 PETSc 和精细 HPC 问题的新手来说,这对我来说意义不大。我一直认为编译器会处理这些问题。
gfortran - 在 gfortran 中使用 PETSc,但它没有编译
我想在 fortran 中测试和使用 PESTc,所以我写了一些非常简单且为 null 的东西,例如 (petscexe.F):
看看能不能正确导入头文件。
我用 gfortran 编译文件: gfortran petscexe.F -I /opt/local/lib/petsc/include/finclude
头文件位于我计算机中的此文件夹 (/opt/local/lib/petsc/include/finclude) 中。所以一切都应该没问题,但是...
错误是
这是什么错误?非常感谢!
c++ - 将用户定义的矩阵代入 PETSc 矩阵
我有用 c++ 编写的顺序块 AIJ 矩阵,我将使用 PETSc 创建 MPI 矩阵。所以,我必须将我的稀疏块 AIJ 矩阵替换为 MPI 块 AIJ PETSc 矩阵。有没有人有任何关于如何做到这一点的例子?我将不胜感激有关我想做的任务的任何建议。
c++ - 使用 SLEPc 在矩阵入口处插入 -nan+iG
我在函数 MatSetValues 处收到“插入 -nan+iG 错误”。
我的代码是这样的:
我首先使用下面的代码将 double 更改为 PETScScalar(我使用的是复杂版本)。
然后我使用下面的代码将值插入矩阵。
这是问题所在:
我将我的 PETSc 代码编译成一个 .so 库,并将它与我程序的其他部分链接起来。
然而,它一直告诉我
在矩阵入口 (2,3) 处插入 -nan+iG!
(2,3) 实际上为零,我可以用 std::cerr 打印它,它告诉我它为零。所以我将矩阵从屏幕复制到一个文件中并使用选项编译它:
g++ test.cpp -L。-leigen_slepc -lstdc++ -I/home/altria/software/slepc-3.4.4/include -I/home/altria/software/slepc-3.4.4/arch-linux2-c-debug/include -I/home/altria /software/petsc-3.4.4/include -I/home/altria/software/petsc-3.4.4/arch-linux2-c-debug/include
这次过去了。所以我想可能是编译处理的差异导致了这个问题。有人对我的问题有任何想法吗?
c++ - 使用 MPI 在处理器之间分配工作,但所有处理器都在做整个工作,而不是只做其中的一部分
我有一个可以并行运行但使用共享内存方法的 c++ 代码。我将代码链接到 PETSc 并且 PETSc 能够并行运行代码,但使用分布式内存方法。当我并行运行代码(与 PETSc 链接的 c++)时,似乎所有处理器都在重复相同的工作。例如,当处理器数量为 4 时,边界条件和初始条件被读取 4 次,或者如果我使用 printf 命令,某些内容将被打印 4 次。所以这意味着工作没有在处理器之间分配,所有处理器都在做整个工作,而不是做其中的某些部分。有没有人有同样的经历,为了解决这个问题,你有什么建议?例如,您可以在下面看到代码读取网格两次而不是读取一次:
读取网格文件 Mesh_cavity2d.txt:
读取网格文件 Mesh_cavity2d.txt:
或者: