Questions tagged «software»

有关为科学或数值计算而设计或非常适合的库和独立软件的问题。

6
如果需要专有库,进行可重复研究的最佳方法是什么?
可重复进行的计算研究旨在使计算论文中生成结果所需的代码可供其他研究人员使用,以便他们可以运行此代码以在该论文中复制结果。我想提出我的研究可重复的,但我快到有点障碍的:一对夫妇的论文,我就利用工作的内部自动分化包(称为DAEPACK一种专有库)(CHEMKIN- II;许可条款不清楚)。 用开源版本替换这些软件组件将非常耗时。已经存在CHEMKIN-II的开源替代品,名为Cantera,但Cantera使用C ++,而CHEMKIN-II使用Fortran77。这将需要大量的精力来修改足够的Cantera代码,以便可以自动处理它。 C ++的差异化工具。 鉴于我需要这些专有软件包,假设研究人员可能无法使用CHEMKIN-II,那么使我的研究尽可能可重复的最佳方法是什么?由于DAEPACK是一个源到源的翻译器,因此我不必分发DAEPACK。我也许可以包含其输出,该输出将是计算派生的Fortran源文件。 更一般而言,如果您在工作中需要专有软件,并且专有软件不广泛使用(例如,MATLAB,Mathematica等不是),那么如何使您的工作可再现?

6
如何编写尺寸无关的代码?
我经常发现自己为给定操作/算法的一维,二维和三维版本编写了非常相似的代码。维护所有这些版本可能会变得乏味。简单的代码生成效果很好,但是似乎认为必须有更好的方法。 有没有一种相对简单的方法可以一次编写一个操作并将其推广到更高或更低的维度? 一个具体的例子是:假设我需要计算频谱空间中速度场的梯度。在三个方面,Fortran循环看起来像: do k = 1, n do j = 1, n do i = 1, n phi(i,j,k) = ddx(i)*u(i,j,k) + ddx(j)*v(i,j,k) + ddx(k)*w(i,j,k) end do end do end do 其中ddx阵列被适当地限定。(也可以使用矩阵乘法来执行此操作。)二维流的代码几乎完全相同,除了:第三维从循环,索引和组件数中删除。有没有更好的表达方式? 另一个例子是:假设我在三维网格上逐点定义了流体速度。为了将速度插值到任意位置(即不对应于网格点),可以在所有三个维度上连续使用一维Neville算法(即降维)。给定简单算法的一维实现,是否存在一种简单的方法来进行降维?

5
科学计算和HPC中Mac OS的状态
回顾OS X的曙光,至少在Mac世界中(当时我还远远没有到达科学计算领域),似乎有很多关于Mac OS作为科学计算和HPC应用程序平台的喧嚣。 XGrid开箱即用,Virginia Tech有他们花哨的基于Mac的计算集群,Stanford在做很棒的事情,等等。 但是最近,情况一直很安静。Macresearch.org网站本质上是一个充满垃圾邮件僵尸的幽灵小镇,XServe已死,而且大量的营销文献等似乎都来自英特尔之前的处理器领域。但是XGrid仍然存在,整个* nix OS的基础就在那里,并且该平台似乎在Python,R和某些更新的语言中得到了不错的支持。 那么,从比我更了解这件事的人那里... OS X的价格如何?它们是可行的用于科学计算的客户端计算机吗?正在将它们用作服务器/集群/等。通过XGrid或类似的东西仅仅是一个新颖的应用程序?
17 software  hpc 

5
有没有一个好的,易于使用的高质量开源CFD求解器?
我的论文是研究燃烧模型简化的数值方法。我的方法纯粹是在燃烧模拟的化学部分上运行的,并且我有大量的0D模拟案例研究(无流量)。我想要的是运行确实包含模拟的模拟,最好是2-D或3-D模拟。 由于计算量大,因此这些仿真需要并行进行。我还需要一些可以与化学求解器(例如Chemkin或Cantera)交互的东西,我已经有了它们的源代码。(Chemkin在Fortran 77中,而Cantera在C ++中。) 在理想情况下,我可以使用我在grad程序和一些CFD软件包中获得的流体力学基础知识来指定一种流动模式,添加化学成分并运行它。如果需要的话,我可以根据前合作者使用的实验设置,为简单的案例研究建立控制流体运动和化学反应的方程式,但是我非常希望不要滚动自己的CFD代码,除非有一个或多个非常容易实现的软件包。我愿意花2-3周的时间;我不知道此要求是否排除了PETSc或Trilinos。如果我不得不花更多的时间,我宁愿推迟到以后再做,因为我有一个合作者也提供CFD代码用于案例研究。 有没有人有使用CFD软件包或编写CFD代码的经验,如果有,您可以推荐一个吗?我知道我想使用的一件事是Strang拆分,但是我不是CFD或PDE专家。我研究化学和模型还原的数值方法。另外,请评论您使用推荐的软件花了多长时间才能上手。 @FrenchKheldar很好地指出了我要解决的问题的特征: 理想(完美)气体,单相 可压缩 层流必不可少;湍流优先。(我从CFD数值方法的先前工作中了解了一些湍流,但是我还没有从事CFD求解器的工作;我只对物理学有一点了解。) 零马赫数公式是可以的(我不在乎冲击或超音速流动) 燃烧化学,忽略Soret和Dufour的通量,并将扩散视为Fickian 几何可以很简单 我可以编写接口代码,尽管我写的越少越好。@FrenchKheldar还指出Cantera具有Fortran和Python绑定。我现在使用Cantera Python绑定进行快速原型制作,因此我也对这些感到满意。


4
为了使读者可以清楚地将结果与生成结果的代码相匹配,最有用的方法是为论文编写代码?
我正在写一篇可复制的论文,该论文具有由Python脚本生成的计算结果(类似的MATLAB脚本生成几乎相同的结果)。我认为,如果读者可以将论文中的计算结果与代码中的计算结果相匹配,则读者会更容易理解本文。该工作提出了一种抽象的形式主义,并且本文中的示例应使这种形式主义对读者(其中很多是工程师)更加具体。该代码可能是有关如何执行计算的最详细记录,并且将其弄清楚可以在审核过程中为我们提供帮助。 是否有人对如何使代码与计算结果(数字,方程式)之间的对应关系更清晰有任何建议? 例如,我当时在想实现本文中各个步骤的代码行,我可以引用方程式编号(如果我可以在代码和LaTeX之间进行交叉引用,那真是太神奇了,但是手动标记它们就可以了) ,我可以编写与各种示例和图相对应的函数,例如 def example_1(): # Insert code corresponding to first example pass def figure_1(): # Insert code that generates Figure 1 pass 如果代码很大,而我并不想解释工程中使用的一堆不同的数学方法实际上是如何相同的,那么我可能不会很费心地使代码清晰明了,但是鉴于代码的抽象性质本文和少量的代码基础,似乎在此练习中可能有价值。

4
什么是解决混合整数编程问题的最快软件(开源)
我有一个混合整数编程问题。我目前正在使用GLPK作为我的求解器。但是我发现GLPK可以很好地解决线性编程问题,但是对于混合整数编程,它需要更长的时间,因此不符合我们的要求。我正在寻找其他软件。还有其他好的开源工具可以快速解决混合整数编程问题吗?谢谢!

5
科学软件应优化多少?
对于需要大量计算资源的应用程序,高性能是在合理的时间内提供科学结果或实现“突破”的关键因素。 软件开发人员应该花多少时间和精力来优化应用程序?使用的关键标准是什么?
13 software  hpc 

5
寻找可贡献的开源项目
这个问题已经在Stackoverflow上问了十亿次,但是始终把重点放在非数值编码上。我正在寻找一个在数值计算和高性能计算的范围内做出贡献的项目。理想情况下,我希望有一个小项目,但这不是必需的。 参与与SciComp相关的开源项目的最佳方法是什么?从哪里开始寻找项目?进入这样一个项目的最佳方法是什么?功能请求/错误/文档或其他? 看着ATLAS或Nix之类的东西,您如何从N00B变为活跃状态?
13 software 

1
科学图书馆应如何报告错误?
在不同的软件工程学科中,有很多关于库应如何处理错误或其他特殊情况的哲学。我见过的一些: 返回一个错误代码,其结果由指针参数返回。这就是PETSc所做的。 通过哨兵值返回错误。例如,如果malloc无法分配内存,sqrt则返回NULL;如果传递负数,则将返回NaN,等等。此方法在许多libc函数中使用。 抛出异常。用于Deal.II,Trilinos等 返回变量类型;例如一个C + +函数,Result如果它运行正确并返回类型的对象,并使用类型Error描述其失败的方式将返回std::variant<Error, Result>。 使用断言和崩溃。用于p4est和igraph的某些部分。 每种方法的问题: 检查每个错误都会引入很多额外的代码。必须始终先声明将结果存储到的值,这会引入大量只能使用一次的临时变量。这种方法解释了发生了什么错误,但是很难确定为什么要进行深度调用堆栈,在哪里。 错误情况很容易忽略。最重要的是,如果整个输出类型范围都是合理的结果,那么许多函数甚至都没有有意义的前哨值。许多与#1相同的问题。 仅适用于C ++,Python等,不适用于C或Fortran。可以使用setjmp / longjmp巫术或libunwind在C中进行模仿。 仅在C ++,Rust,OCaml等中可用,而在C或Fortran中则不可用。可以使用宏魔术在C语言中模仿。 可以说是最有用的。但是,如果将这种方法用于一个C库,然后为该C库编写Python包装器,那么一个愚蠢的错误(例如将越界索引传递给数组)将使Python解释器崩溃。 互联网上有关错误处理的许多建议都是从操作系统,嵌入式开发或Web应用程序的角度编写的。崩溃是不可接受的,您必须担心安全性。科学应用程序几乎完全没有这些问题。 另一个要考虑的是什么类型的错误是可以恢复的。malloc失败是无法恢复的,并且在任何情况下,操作系统内存不足杀手都会先解决它。数组大小超出范围的索引也无法恢复。对于作为用户的我来说,库可以做的最好的事情就是崩溃,并显示一条信息丰富的错误消息。另一方面,可以通过使用直接因式分解求解器来解决迭代线性求解器收敛的失败。 科学图书馆应如何报告错误并期望对其进行处理? 我当然知道这取决于实现该库所使用的语言。但是据我所知,对于任何足够有用的库,人们都希望从某种语言(而不是其所使用的一种语言)来调用它。 顺便说一句,我认为如果C语言库将全局声明处理程序函数指针定义为公共API的一部分,则可以大大改善C语言库的方法#5。断言处理程序将默认报告文件/行号并崩溃。该库的C ++绑定将定义一个新的断言处理程序,该处理程序将引发C ++异常。同样,Python绑定将定义一个声明处理程序,该处理程序使用CPython API引发Python异常。但我不知道采用这种方法的任何示例。
11 software 

2
科学计算中复杂算术的危险
复杂的内积具有由惯例决定两个不同的定义:ˉ Ù Ť v或ü Ť ˉ v。在BLAS中,我找到了例程cdotu,zdotu和cdotc,zdotc。前两个例程实际上计算u T v(伪内积!),而后两个例程将内积中的第一个向量共轭。另外,通过任一定义(共轭Ù或v),⟨ ü ,v ⟩ = ¯ ⟨ v ,ù ⟩⟨ ü ,v ⟩⟨u,v⟩\langle u,v\rangleü¯Ťvu¯Tv\bar{u}^TvüŤv¯uTv¯u^T\bar{v}üŤvuTvu^Tvüuuvvv⟨ ü ,v ⟩ = ⟨ v ,ù ⟩¯¯¯¯¯¯¯¯¯¯¯⟨u,v⟩=⟨v,u⟩¯\langle u,v\rangle=\overline{\langle v,u\rangle}与共轭!此外,正如评论中指出的那样,为多值复杂函数选择主要值可能取决于惯例。 我的问题是:这种复杂性是否会导致在科学计算中使用复杂算术的真正危险?Deal.ii的作者强调了这个问题,他们建议始终将复数分为实数部分和虚数部分,并且仅使用实数算法。但是我从来没有发现拆分方法很方便。例如,考虑时谐麦克斯韦方程的PML。 在大多数开源FEM软件中,除FreeFem ++和libmesh之外,似乎都普遍担心使用复数。但是,即使有两个例外,复杂算法的测试也比实数少。 我的最后一个问题是:我们是否应该始终避免使用复数?

1
有人在计算科学研究中使用软件估算方法吗?
在工作中,我基本上是一名独立顾问。对于管理人员和客户,我需要估计开发软件所需的时间,这是我的计算科学研究的一部分。但是,我的时间估计通常不正确。我知道有一些方法可以估算开发软件所需的时间。这些方法会为我提供有关研究任务的准确估计吗?它们甚至在研究环境中有用吗?如果不是,是否有比“保留记录并相应地修改估算值”更好的方法?
11 software 

5
增加代码的归档寿命
是否有已发布的最佳实践清单,以确保代码的使用寿命,并着眼于可重复的科学结果?(例如,开源,文档做法,选择依赖项,选择语言,虚拟机等)。 了解任何试图估计典型科学代码或其他软件的半衰期的研究(或缺乏示例/注释)(如果这是一个合理的问题?)

1
对于提交给ACM TOMS的软件,ACM软件许可协议如何与其他许可交互?
该杂志对数学软件(TOMS ACM)计算机械协会事务上发布的数值算法,其中包括软件实现多篇。根据他们的编辑策略,提交算法论文包括该论文中描述的算法实现的源代码。此源代码受ACM软件版权和许可协议的约束。 由于我有兴趣发布自己作品的软件实现,因此我担心此许可证的法律含义。具体来说,该软件许可证如何与常见的开源许可证(例如GPLv3,BSD,MIT / X11和Apache许可证)交互?

2
科学计算中基于任务的共享内存并行库
近年来,出现了一些库/软件项目,它们提供了某种形式的通用数据驱动的共享内存并行性。 主要思想是,程序员无需编写显式的线程代码,而是将其算法实现为相互依赖的任务,然后由共享内存计算机上的通用中间件动态调度这些任务。 此类库的示例是: 夸克:最初是为MAGMA并行线性代数库设计的,似乎也已用于并行快速多极子方法。 Cilk:最初是一个基于MIT的项目,现在得到了Intel的支持,实现为C的语言/编译器扩展,用于Cilkchess计算机国际象棋软件以及FFTW中。 SMP superscalar:在巴塞罗那超级计算中心开发,基于#pragma扩展在很多方面类似于Cilk 。 StarPU:基于类似库的“小代码”,可以针对几种不同的体系结构(包括GPU)进行编译和调度。 OpenMP任务:从3.0版开始,OpenMP引入了可以异步调度的“任务”(请参阅​​规范的2.7节)。 英特尔的线程构建基块:使用C ++类创建和启动异步任务,请参阅教程的第11节。 OpenCL:在多核上支持基于任务的并行性。 尽管有很多文献描述了这些库/语言扩展的内部工作方式以及它们在特定问题上的应用,但我仅遇到了很少的例子将它们用于科学计算应用中。 所以这是一个问题:是否有人知道使用这些库/语言扩展中的任何一个或类似的用于共享内存并行性的科学计算代码?

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.