计算科学

科学家使用计算机解决科学问题的问答

1
具有近似数值导数的Newton-Raphson近似的缺点
假设我有一些功能fff,我想找到xxx这样f(x)≈0f(x)≈0f(x)\approx 0。我可能会使用Newton-Raphson方法。但这要求我知道导数函数f′(x)f′(x)f'(x)。的解析表达式fff可能不可用。例如,fff可以由查阅实验值数据库的复杂计算机代码段定义。 但即使f′f′f'是复杂的,我可以近似f′(a)f′(a)f'(a)针对任何特定aaa通过选择少数ϵϵ\epsilon和calculting f′(a)≈f(a+ϵ)−f(a)ϵf′(a)≈f(a+ϵ)−f(a)ϵf'(a) \approx {f(a+\epsilon) - f(a)\over\epsilon}。 我听说这种方法有明显的缺点,但我不知道它们是什么。维基百科暗示:“使用这种近似将导致像割线法那样的收敛速度比牛顿法慢的事情。” 有人可以对此进行详细说明,并提供特别讨论该技术问题的参考吗?


5
如何解决数值非关联性以进行并行约简?
并行归约假设相应的操作是关联的。添加浮点数违反了该假设。您可能会问为什么我对此很在意。好吧,它使结果的再现性较差。当使用模拟退火来优化(或拟合参数)子程序时,情况变得更糟,从而产生不可再现的结果。 解决此问题的常用方法是什么?关于以下策略可以说些什么? 不在乎不可复制性。 不要对浮点数和加法运算使用并行约简。 以可复制的方式创建适当大小的工作包,并手动进行最终缩减。 使用更高的精度进行添加(但并非所有编译器都提供更高精度的浮点类型)。

2
CFD模拟常用离散化方案的缺点
前几天,我的计算流体力学讲师不在了,他派了他的博士候选人代替他。在他的演讲中,他似乎指出了与流体流动模拟的各种离散化方案相关的几个缺点: 有限差分法: 很难满足守恒性并申请不规则几何形状 有限体积法: 它倾向于偏向边缘和一维物理。 有限元法:使用有限元法 很难求解双曲方程。 间断的Galerkin: 这是世界上最好的(也是最糟糕的)。 波动分割: 它们尚未广泛应用。 演讲结束后,我尝试问他从哪里得到这些信息,但他没有说明任何消息来源。我还试图让他澄清DG是“世界上最好的和最坏的”的意思,但无法给出明确的答案。我只能假设他是根据自己的经验得出这些结论的。 根据我自己的经验,我只能验证关于FDM难以应用于不规则几何的第一个说法。对于所有其他索赔,我没有足够的经验来验证它们。我很好奇这些所谓的“缺点”对于CFD模拟的准确性如何。

5
寻找平滑,有界,非凸的2D函数的全局最小值,该最小值估计成本很高
我有一个有界的非凸二维函数,我想找到它的最小值。功能相当流畅。评估成本很高。每个轴上可接受的误差约为功能域的3%。 我尝试在NLOPT库中运行DIRECT算法的实现,但是就所需精度所需的功能评估数量而言,它没有在蛮力搜索上带来可观的改进,并且存在一些异常值。 我应该考虑其他哪些全局优化求解器?

6
使用C ++模板的泛型和元编程在计算科学上有多大用处?
C ++语言通过模板提供通用的编程和元编程。这些技术已进入许多大型科学计算程序包(例如MPQC,LAMMPS,CGAL,Trilinos)。但是,它们在整体开发时间和可用性上是否具有相等或充分的效率,它们实际上对科学计算做出了哪些贡献,这些价值超出了诸如C或Fortran之类的非通用,非元语言。 给定科学计算任务,通过C ++模板进行的通用和元编程是否已证明通过任何易于理解的基准(代码行,人工工作等)衡量的生产率,表达力或可用性方面的改进?相应地,将C ++模板用于通用编程和元编程会带来哪些风险?

4
便携式多核/ NUMA内存分配/初始化最佳实践
当在共享内存环境(例如,通过OpenMP,Pthreads或TBB进行线程化)中执行内存带宽受限的计算时,将存在一个难题,即如何确保内存在物理内存之间正确分配,以使每个线程大部分访问内存中的内存。 “本地”内存总线。尽管接口不是可移植的,但是大多数操作系统都有设置线程相似性的方法(例如,pthread_setaffinity_np()在许多POSIX系统,sched_setaffinity()Linux,SetThreadAffinityMask()Windows上)。还有诸如hwloc之类的库,用于确定内存层次结构,但是不幸的是,大多数操作系统尚未提供设置NUMA内存策略的方法。Linux是一个明显的例外,libnuma允许应用程序以页面粒度操作内存策略和页面迁移(自2004年以来一直在主流中使用,因此已广泛使用)。其他操作系统希望用户遵守隐式的“首次触摸”策略。 使用“首次触摸”策略意味着调用者应在首次写入新分配的内存时以他们打算在以后使用的相似性来创建和分发线程。(很少有系统配置为malloc()实际上可以找到页面,它只是承诺在页面实际出现故障时(可能是由不同的线程)找到它们。)这意味着使用分配calloc()或在分配使用之后立即初始化内存memset()是有害的,因为它易于出错将所有内存分配到运行分配线程的核心的内存总线上,从而导致从多个线程访问内存时出现最坏情况的内存带宽。同样适用于new坚持初始化许多新分配的C ++ 运算符(例如std::complex)。关于此环境的一些观察结果: 可以将分配设为“线程集合”,但是现在分配混入了线程模型,这对于可能不得不使用不同线程模型(也许每个都有自己的线程池)与客户端进行交互的库来说是不希望的。 RAII被认为是惯用C ++的重要组成部分,但它似乎对NUMA环境中的内存性能有积极的危害。new可以将布局与通过malloc()或从中分配的例程一起使用libnuma,但这会改变分配过程(我认为这是必要的)。 编辑:我之前有关运算符的声明new不正确,它可以支持多个参数,请参阅Chetan的回复。我相信仍然需要让库或STL容器使用指定的相似性。可能会打包多个字段,并且可能不方便确保例如std::vector在激活正确的上下文管理器的情况下进行重新分配。 每个线程都可以分配并分配其自己的私有内存,但是将它们索引到相邻区域会更加复杂。(考虑一个稀疏的矩阵向量乘积,其中矩阵和向量按行划分;索引x的未拥有部分时,如果x在虚拟内存中不连续,则需要更复杂的数据结构。)ÿ← A xÿ←一种Xy \gets A xXXxXXx 是否认为NUMA分配/初始化的任何解决方案都是惯用的?我是否遗漏了其他关键陷阱? (我并不是说我的C ++示例暗示要强调该语言,但是C ++ 语言编码了一些有关内存管理的决定,而C之类的语言则没有这样做,因此在建议C ++程序员这样做时往往会有更大的阻力情况有所不同。)

8
是否有任何开源或易于访问的软件可以简化
我总是用手来计算,但现在我的同志们变得烦人,并且进行了很多重复的练习,其中涉及的只是像上面的表达式那样插入东西。我对诸如Python或R之类的简化此类方程式的开源软件特别感兴趣。我尝试使用Wolfram Alpha,但未成功。哪些开源软件包能够替代表达式入方程x 2 +2x+3并简化结果?具体来说,我正在寻找具有类似命令之类的软件包。x=2–√t−1x=2t−1x=\sqrt{2}t-1x2+2x+3x2+2x+3x^{2}+2x+3simplify

5
数值结果数据库
在数值方法文献中,许多研究论文包括对新算法变异的描述,然后是将新方法与一种或两种现有方法进行比较的一些测试问题。这使得很难确定 新方法将如何处理其他感兴趣的问题 新方法与其他现有方法的比较 当然,这两个问题对于决定是否采用新方法的人通常都是至关重要的。为了改善这种情况,似乎希望尽可能使人们用他们的方法运行大量测试问题(请参阅此问题),并将结果分类在数据库中,以便与其他方法进行比较。然后,科学家或工程师可以查询数据库,也许表明哪些解决方案/问题特征对其最重要(准确性,效率,定性性质等),并可以对数据库中所有方法的性能进行定量比较。 我意识到实现此想法有很多困难(主要是:让人们实际解决所有这些问题,并衡量计算成本)。但是我的问题是:是否存在这样的结果数据库?(例如在某些特定的子字段中)还是在任何地方都采用了这种方法? 到目前为止发布的两个答案都与问题数据库有关。我在问结果数据库。
17 pde  testing 

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

4
刚性ODE系统的定义
考虑ODE系统的IVP,。最常见的是这个问题被认为是刚性的,当雅可比矩阵有两个非常大的负实部的特征值和特征值非常小的负实部(我认为只有稳定案件)。y′=f(x,y)y′=f(x,y)y'=f(x,y)y(x0)=y0y(x0)=y0y(x_0)=y_0∂f∂y(x0,y0)∂f∂y(x0,y0)\frac{\partial f}{\partial y}(x_0,y_0) 在另一方面,在只有一个方程的情况下,例如普罗瑟罗-罗宾逊方程y′=λy+g′+λgy′=λy+g′+λgy'=\lambda y + g'+\lambda g,它被称为硬当λ≪−1λ≪−1\lambda\ll -1。 所以有两个问题: 为什么ODE系统的刚度定义中包含小的特征值?我相信,仅存在非常大的负实部就足以使系统变得僵硬,因为这使我们对明确的方法使用了很小的时间步长。 是的,我知道最常见的刚性问题(例如,由抛物线形偏微分方程引起的)的特征值的确很大。因此,第二个问题是:是否有一个很好的自然例子,说明大型刚性系统没有非常小的特征值(或者具有适度的)?λmax/λminλmax/λmin\lambda_{\max}/\lambda_{\min} 好,让我们修改问题。考虑两个二维线性ODE系统:第一个具有特征值{-1000000,-0.00000001},第二个具有{-1000000,-999999}。对我来说,他们都很僵硬。但是,如果我们考虑刚度比定义,则第二个系统就没有。主要问题:为什么完全考虑刚度比? 问题的第二部分仍然很重要,换句话说:我正在寻找一个具有大的负特征值和适度的刚度比(不大于100)的“自然”大型ODE系统。
17 ode  stiffness 

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绑定进行快速原型制作,因此我也对这些感到满意。


3
具有HPC资源的桌面软件,用于处理后端号码
我们的工作组将生成一个桌面应用程序,该应用程序可模拟建筑的能源绩效。它是一个.NET应用程序,当用户运行大量仿真时,它们可能会非常耗时。这些模拟是完全可并行的,并且我们在“办公室”中拥有一些非常重要的HPC计算资源。 我们拥有的一个想法是允许用户卸载我们知道将运行很长时间的模拟(而每个单独的模拟运行大约30-120秒,运行大量的模拟可能需要几天的时间)。有人做过吗?如果是这样,您是否使用任何库来简化工作?值得付出努力吗? 编辑添加: 用于卸载模拟的各个任务是 打包文件(约5Mb), 将其上传到我们的服务器, 将包分解为单独的模拟(每个过程大约需要30-120秒,并且可以完全并行化),模拟的数量取决于用户选择的选项数量(绝缘,建筑物方向等)和最差的选择情况每个可能的选项都会导致大约1E50仿真。未知运行100到〜1E5仿真,但是大多数用户运行的数量少于10。 重新组装完成的仿真并下载更大的文件。 我们不确定要使用什么界面,因为我们的小组对此并不陌生,并且由于削减了预算,它可能会及时完成,但是需要易于其他人(如果有)进行维护。 该应用程序已经使用.NET 4,并且可以扩展为使用用户拥有的所有内核(我们的开发机具有8个内核)。
17 hpc  partitioning 

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.