计算科学

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

1
流体模拟中的边界条件
我正在使用涡旋粒子/“涡旋”进行2D流体模拟,如《视频游戏的流体模拟》中所述。我认为与“离散涡旋法”相同。基本上,您用定义好的涡度的粒子集合来表示流体,并使用比奥特-萨伐定律(例如:,其中p2-p1是在样本点和vorton之间位置的差,瓦特是涡(在三维的矢量),和- [R是vorton和采样点之间的欧几里德距离) 。v=ω×(p2−p1)4πr3v=ω×(p2−p1)4πr3v = \frac{\omega \times (p_2-p_1)}{4\pi r^3}p2−p1p2−p1p_2-p_1wwwrrr 我试图在流体中引入一个盒子,让它来回移动并影响流体。这意味着要考虑盒子的防滑和不贯通边界条件。(也就是说,在盒子的边界处,相对流体速度为0)。 现在,我正在采样盒子和流体在盒子周围80个点的相对速度。我还在盒子周围放置了80个vorton,但向外偏移了一点。我形成一个大矩阵,并求解涡度所需的涡度值,以抵消采样点处的流体速度(使用线性最小二乘法)。 这几乎可行,但是我注意到,我得到的解决方案高度依赖于采样点和涡流的确切布局。 有时,我会得到交替旋转的方向不同的沃尔顿模式(蓝色点是逆时针旋转的沃尔顿,红色点是顺时针旋转的沃尔顿): 其他时候,我将所有vorton放在框的左侧以一种方式旋转,而所有vorton则以另一种方式旋转,如该图所示: 我认为第二张照片是我真正想要的。我还认为这两种不同的解决方案意味着我正在使用的方程组太受约束。添加其他采样点有时会有所帮助,有时却没有帮助。 我是否可以添加其他边界条件以帮助我获得所需的结果?凭直觉,我没有采取任何措施来考虑在距包装盒一定距离处流体受到多大的干扰。我在想也许我可以添加边界层限制的条件。但是我不确定到底会是什么样。 另外,我是否可以参考任何相关文献来研究基于涡旋粒子的流体模拟如何处理这类边界条件?

5
大型稀疏对称(但不是正定)系统的求解器的最佳选择
我目前正在研究由某些算法生成的非常大的对称(但不是正定)系统。这些矩阵具有很好的块稀疏性,可用于并行求解。但是我无法决定是否应该使用直接方法(例如多边方法)还是迭代方法(预处理GMRES或MINRES)。我所有的研究都表明,迭代求解器(即使具有7个内部迭代的快速收敛)也无法击败MATLAB中的直接“ \”运算符。但是从理论上讲,直接方法应该更昂贵。这是怎么回事?是否有最新的文件或纸张用于此类情况?我可以在使用直接方法的并行系统中使用块稀疏性,就像GMRES这样的灵活迭代求解器一样有效吗?

1
与PETSc并行求解简单的Ax = b系统
我是PETSc软件包的新手。 我有一个矩阵市场格式的〜4000x4000矩阵A,我想让PETSc使用多个处理器来解决这个问题。 我知道如何在单个处理器上求解系统,但是我不知道如何在不同处理器之间分配矩阵和向量。 有一套简单的说明可以做到这一点吗?
10 petsc  matrix 

4
定点和任意精度计算的相关性
我看到很少有非浮点计算库/程序包。鉴于浮点表示形式的各种不准确性,提出了一个问题,为什么至少在某些领域中,这种提高的准确性可能值得使用定点运算的复杂性。 使用定点特征值求解器是否有重大困难?他们将有多慢/快,不准确/准确? 相关:这个和这个

2
微分形式与二阶有限体积法之间的联系
今天阅读有关微分形式理论的文章时,让我印象深刻的是它使我想起了二阶有限体积法(FVM)。 我正在努力弄清楚这种想法只是微不足道的还是存在更深层次的联系。 好吧,微分形式可以推广一些根深蒂固于二阶FVM的概念,例如通过表面的流体通量,而我们都涉及FVM中的通量。那么(斯托克斯的)积分定理是微分形式理论的中心对象之一。证明涉及在流形上整合微分形式,在流形上出现单纯形(三角形,四面体等)。实际上,歧管以我们代表平滑形状的方式进行细分,使用直边的单元格可以使流体通过。 这些只是一些类似的东西。事实是,关于微分形式的阅读使我无法停止思考FVM。 二阶有限体积法实际上代表微分形式理论的计算表现吗?

3
文献参考,用于对浮点运算和数据传输的当前和未来能源成本进行建模
我正在寻找最重要的文献和幻灯片参考,以对浮点操作以及跨CPU,内存,网络和存储的数据传输的当前和未来能源成本进行建模。我已将此问题标记为社区Wiki,并且我希望您将每个答案限制为以下格式: 标题,作者,位置/会议/期刊,年份,DOI / URL,论文或演示文稿提供的与我的要求相关的信息摘要。

3
最大化未知噪声功能
我感兴趣的最大化函数,其中θ ∈ [R p。F(θ)f(θ)f(\mathbf \theta)θ∈Rpθ∈Rp\theta \in \mathbb R^p 问题是我不知道函数或其派生类的解析形式。我能做的唯一的事情是评价功能的逐点,通过在插入值,并获得噪声估计˚F(θ *),在这一点上。如果我愿意,我可以减少这些估计的可变性,但是我必须支付增加的计算成本。 θ∗θ∗\theta_*f^(θ∗)f^(θ∗)\hat{f}(\theta_*) 到目前为止,这是我尝试过的: 具有有限差异的随机最陡下降:它可以工作,但需要大量的调整(例如,增益序列,比例因子),并且通常非常不稳定。 模拟退火:它可以工作并且可靠,但是需要大量功能评估,因此我发现它相当慢。 因此,我想就在这种情况下可以使用的替代优化方法提出建议/想法。我将问题尽可能地笼统,以鼓励来自与我不同的研究领域的建议。我必须补充一点,我对一种可以使我估计收敛时的黑森州的方法非常感兴趣。这是因为我可以用它来估计参数的不确定性。否则,我将不得不在最大值附近使用有限的差异来获得估计值。θθ\theta

4
具有线性约束的凸函数最大化(凹函数最小化)
问题是 最大f(x) 服从 A x = b最大值F(X) 服从 一个X=b\max f(\mathbf{x}) \text{ subject to } \mathbf{Ax} = \mathbf{b} 其中F(x)= ∑ñ我= 11 + x4一世(∑ñ我= 1X2一世)2----------√F(X)=∑一世=1个ñ1个+X一世4(∑一世=1个ñX一世2)2f(\mathbf{x}) = \sum_{i=1}^N\sqrt{1+\frac{x_i^4}{(\sum_{i=1}^{N}x_i^2)^2}}, x =[ x1个,X2,。。。,Xñ]Ť∈ [Rñ× 1X=[X1个,X2,。。。,Xñ]Ť∈[Rñ×1个\mathbf{x} = [x_1,x_2,...,x_N]^T \in \mathbb{R}^{N\times 1}和 甲 ∈ ř中号× N一个∈[R中号×ñ\mathbf{A} \in \mathbb{R}^{M\times N} 我们可以看到F(。)F(。)f(.)的形式为1 + ÿ2-----√1个+ÿ2\sqrt{1+y^2},它是一个凸函数。 还可以证明f(。)在[\ sqrt {2},2]中是有界的[ 2–√,2 ][2,2][\sqrt{2}, …

3
混沌数值模型的回归检验
当我们有一个代表真实物理系统并表现出混乱的数值模型(例如,流体动力学模型,气候模型)时,我们如何知道该模型的运行状况如何?我们不能直接比较两组模型的输出,因为即使是初始条件的微小变化也会极大地改变单个模拟的输出。我们不能将模型输出直接与观测值进行比较,因为我们永远无法足够详细地了解观测值的初始条件,而数值逼近总会引起微小差异,并会在系统中传播。 这个问题在某种程度上受到David Ketcheson 关于单元测试科学代码的问题的启发:我对如何实现此类模型的回归测试特别感兴趣。如果较小的初始条件变化会导致主要的输出变化(这仍然可能是现实的充分表示),那么我们如何才能将这些变化与因修改参数或实施新的数值例程而引起的变化区分开来?
10 testing  numerics 

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

4
快速准确地实现不完整伽玛函数的双精度
最新的实现双精度特殊功能的方式是什么?我需要以下积分: 对于和,可以用较低的不完全伽马函数来表示。这是我的Fortran和C实现:米=0,1,2,。。。Fm(t)=∫10u2me−tu2du=γ(m+12,t)2tm+12Fm(t)=∫01u2me−tu2du=γ(m+12,t)2tm+12 F_m(t) = \int_0^1 u^{2m} e^{-tu^2} d u = {\gamma(m+{1\over 2}, t)\over 2 t^{m+{1\over 2}}} m=0,1,2,...m=0,1,2,...m=0, 1, 2, ...t>0t>0t>0 https://gist.github.com/3764427 它使用级数展开,将各项相加直到达到给定的精度,然后使用递归关系有效地获得较低值。我对其进行了很好的测试,获得了我需要的所有参数值的1e-15精度,有关详细信息,请参见Fortran版本的注释。mmm 有没有更好的方法来实现它?这是gfortran中的gamma函数实现: https://github.com/mirrors/gcc/blob/master/libgfortran/intrinsics/c99_functions.c#L1781 它使用有理函数逼近而不是总结一些我正在做的无穷级数。我认为这是一种更好的方法,因为应该获得统一的精度。是否有某种规范的方法来处理这些问题,还是必须为每种特殊功能找出一种特殊的算法? 更新1: 根据评论,这是使用SLATEC的实现: https://gist.github.com/3767621 它从我自己的函数中复制值,大致在1e-15精度级别上。但是,我注意到一个问题,对于t = 1e-6和m = 50,项等于1e-303,对于更高的“ m”,它只是开始给出错误的答案。我的函数没有这个问题,因为我直接对使用了一系列扩展/递归关系。这是一个正确值的示例: ˚F米tm+12tm+12t^{m+{1\over2}}FmFmF_m F100F100F_{100}(1e-6)=4.97511945200351715E-003, 但是我无法使用SLATEC来实现这一点,因为分母会爆炸。如您所见,的实际值很小。FmFmF_m 更新2: 为避免上述问题,可以使用该函数dgamit(Tricomi的不完全Gamma函数),然后F(m, t) = dgamit(m+0.5_dp, t) * gamma(m+0.5_dp) / 2,因此不再存在问题,但是不幸的是,。然而,这可能是足够高的,我的目的。米≈ 172 米tttgamma(m+0.5_dp)m≈172m≈172m\approx 172mmm

3
浮点数的相对比较
我有一个f(x, y)返回双浮点数的数值函数,该数字实现了一些公式,并且我想检查参数组合的所有解析形式对解析表达式的正确性x以及y我是否感兴趣。比较计算所得的和分析浮点数? 假设两个数字是a和b。到目前为止,我一直在确保绝对(abs(a-b) < eps)和相对(abs(a-b)/max(abs(a), abs(b)) < eps)误差均小于eps。这样,即使数字在1e-20左右,它也会捕获数字不准确的地方。 但是,今天我发现了一个问题,其数值a和解析值为b: In [47]: a Out[47]: 5.9781943146790832e-322 In [48]: b Out[48]: 6.0276008792632078e-322 In [50]: abs(a-b) Out[50]: 4.9406564584124654e-324 In [52]: abs(a-b) / max(a, b) Out[52]: 0.0081967213114754103 因此,绝对误差[50](显然)很小,但是相对误差[52]很大。所以我认为我的程序中有错误。通过调试,我意识到这些数字是不正常的。因此,我编写了以下例程来进行适当的相对比较: real(dp) elemental function rel_error(a, b) result(r) real(dp), intent(in) :: a, b real(dp) :: m, d d = …

3
可视化事件数据以搜索性能问题的方式
我正在尝试使用高度异步的通信模式来优化MPI应用程序。每个等级都有要计算的事物的列表,如果输入或输出位于不同等级上,则根据需要发送消息。此外,每个级别都有线程(当前有一个通信线程和5个工作线程)。 我在代码的不同性能关键部分使用计时器来检测代码,这为我提供了每个线程的(开始,结束,类型)三元组列表。以明显的方式绘制,将时间作为水平轴,将等级和线程作为垂直,并用颜色表示每个线程当前正在执行的操作,我得到了这样的图像,其中有16个等级的线程,每个线程有6个线程: 我的问题是:还有什么其他可视化此数据的方式可以帮助解决性能问题?在对异步应用程序进行性能分析时,是否有人喜欢使用他们喜欢的绘图类型? 该数据集的局限性在于它不知道数据流的结构,但是在尝试收集更复杂的数据之前,我想从中获得尽可能多的洞察力。 如果有人要环顾四周(未通过正常路线上传),则此处为未压缩的图像。不幸的是,即使我相信它是有效的,Firefox也不会接受它,可能是因为它太大了。

3
四次方程的解
对于四次方程的解是否有开放的C实现: ax⁴+bx³+cx²+dx+e=0ax⁴+bx³+cx²+dx+e=0ax⁴+bx³+cx²+dx+e=0 我正在考虑实施法拉利解决方案。在Wikipedia上,我读到该解决方案仅对某些可能的系数符号组合具有计算稳定性。但是也许我很幸运……通过使用计算机代数系统分析求解并导出到C,我得到了一个务实的解决方案。但是,如果有经过测试的实现,我更喜欢使用它。我搜索一种快速方法,但不希望使用一般的根查找器。 我只需要真正的解决方案。

2
“波动方程”的有限差分方案,特征方法
考虑以下问题 Wuv=FWuv=F W_{uv} = F ,其中强迫项可以取决于(有关公式,请参见下面的Edit 1)以及及其一阶导数。这是一个1 + 1维波动方程。我们在指定了初始数据。u,vu,vu,vWWW{u+v=0}{u+v=0}\{u+v = 0\} 我对区间的依赖范围内的解决方案感兴趣, 并正在考虑以下有限差分方案。{u+v=0,u∈[−uM,uM]}{u+v=0,u∈[−uM,uM]}\{ u+v = 0, u \in [- u_M,u_M]\} 我们的目标是发展由和类似。该方案在因此我可以通过向上积分从初始数据中一致地计算;因此,我只需要真正查看和的演化方程。WuWuW_uWu(u,v+1)−Wu(u,v)=F(u,v)Wu(u,v+1)−Wu(u,v)=F(u,v)W_u(u,v+1) - W_u(u,v) = F(u,v)Wv(u+1,v)−Wv(u,v)=F(u,v)Wv(u+1,v)−Wv(u,v)=F(u,v)W_v(u+1,v) - W_v(u,v) = F(u,v)W(u,v)+Wu(u,v)+Wv(u+1,v)=W(u+1,v+1)=W(u,v)+Wv(u,v)+Wu(u,v+1)W(u,v)+Wu(u,v)+Wv(u+1,v)=W(u+1,v+1)=W(u,v)+Wv(u,v)+Wu(u,v+1) W(u,v) + W_u(u,v) + W_v(u+1,v) = W(u+1,v+1) = W(u,v) + W_v(u,v) + W_u(u,v+1)WWWWvWvW_vWuWuW_u 对于初始数据,我们需要兼容条件。这表明我可以通过在初始时间使用的前向(in)有限差分来计算初始数据,并在半整数点处给定的值。Wu(u,v)−Wv(u+1,v−1)=W(u+1,v−1)−W(u,v)Wu(u,v)−Wv(u+1,v−1)=W(u+1,v−1)−W(u,v)W_u(u,v) - W_v(u+1,v-1) = W(u+1,v-1) - W(u,v)uuuWWWWtWtW_t(u+0.5,v−0.5)(u+0.5,v−0.5)(u+0.5,v-0.5) 问题: …

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.