Questions tagged «petsc»

PETSc是开放数据源的数据结构和例程套件,用于通过偏微分方程建模的科学应用的可扩展(并行)解决方案。

17
是否有适用于Python的高质量非线性编程求解器?
我要解决几个具有挑战性的非凸全局优化问题。目前,我使用了MATLAB的Optimization Toolbox(特别是fmincon()使用algorithm = 'sqp'),它非常有效。但是,我的大部分代码是在Python中进行的,我也想在Python中进行优化。是否存在可以与Python绑定竞争的NLP求解器fmincon()?它必须 能够处理非线性等式和不等式约束 不需要用户提供雅可比行列式。 如果不保证全局最优(fmincon()没有),也可以。我正在寻找一种即使在遇到挑战性问题时也可以收敛到局部最优的东西,即使它比慢一些fmincon()。 我尝试了OpenOpt提供的几种求解器,发现它们不如MATLAB的fmincon/sqp。 只是为了强调,我已经有了一个易于处理的公式和一个好的求解器。我的目标仅仅是更改语言,以使工作流程更加简化。 Geoff指出问题的某些特征可能是相关的。他们是: 10-400个决策变量 4-100个多项式相等约束(多项式范围从1到大约8) 有理不等式约束的数量大约等于决策变量数量的两倍 目标函数是决策变量之一 等式约束的雅可比行列是密集的,不等式约束的雅可比行列是密集的。

2
为什么我的迭代线性求解器不收敛?
使用KSP(PETSc)的预先设定的Krylov方法时会出什么问题的线性求解器程序包)中的求解稀疏线性系统(例如通过离散化和线性化偏微分方程获得的线性系统)时,会出现什么问题? 我可以采取什么步骤来确定问题出了什么问题? 为了成功有效地求解线性系统,我可以进行哪些更改?

5
PETSc和Trilinos之间的主要区别是什么?
据我所知,美国能源部的两个大型通用计算科学软件框架是 PETSc和Trilinos。乍一看,它们看起来很相似,只是语言上的差异(C与C ++)不同。这两个框架之间的主要区别是什么?应该选择哪些因素来影响一个因素?(忽略机构偏见和现有基础结构。)


2
哪些库对多网格有良好的高级支持?
我打算使用多重网格来计算一些特征值和向量,并且我注意到PETSc对多重网格提供了高级支持。PETSc文档说不应使用PETSc的这一部分,因为它将很快被替换。 哪些其他库对多网格提供了高级支持,并且PETSc大约多久后将发布新的多网格支持?

3


2
PETSc对稠密矩阵有多有用?
无论我在哪里看到,PETSc教程/文档等都说它对线性代数很有用,并且通常指定稀疏系统将受益。那密矩阵呢?我关注解决稠密。Ax=bAx=bAx=bAAA 我已经在Fortran中编写了自己的CG和QMR代码。基本构造是撕裂伪代码,并在可能的情况下(和)添加BLAS例程ddot,dnrm并dgemv进行一些自我调整。与PETSc相比如何? 我知道最好的答案是我自己尝试一下,但是由于时间和其他原因,这是不可能的。 任何帮助深表感谢。


4
对与使用MPI的代码/库兼容的单元测试框架有何建议?
通常,我编写串行代码,然后编写,并使用一些xUnit风格的测试框架(MATLAB xUnit,PyUnit / nose或Google的C ++测试框架)编写单元测试。 基于对Google的粗略搜索,关于从业人员如何对使用MPI的测试代码进行单元化的知识很少。有什么最佳实践吗? 与单元测试和测试驱动的开发策略相比,我正在寻找与应该用于测试框架的软件有关的答案(如果存在的话,答案很可能是“编写自己的代码”),其中自定义测试代码的案例示例会很有帮助)。 我要测试的大部分内容都是用于右侧步进功能的评估以及用于时间步进器的Jacobian矩阵汇编例程,这些例程将集成半离散的PDE。我将使用PETSc,因此,如果有PETSc特定的内容,那么除了更通用的测试框架之外,这也将有所帮助。 澄清度编辑: 一个示例将在中${PETSC_DIR}/src/ts/examples/tutorials/ex2.c,在该示例中,我想测试类似的内容RHSFunction(右侧函数评估),然后RHSJacobian(雅可比矩阵评估)。我将针对组装好的右侧和组装好的Jacobian矩阵的已知值进行测试;对于一些简单的问题实例,我可以通过分析获得这些值。这些函数是特定于应用程序的函数,不会执行任何其他应用程序级函数,但是如果在函数内完成矢量或矩阵汇编,则可以调用MPI(如上面的链接PETSc示例中所示)。如果我编写的函数仅计算处理器局部的矢量或矩阵的部分,则我将尽可能对全局汇编版本进行测试,因为对于并行编程来说,这是我的第一次直观思考全局矢量和全局矩阵。这些测试将在较小的问题规模和少量的处理器上运行。 我可以想到一些实现此目的的策略: 根据我在该主题上所做的Google搜索,一种可能效果不佳的策略是构造一个已知的输出,并行找到相对/绝对误差,然后进行幼稚的比较。输出可能会出现乱码 -任何使用MPI编写“ Hello,world”程序的人都知道原因-这限制了进行单元测试的效用。(这是提出问题的动力。)在调用单元测试框架时,似乎还存在一些潜在的棘手问题。 写输出到文件(PETSc中,例如,使用VecView和MatView),和比较反对的东西,如已知的输出ndiff或numdiff。我从以前通过文件比较进行单元测试的经验中得到的这种方法的直觉是,它会很挑剔,并且需要进行一些过滤。但是,此方法似乎非常适合进行回归测试,因为我可以将上述实用程序替换为plain diff,而不必担心匹配文本格式。我已经收集到该策略或多或少是WolfgangBangerth和Andybauer所建议的。PETSc似乎也使用类似的方法进行某些测试。 使用单元测试框架,将所有信息收集到MPI等级为0的处理器上,并仅在处理器等级为0时要求它执行单元测试。我可以对规范做类似的事情(这种方式可能更容易),尽管需要权衡取舍就是返回的任何错误都会告诉我我的计算有问题,但是哪些元素没有错误。然后,我不必担心任何单元测试输出都会出现乱码。我只需要担心正确调用单元测试框架。当确切的解决方案可用时,PETSc似乎在其示例程序中使用基于规范的比较,但进行比较时,它不使用单元测试框架(也不必这样做)。

5
有限元矩阵稀疏结构的计算
问题:有哪些方法可以准确有效地计算有限元矩阵的稀疏结构? 信息:我正在使用Poerson压力方程求解器,使用Galerkin方法和二次Lagrange基础(用C编写),并使用PETSc进行稀疏矩阵存储和KSP例程。为了有效地使用PETSc,我需要为全局刚度矩阵预先分配内存。 目前,我正在做一个模拟程序集,以估计每行非零的数量,如下所示(伪代码) int nnz[global_dim] for E=1 to NUM_ELTS for i=1 to 6 gi = global index of i if node gi is free for j=1 to 6 gj = global index of j if node gj is free nnz[i]++ 但是,这会高估nnz,因为某些节点之间的交互可能会在多个元素中发生。 我已经考虑过尝试跟踪发现的i,j交互,但是我不确定如何在不使用大量内存的情况下执行此操作。我还可以遍历节点,并找到以该节点为中心的基本功能的支持,但是随后我必须搜索每个节点的所有元素,这似乎效率很低。 我发现了这个最近的问题,其中包含一些有用的信息,特别是来自Stefano M的,他写了 我的建议是应用一些图论概念,以python或C语言实现它,即将矩阵中的元素视为图的边并计算邻接矩阵的稀疏结构。列表列表或键字典是常见的选择。 我正在寻找有关此的更多详细信息和资源。我承认我不太了解图论,而且我对所有可能有用的CS技巧都不熟悉(我从数学的角度出发)。 谢谢!

2
对于不确定的对称系统,我应该使用PETSc中的哪些预处理器(和求解器)?
我的系统是带有拉格朗日乘子的对称有限元问题(例如不可压缩的斯托克斯流): (ABBTC)(ABTBC)\begin{pmatrix}A & B^T \\ B & C\end{pmatrix} 其中是典型情况(我什至已确保方程式已编号,以便拉格朗日乘数出现在最后)。该系统非常大(+ 100k行)。C=0C=0C = 0 阅读了这个问题的答案后,给我的印象是,有合适的预处理器可用于混合有限元问题。 -ksp_type minres -pc_type none -mat_type sbaij尽管精度不高(使用线性问题会导致多次牛顿迭代),但我使用PETSc设法用MINRES()解决了系统。预调节器和ksp-solver的其他组合似乎没有用。 是否有PETSc标志的组合可以比仅使用MINRES更快地解决此系统?

3
适用于许多右侧的稀疏线性求解器
我需要用多个右侧(300至1000)来解决相同的稀疏线性系统(300x300至1000x1000)。除了第一个问题外,我还想解决不同的系统,但是具有相同的非零元素(只是不同的值),那就是许多稀疏系统具有恒定的稀疏性模式。我的矩阵是不确定的。 分解和初始化的性能并不重要,但是求解阶段的性能很重要。目前,我正在考虑使用PaStiX或Umfpack,并且我可能会使用Petsc(支持这两个求解器)是否有能够利用我的特定需求(向量化,多线程)的库,或者我应该依赖于通用求解器?也许根据我的需要对其进行一些修改? 如果稀疏矩阵大到怎么办?106× 106106×10610^6 \times 10^6


2
如何在科学程序中使用Fortran中的函数指针
这是C中函数指针的典型用法。我想在Fortran中做类似的事情。我有一些想法,但是我想知道是否有一些规范的方法可以做到。 用户传递的函数指针和上下文将被存储,然后在以后调用。 typedef PetscErrorCode (*TSIFunction)(TS,PetscReal,Vec,Vec,Vec,void*); PetscErrorCode TSSetIFunction(TS ts,Vec res,TSIFunction f,void *ctx); 在以后的不同时间使用他们的上下文来回调用户的功能。 在PETSc中,它们也大量使用字符串->函数指针表。一切都是插件,因此用户可以注册自己的实现,并且是一流的。 #define PCGAMG "gamg" PCRegisterDynamic(PCGAMG ,path,"PCCreate_GAMG",PCCreate_GAMG); 这会将创建例程注册在“ FList”中,然后PCSetFromOptions()可以选择此方法,而不是其他任何选择。如果系统支持动态加载,则可以跳过对PCCreate_GAMG符号的编译时依赖性,而只传递NULL,则将在运行时在共享库中查找该符号。 请注意,这一步骤超出了“工厂”的范围,它是一种类似于马丁·福勒(Martin Fowler)称之为“服务定位器”的控制设备的倒置。 注意:这是在我与杰德·布朗的私人通信中提出的,他在那儿向我提出了这个问题。我决定将其外包,看看人们能提出什么答案。
11 petsc  fortran 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.