计算科学

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

2
在Stokes方程中施加混合有限元方法的相容条件
\newcommand{\v}[1]{\boldsymbol{#1}} 假设我们有以下斯托克斯流模型方程: ,其中粘度ν(x)是一个函数,对于标准的混合有限元,假设我们使用稳定对:Crouzeix-Raviart空间Vh表示速度u,元素方向恒定空间Sh表示压力p,我们有以下变体形式:{ − d i v(ν∇ ù )+ ∇ pd 我v ü= f= 0{−div(ν∇u)+∇p=fdivu=0 \tag{1} \left\{ \begin{aligned} -\mathrm{div}(\nu \nabla \v{u}) + \nabla p &= \v{f} \\ \mathrm{div} \v{u} &= 0 \end{aligned} \right.ν(x )ν(x)\nu(x)VHVh\v{V}_huu\v{u}ShShS_hppp L([u,p],[v,q])=∫Ων∇u:∇v−∫Ωqdivu−∫Ωpdivv=∫Ωf⋅v∀v×q∈Vh×ShL([u,p],[v,q])=∫Ων∇u:∇v−∫Ωqdivu−∫Ωpdivv=∫Ωf⋅v∀v×q∈Vh×Sh \mathcal{L}([\v{u},p],[\v{v},q]) = \int_{\Omega} \nu \nabla\v{u}:\nabla \v{v} -\int_{\Omega} q\mathrm{div} \v{u} -\int_{\Omega} p\mathrm{div} \v{v} =\int_{\Omega} \v{f}\cdot \v{v} …

4
在浮点算术中,为什么数字不精确度是通过将一个小项与一个大项之差相加而导致的?
我一直在阅读Allen和Tildesley撰写的《液体的计算机模拟》一书。从第71页开始,作者讨论了用于将牛顿运动方程式集成到分子动力学(MD)模拟中的各种算法。从第78页开始,作者讨论了Verlet算法,这也许是MD中的规范集成算法。他们声明: 也许最广泛使用的积分运动方程的方法是Verlet(1967)最初采用并归因于Stormer(Gear 1971)的方法。此方法的第二阶方程的直接溶液。该方法是基于志愿服务岗位- [R (吨),加速度一个(吨),以及位置- [R (吨- δ 吨)从前面的步骤。推进位置的等式如下:米一世[R¨一世= f一世mir¨i=fim_i \ddot{\textbf{r}}_i = \textbf{f}_i[R (吨)r(t)\textbf{r}(t)a(吨)a(t)\textbf{a}(t)[R(吨-δŤ )r(t−δt)\textbf{r}(t - \delta t) r(t+δ吨)= 2 - [R (吨)- [R (吨- δt )+ δŤ2一个(t)。(3.14)(3.14)r(t+δt)=2r(t)−r(t−δt)+δt2a(t).\tag{3.14}\textbf{r}(t + \delta t) = 2\textbf{r}(t) - \textbf{r}(t - \delta t) + \delta t^2 \textbf{a}(t). 关于eqn(3.14),有几点要注意。可以看出,速度根本没有出现。通过添加关于泰勒展开式获得的方程式已消除了它们:[R (吨)r(t)\textbf{r}(t) r(t+δt )= r(t )+ δ吨v(吨)+ (1 …

3
存储分层模拟数据的最佳实践
TL,DR 科学计算界中用于存储大量分层结构数据的最佳实践是什么?例如,SQL在大型稀疏矩阵上不能很好地发挥作用。是否有用于构建,仓储和分析此类数据的好工具?大型强子对撞机的人使用什么? 用例详细信息 我想根据以下层次结构存储蛋白质模拟中的数据: protein |__simulation conditions |____|__residues |____|____|__conformers |____|____|____|__atoms 每个蛋白质都应该知道其每个残基,每个原子都应该知道用于其模拟的条件,等等,反之亦然。 最初,我认为关系数据库将非常适合该应用程序,因此我使用python和sqlalchemey编写了一个程序,该程序将数据存储在SQL数据库中。但是实际上,该程序不能很好地运行。 最大的问题与以下事实有关:由于每个可能的构象体对之间的成对相互作用,在构象体数据级别存在一个N x N矩阵,该矩阵存储势能。矩阵中的大多数条目都是零,因此我以一种稀疏格式将矩阵存储在数据库中的另一个表中,每个条目一行。不幸的是,对于涉及数千个conformer的模拟,成对表仍然以数十万行结尾,并且: a)构建和查询非常缓慢(几小时) b)与作为非稀疏矩阵的等效数据纯文本表示相比,我的硬盘驱动器占用了更多的数量级空间 c)在以下情况下占用了超过10 GB的内存:该表被读入内存 我的最终目标是在数据库中存储成千上万次运行(在几十种模拟条件下源自数千种蛋白质),以便可以一起分析所有运行。这意味着代表成对矩阵的表可能会增长到大约十亿行。目前看来,我需要一个Cray或其他共享内存的怪物,以便甚至对该数据库运行单个查询。 我在这里有更好的选择吗?大型强子对撞机的人使用什么?

5
使用类封装数值算法的固有优点和缺点是什么?
科学计算中使用的许多算法与通常在数学运算强度较低的软件工程形式中通常考虑的算法具有不同的固有结构。特别是,个别的数学算法往往非常复杂,通常涉及成百上千的代码行,但是却不涉及任何状态(即不作用于复杂的数据结构),并且通常可以归结为编程语言。接口-作用于一个或多个数组的单个函数。 这表明函数(而不是类)是科学计算中遇到的大多数算法的自然接口。但是,该论点对于如何处理复杂的多部分算法的实现并没有多大见解。 尽管传统方法只是简单地拥有一个调用多个其他函数的函数,并沿途传递相关参数,但是OOP提供了另一种方法,其中算法可以封装为类。为了清楚起见,通过将算法封装在类中,我的意思是创建一个类,在该类中将算法输入输入到类构造函数中,然后调用一个公共方法来实际调用该算法。C ++ psuedocode中的这种多重网格实现可能看起来像: class multigrid { private: x_, b_ [grid structure] restrict(...) interpolate(...) relax(...) public: multigrid(x,b) : x_(x), b_(b) { } run() } multigrid::run() { [call restrict, interpolate, relax, etc.] } 那么我的问题如下:与没有班级的更传统的方法相比,这种做法的利弊是什么?是否存在可扩展性或可维护性问题?明确地说,我并不是要征求意见,而是要更好地理解采用这种编码实践的下游影响(即,直到代码库变得很大之前可能不会产生的影响)。
13 algorithms 

5
我如何近似不正确的积分?
我有一个函数使得∫ [R 3 ˚F (X ,ÿ ,Ž )d V 是有限的,我想接近这个积分。 F(x ,y,ž)f(x,y,z)f(x,y,z) ∫[R3F(x ,y,ž)dV∫R3f(x,y,z)dV\int_{R^3} f(x,y,z)dV 我对积分的正交规则和蒙特卡洛近似法很熟悉,但是在无限域中实现它们存在一些困难。在蒙特卡洛的情况下,如何去采样一个无限的区域(尤其是如果对积分有更大贡献的区域是未知的)?在正交情况下,如何找到最佳点?我是否应该简单地固定以原点为中心的任意大区域并应用稀疏正交规则?我怎样才能近似这个积分?


3
单浮点精度与双浮点精度
单精度浮点数占用一半的内存,在现代机器上(甚至在GPU上),使用它们进行运算的速度几乎是双精度浮点数的两倍。我发现许多FDTD代码专门使用单精度算术和存储。有什么经验可以解决使用单精度求解大型稀疏方程组的问题?我认为它必须在很大程度上取决于矩阵条件数。 此外,是否有任何有效的技术在必要时使用双精度,而在不需要双精度的情况下使用单精度。例如,我认为对于矩阵矢量乘法或矢量点积,将结果累加到双精度变量中(以避免抵消误差)可能是一个好主意,但是各个条目要彼此相乘可以使用单精度乘以 现代FPU是否无缝地允许从单精度(浮动)转换为双精度(双精度),反之亦然?还是这些昂贵的运营?

3
了解Numpy如何执行SVD
我一直在使用不同的方法来计算矩阵的秩和矩阵方程组的解。我遇到了功能linalg.svd。与我自己用高斯消除法求解系统的努力相比,它看起来既更快又更精确。我试图了解这是怎么可能的。 据我所知,linalg.svd函数使用QR算法来计算矩阵的特征值。我知道这在数学上是如何工作的,但是我不知道Numpy如何如此迅速地做到这一点而又不会损失太多精度。 所以我的问题是:numpy.svd函数如何工作,更具体地说,如何快速,准确地实现它(与高斯消去相比)?

4
在频谱规范枪战中(使用gcc,intel和其他编译器),C是否比Fortran慢?
结论如下: Fortran编译器真的好多少? gfortran和gcc对于简单的代码一样快。所以我想尝试一些更复杂的事情。我以频谱规范枪战为例。我首先预先计算2D矩阵A(:, :),然后计算范数。(我认为枪战决不允许这种解决方案。)我已经实现了Fortran和C版本。这是代码: https://github.com/certik/spectral_norm 最快的gfortran版本是Spectrum_norm2.f90和Spectrum_norm6.f90(一个使用Fortran的内置matmul和dot_product,另一个使用代码实现这两个功能-速度没有差异)。我能够编写的最快的C / C ++代码是Spectrum_norm7.cpp。从我的笔记本电脑上的git版本457d9d9开始的时间是: $ time ./spectral_norm6 5500 1.274224153 real 0m2.675s user 0m2.520s sys 0m0.132s $ time ./spectral_norm7 5500 1.274224153 real 0m2.871s user 0m2.724s sys 0m0.124s 因此,gfortran的版本要快一些。这是为什么?如果您使用更快的C实现发送请求请求(或仅粘贴代码),我将更新存储库。 在Fortran中,我传递了一个2D数组,而在CI中,则传递了一个1D数组。随意使用2D阵列或您认为合适的任何其他方式。 对于编译器,让我们比较一下gcc与gfortran,icc与ifort等。(与点选页面不同,点选页面比较了ifort和gcc。) 更新:使用版本179dae2,该版本在我的C版本中改进了matmul3(),它们现在速度一样快: $ time ./spectral_norm6 5500 1.274224153 real 0m2.669s user 0m2.500s sys 0m0.144s $ time ./spectral_norm7 5500 …
13 fortran  c 


1
有没有一种工具可以通过解析Fortran(或C)代码来生成Fortran(或C)函数的间隔扩展?
在我的博士学位论文中,案例研究要求我在CHEMKIN-II中有Fortran子例程的间隔扩展(对此表示歉意;这是我能从Sandia国家实验室不再分发的软件包中找到的最好的)。CHEMKIN-II是用于燃烧化学的化学软件包。因为它是燃烧中使用的标准包装,所以我不能(或者更愿意不使用)。 为了获得所需的间隔扩展,我一直使用内部开发的称为DAEPACK的工具。我以前使用的旧二进制文件能够生成我在32位OS(版本对应于gcc 2.95的libstdc版本)上所需的CHEMKIN-II子例程的所需间隔扩展,但是几年前就淘汰了的使用,这是一个巨大的考验(因为我必须找到我使用的所有其他软件的32位版本)。该软件包的源代码也是专有的,但是由于它最初是由MIT开发的,而我是在MIT工作的,因此我能够(经过大量的努力)获得DAEPACK的源代码。使用我拥有的源代码,我能够编译与64位版本的Linux兼容的DAEPACK版本以及与gcc 4.xx相对应的libstdc版本。但是,我怀疑此源代码已经过时,编译成无法成功生成我需要的区间扩展代码才能完成论文的可执行文件。我已与开发人员联系,以寻求他的修复源代码方面的帮助,但是从以前与开发人员的联系中,我知道如果他愿意的话,修复源代码将花费一些时间。 这是个大问题:我有6个月的时间才能毕业,因为我用光了资金。我不能依靠开发人员足够快地修复DAEPACK,而无法成功完成我的博士学位论文,而这正是你们的用武之地。 我需要执行以下操作的软件包: 生成间隔扩展,泰勒模型(使用间隔算法)以及几乎任意的Fortran 77代码的派生;我认为DAEPACK不能解析的唯一结构是DO循环和IF语句。由于我需要泰勒模型,因此代码还必须具有自动微分(AD)功能。 通过Fortran 77代码的源到源转换生成这些间隔扩展和Taylor模型(即,它像编译器一样解析源代码,以生成计算间隔扩展和Taylor模型的源代码)。 紧急情况下,我可以使用对C代码而不是Fortran 77代码执行上述两项操作的软件,然后将所有内容传递给f2c。我真的不喜欢这样,因为我不知道是否通过所有操作f2c都可以,但是我非常绝望。 你们可以帮助绝望的博士生吗? 在有时间限制的情况下,为了预料到一些可能的建议,以下是对我不起作用的方法: 努力使DAEPACK工作;相信我,我已经尝试过。而且我经常向开发人员投诉。 使用面向对象(或类似于对象的)方法计算区间扩展或泰勒模型的工具。我没有时间用新的类型重新编码CHEMKIN-II(或任何其他类似的大型库)。这个太大了。 使用除Fortran 77/90或C之外的任何其他语言。CHEMKIN-II代码位于Fortran中。我可以使用f2c,也可以根据需要使用CHEMKIN-II的基于Sandia的克隆TChem 将其转换为C。我以前的结果是使用CHEMKIN-II;我的新结果应该复制我的旧结果,并且我已经知道Cantera将不会根据案例研究和单元测试复制CHEMKIN-II的功能。此外,我之前的研究生对CHEMKIN-II源代码进行了一些不可思议的操作,以使区间运算特别有效。对于我来说,很难在其他任何软件包中复制它。

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

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

4
库功能的FLOP计数
当用一个简单的函数评估FLOP的数量时,通常只需按基本算术运算符就可以了。但是,在涉及偶数除法的数学语句的情况下,不能做到这一点,并且希望能够与仅具有加法和乘法功能的FLOP计数进行比较。当在库中执行该操作时,情况甚至更糟。因此,必须对特殊功能的性能有一些合理的认识。 通过特殊功能,我们的意思是: exp() sqrt() sin / cos / tan() 通常由系统库提供。 确定它们的复杂性的进一步困惑在于,它们中的许多是自适应的并且具有依赖于输入的复杂性。例如,exp()的数字稳定实现通常会自适应地重新缩放并使用查找。我最初的印象是,在这种情况下最好的方法是确定函数的平均行为。 当然,整个讨论高度依赖于体系结构。在此讨论中,我们可以将自己局限于传统的通用体系结构,并排除具有特殊功能单元(GPU等)的那些体系结构。 为了系统与系统之间的比较,人们可以找到相当简单的尝试来针对特定体系结构进行标准化,但是如果人们在乎方法与方法的性能,这是不可接受的。确定这些功能的FLOP复杂度的哪些方法被认为可以接受?有什么大陷阱吗?

5
C ++或Python用于开发CFD库
您会说两种为计算连续体力学编写通用(有限体积,fem,dg)库的方法的优缺点?这就是我现在所看到的,所以请提供您自己的经验,不要为我而发火:): 1)C ++: 通用编程,虚函数,重载,速度...:所有可用的genreic + OOP工具来构建您想要的任何东西 大部分都提供低级库(没有广泛的科学和工程库开发,例如Python开发的库) 2)用于并行计算的Python +包装器(pyOpenCL等) 大量的各种支持库 编码您的想法:实施非常快 执行时间较慢 如果您想编写一个支持各种方法,处理复杂几何图形和问题的框架,那么您会选择什么?为什么选择?

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.