Clawpack:构建一个用于解决双曲偏微分方程的开源生态系统

查看文章
PeerJ计算机科学
请注意本文的预印本也存在,于2016年3月7日首次发布。

介绍

这个夹紧装置软件套件(Clawpack开发团队,2015)设计用于求解非线性守恒定律、平衡定律和其他不一定以守恒形式存在的一阶双曲偏微分方程。基本解算器基于LeVeque在(勒韦克,2002)、和设计用于逻辑笛卡尔统一或映射网格或此类网格的自适应层次。原件夹紧装置于1994年首次作为软件包发布,此后在功能和接口方面都取得了重大进展。最近,对代码进行了一次重大重构,并迁移到GitHub进行开发,从而发布了夹紧装置2014年1月5.0日。除了支持分布式和更好管理的开发过程之外,还进行了许多用户界面改进,包括新的用户界面和可视化工具、高精度算法的结合、通过MPI和OpenMP的并行化以及其他增强功能。

由于科学软件已成为科学、工程、资源管理、自然灾害建模和其他领域取得的许多进步的核心,因此描述和记录对广泛使用的软件包所做的更改变得越来越重要。此类文档工作旨在使新用户和现有用户了解软件开发人员采取的策略,将软件包置于其他包的上下文中,记录主要代码更改,并为软件用户提供具体的可引用参考。

考虑到这一点,本文的目标是:

  • 总结夹紧装置,

  • 总结早期夹紧装置4.x版本和最新版本,夹紧装置5.3,

  • 总结我们采用的开发模型,用于管理有许多贡献者的开源科学软件项目,以及

  • 确定用户如何为夹紧装置工具套件。

本文简要介绍了夹紧装置在“历史夹紧装置“双曲线问题”中数学问题的背景,现在在“开发方法”中使用的现代开发方法夹紧装置5.x主要发行版,直至“高级”中的5.3版一些总结性想法和未来计划夹紧装置“结论”中提到

的历史夹紧装置

的第一版夹紧装置由发布勒韦克(1994)由Fortran代码和一些Matlab公司(迈斯沃克,2015)用于打印解决方案的脚本。该代码中实现的波传播方法提供了一种将最近开发的高分辨率激波捕获方法应用于一般双曲系统的通用方法,并且只要求用户提供“黎曼解算器”来指定新的双曲问题。与伯杰合作(Berger&LeVeque公司,1998)很快,在两个空间维度中引入了自适应网格细化(AMR),并与Langseth合作(Langseth&LeVeque公司,2000;朗塞特,1996)导致了波传播算法和软件的三维版本,然后由Berger添加了三维AMR。

第4.3版夹紧装置包含了对代码的一些其他改进,并为教科书中的示例奠定了基础(勒韦克,2002)2003年出版。该文本不仅提供了LeVeque开发的波浪传播算法的完整描述,而且值得注意的是,用于生成文本中几乎所有图形的代码都可以在网上获得(勒韦克,2002).

2009年,夹紧装置版本4.4的发布与Matlab公司将Python作为推荐的可视化工具,并开发用于指定输入数据的Pythons用户界面。最终在2013年1月,4.x版本的夹紧装置以4.6.3版本结束。1

第5版夹紧装置介绍了用户公开的特性和许多代码开发的现代方法,以及与其他代码的接口和添加新功能。移动到吉特版本控制还允许使用更完整的开源模型。这些变化是本文其余部分的主题。

双曲线问题

在一维空间中,双曲方程组用夹紧装置通常采取守恒定律的形式 q个 x个 , + (f) q个 x个 , x个 = 0 或非保守线性系统 q个 x个 , + A类 x个 q个 x个 , x个 = 0 , 其中下标表示偏导数和q个(x个,)是一个向量≥1个组件。这里是的组件q个表示守恒量,而函数(f)表示q个.公式(1)以自然的方式推广到更高的空间维度;请参阅下面的示例。系数矩阵A类英寸(2)或雅可比矩阵(f)′(q个)英寸(1)假设对角化所有相关值的实特征值q个,x个,以及。此条件保证系统是双曲线的,其解是波型的。系统的特征向量决定了系统不同组成部分或波之间的关系,而特征值决定了这些波的传播速度。这些方程的右侧可以替换为“源项”ψ(q个,x个,)给出一个非齐次方程,有时被称为“平衡定律”,而不是守恒定律。空间可变通量函数(f)(q个,x个)英寸(1)也可以使用f波方法进行处理(Bale等人。,2002).

通过以下公式求解的方程示例夹紧装置包括:

  • 一个或多个示踪物的平流方程;在最简单的一维情况下,我们有: q个 + u个 x个 , q个 x个 = 0 . 速度场u个(x个,)通常是从另一个流体流动问题的解决方案中指定的,例如风。典型应用包括热量、能量、污染、烟雾或其他不影响速度场的被动对流量的输送。

  • 描述速度的浅水方程(u个,v(v))和表面高度小时深度相对于典型波长而言较小的流体。 小时 + 小时 u个 x个 + 小时 v(v) = 0 小时 u个 + 小时 u个 2 + 1 2 小时 2 x个 + 小时 u个 v(v) = b条 x个 小时 v(v) + 小时 v(v) 2 + 1 2 小时 2 + 小时 u个 v(v) x个 = b条 . 在这里是与重力相关的常数b条(x个,)是水深测量,或底面高度。请注意,水深测量通过源项; 可以添加附加项来模拟底部摩擦的影响。例如,这些方程用于模拟海啸和溃坝造成的洪水,以及模拟大气流动。

  • 可压缩、无粘流体动力学的欧拉方程,由质量、动量和能量守恒定律组成。波速取决于局部流体速度和声波速度(声速)。可以添加源项,以包括重力、粘度或传热的影响。这些系统在空气动力学、气候和天气建模以及天体物理学方面具有重要应用。

  • 弹性波方程,用于模拟固体材料中的压缩波和剪切波。在这里,即使是线性模型也可能很复杂,因为在多个尺度上,材料属性的变化会影响波速和特征向量。

非线性双曲型方程的求解可能会出现不连续性(冲击波),这给直接基于离散导数的传统数值方法带来了困难。现代冲击捕捉方法通常基于黎曼问题由方程式组成(1)或(2)以及具有单跳不连续性的分段常量初始数据。黎曼问题的解是相似解(函数x个仅),通常包括波(对于系统等式)以恒定速度传播。即使对于非线性问题也是如此,其中的波可能是激波或稀疏波(通过这些波,解以自相似的方式不断变化)。

双曲问题的主要理论和数值困难涉及物理校正弱解的处方和理解解在不连续处的行为。黎曼解算器是一种对要求解的双曲线系统的细节进行编码的算法,它是唯一需要更改的例程(而不是特定于问题的设置,例如初始条件),以便将代码应用于不同的双曲线系。在某些情况下,Riemann解算器也可以设计为强制物理属性,如正(例如,对于土爪)或者解释可能由通量项平衡的力(如重力)。

夹紧装置基于Godunov型有限体积法,其中的解由单元平均值表示。相邻状态的单元平均值之间的黎曼问题被用作算法的基本构建块。最初在中实现的波传播算法夹紧装置(仍在大部分代码中使用)基于使用每个黎曼解产生的波以及限制器函数来实现二阶精度,其中解是平滑的,并且不存在虚假的数值振荡(参见勒韦克(2002)有关算法的详细描述)。基于相同的黎曼解算器,也开发了高阶WENO方法。这些方法可以在中找到PyClaw公司(参见“PyClaw公司'),其中一个较大的包夹紧装置生态系统。

还必须施加特定于问题的边界条件,这些边界条件由设置解值的子程序实现幽灵细胞每个时间步都在域外部。这个夹紧装置软件包含实现多组常用边界条件的库例程,例如。,周期性边界条件、声学、欧拉或浅水方程等问题的反射实体壁边界条件以及非反射(吸收)外推边界条件。和所有人一样夹紧装置库例程,用户可以复制和修改边界条件例程,以实现特定应用程序所需的其他边界条件。

在二维或三维空间中,波传播方法通过使用任一维分裂进行扩展,因此只需要一维黎曼解算器,或者通过基于横向黎曼解算器在中引入(勒韦克,1997). 这两种方法都在中得到支持夹紧装置。已经为开发了多种Riemann解算器夹紧装置,其中许多是在黎曼存储库,请参阅“Riemann:社区驱动的近似Riemann解算器集合”

自适应网格细化(AMR)对于许多问题来说都是必不可少的,自1995年Marsha Berger加入项目团队以来,AMR已在两个空间维度上可用,她的可压缩流欧拉方程的AMR代码被推广到了软件中,该软件成为AMR法律(Berger&LeVeque公司,1998),包含在夹紧装置生态系统。AMR法律使用在(Langseth&LeVeque公司,2000). 从5.3.0版开始,在AMR法律,这在三维空间中特别有用,而非拼接算法的成本要高得多。最近的其他改进AMR法律在“AMR法律.’

还有其他几个开源软件项目为双曲线PDE提供自适应网格细化。感兴趣的读者可能想调查AMROC(Deiterding公司,2011)、BoxLib(https://ccse.lbl.gov/BoxLib/index.html)、Chombo(Adams等人。,2014)、格里斯(波皮内,2001)、OpenFOAM(OpenFOAM基金会,2016)或SAMRAI(安德森等人。,2013)例如。

开发方法

夹紧装置的开发模型是由其开发人员社区的需求驱动的。这个夹紧装置该项目由几个相互依赖的项目组成:核心解算器功能、可视化套件、通用自适应网格细化代码、专门的地球物理流代码和大规模并行Python框架。对核心解算器和可视化套件的更改会对其他代码产生下游影响,开发人员主要以独立、异步的方式跨大洲和时区工作。

核心夹紧装置软件存储库包括:

  • 抓回–负责其他存储库的安装和协调,

  • 黎曼–所有其他项目使用的黎曼解算器,

  • 内脏爪–所有其他项目使用的可视化套件,

  • 克拉乌提尔–大多数其他项目使用的实用功能,

  • 经典–1、2和3个空间维度的原始单网格方法,

  • 美国法律–二维和三维通用自适应网格细化框架,

  • 土爪–深度平均地球物理流求解器,该求解器在美国法律,以及

  • 侏儒–Python实现和与夹紧装置算法包括高阶方法和大规模并行能力。

发布夹紧装置用户下载的内容包含上述所有内容。存储库黎曼,内脏爪,以及克拉乌提尔有时被称为上游项目,因为它们的更改会影响上述列表中的所有剩余项目,通常称为下游项目。例如,在这方面有一些变化AMR法律位于的上游土爪,它使用了许多来自AMR法律。为了协调这一点抓回存储库指向每个存储库的最新已知兼容版本。

除了主要的核心代码存储库之外,其他存储库还包含使用软件包的文档和扩展示例:

这个夹紧装置存储库中也提供了4.x代码抓具-4.x但已不再处于开发阶段。

版本控制

这个夹紧装置团队使用Git分布式版本控制系统来协调每个主要项目的开发。存储库根据夹紧装置GitHub上的组织(https://github.com/clawpack)具有顶级抓回super-repository负责托管构建和安装工具,并为其他存储库提供同步点。剩下的“核心夹紧装置上面列出的“repositories”是主抓回组织。

GitHub本身是公共Git存储库的免费提供商。除了存储库托管之外夹紧装置团队使用GitHub通过Travis CI进行问题跟踪、代码审查和自动化持续集成(https://travis-ci.org/),并通过工作服测试覆盖范围跟踪(http://coveralls.io)用于基于Python的模块。GitHub上的问题跟踪器支持跨存储库引用,简化了之间的通信夹紧装置开发人员子团队。Travis CI服务运行夹紧装置的测试套件通过鼻子(https://nos.readthedocs.org)通过与Coveralls服务的连接,报告任何测试失败以及测试覆盖率的更改。

子模块

这个抓回“超蓄积”有两个目的。首先,它包含每个子项目的安装实用程序。其次,它充当项目存储库的同步点。本节的其余部分提供了有关Git子模块如何启用此同步的更多详细信息。

只要有可能,软件开发团队就会在一个统一的存储库中协调他们的开发。在无法实现这一点的情况下,Git提供的一个选项是子模块,它允许超表达(在本例中,抓回),将子存储库嵌套为目录,能够将子存储库修订的更改捕获为超级存储库中的新修订。在引擎盖下,超级存储库维护指向每个子模块及其当前版本的位置的指针。子模块目录包含常规Git存储库,所有协调都发生在超级存储库中。

其他每个核心夹紧装置上面列出的存储库是抓回存储库。创建新修订的每个提交抓回存储库描述了顶级安装代码以及每个子模块的修订。这样,Git子模块允许夹紧装置团队成员在重用和维护通用软件基础设施的同时,在独立项目上异步工作。

通常情况下夹紧装置开发人员推进顶层的主开发分支抓回任何时候添加主要功能或修复上游项目中可能影响其他存储库中代码的错误时,都可以使用存储库。通过签出中的特定修订抓回存储库并执行git子模块更新,所有存储库都可以更新为一致且功能强大的版本。

特别是,当Travis CI在任何项目存储库中运行回归测试(针对任何拉请求自动执行)时,它首先安装夹紧装置在虚拟机上以及抓取/控制分支指示在执行测试之前必须签出的每个其他项目的提交。如果抓回在其他上游项目中发生更改后,存储库没有得到正确更新,这些测试可能会失败。

的任何新版本夹紧装置是一个特定版本的快照抓回以及所有子模块的相关修订。这些特定的修订版也被标记为一致的名称,以供将来参考,例如5.3.1版(Git标记只是为特定修订提供一个描述性名称,而不必引用Git散列代码。)

贡献

由于现有的奖励机制和害怕被“挖走”,编程科学家通常不鼓励共享代码。然而,最近的研究表明,公开共享和开发代码的科学社区具有优势,因为每个研究人员都可以利用其他许多人的工作(土耳其语,2013)论文引用率可以通过共享代码来提高(范德维尔,2012)和/或数据(皮沃沃、戴和弗里德玛,2007). 此外,期刊和资助机构越来越多地要求调查人员共享用于获得已发表结果的代码。的目标之一夹紧装置该项目通过提供一种简单的机制来引用特定版本的夹紧装置软件,并确保软件的过去版本在稳定和可引用的平台上仍然可用。

在开发方面,我们期望公开进行重要讨论的开放源码开发模式将导致开发人员社区的进一步发展和用户的额外贡献。在过去的二十年中,许多用户编写了扩展代码夹紧装置使用新的Riemann解算器、算法或特定于域的问题工具。不幸的是,这些代码中的大部分并没有回到核心软件中供其他人使用。许多发展变化夹紧装置5.x旨在鼓励更广泛的社区做出贡献。我们已经开始看到来自开发团队外部的贡献有所增加,并希望在未来鼓励更多这样的贡献。

GitHub项目的主要开发模型是典型的:贡献者在GitHub上分叉存储库,然后在一个分支中开发改进,该分支被推到她自己的分叉中。当分支准备合并到主存储库时,她发出“拉请求”(PR)。贡献者也越来越多地使用PR作为一种方式,在进一步开发之前方便地发布初步代码或原型代码供讨论,通常将WIP标记为“正在进行的工作”,以表示尚未准备好合并。

发布请购单后,其他开发人员(包括相应项目的一个或多个维护人员)将审查代码。Travis CI服务器还自动对建议的新代码运行测试。测试结果可以在PR的GitHub页面上看到。通常在开发人员建议改进或讨论代码中的实现选择时会有一些迭代。一旦测试通过并同意代码是可接受的,维护人员就会将其合并。

使用GitHub平台的另一个好处是,可以通过命令行访问任何版本的代码吉特界面,通过GitHub网站,或所有广泛使用的平台上的许多可用应用程序。然而,更重要的是能够通过GitHub和Zondo用数字对象标识符(DOI)标记存储库的特定版本。2这些能力的组合提供了以下能力夹紧装置不仅可以在任何版本上访问,还允许在科学文献中引用用于特定结果的代码版本。

发布

尽管夹紧装置是不断开发的,它便于用户能够安装稳定版本的软件。这个夹紧装置开发人员通过两个分发渠道提供这些版本:GitHub和Python包索引(PyPI)。GitHub上提供了完整的源代码版本。或者PyClaw公司子项目及其依赖项可以使用PyPI客户端自动安装,例如管道.

夹紧装置不遵循日历发布周期。相反,当开发人员社区认为自上一个版本以来已经积累了足够的更改来证明切换到新版本的成本时,就会出现版本。在大多数情况下,夹紧装置使用M(M)..第页三元组,分别表示主要(M)、次要(M)和补丁(p)版本。在更广泛的软件工程社区中,这通常被称为语义版本控制。修复错误和外观问题的微小更改会导致补丁级别的增加。向后兼容的更改导致次要版本的增加。引入向后不兼容的更改需要增加主版本。此外,重要的新算法或能力的实现也将证明主要发布数量的增加是合理的,并且通常是向公众提供另一个发布的动力。实际上夹紧装置软件经常在次要版本中包含不完全向后兼容的更改,但这些更改相对较小,并记录在发行说明中。主要版本号很少更改,这与从4.x到5.0的主要代码重构有关。

从5.3.1版开始,Clawpack版本的目标文件也将在Zenodo上存档(https://zenodo.org),一个托管在欧洲核子研究中心的数据存储库,它发布DOI,以便可以通过永久链接引用软件版本(Clawpack开发团队,2015)这并不取决于GitHub的长期存在。

依赖关系

运行的任何部分夹紧装置需要一个Python解释器和常见的Pythons包numpy(Jones等人。,2001),f2磅/平方英寸(彼得森,2009),matplotlib(亨特,2007)以及(除了pure-Python 1D代码)GNU make和Fortran编译器。其他依赖项是可选的,具体取决于夹紧装置用于:

  • IPython/Jupyter(如果使用笔记本界面)(佩雷斯和格兰杰,2007).

  • PETSc公司(Balay等人。,2010),如果在中使用分布式并行PyClaw公司.

  • OpenMP,如果在中使用共享内存并行AMR法律土爪.

  • 如果使用传统可视化工具,请使用MATLAB。

进展

本节描述了从夹紧装置4.x到最新版本5.3。由于大部分开发工作都集中在当前的研究兴趣上,许多存储库只看到了微小的变化。这里没有列出一些小的更改,鼓励感兴趣的读者参考更改日志(http://www.clawpack.org/changes.html)和个人夹紧装置Git存储库以获得更完整的列表。

全球变化

夹紧装置代码库是在从的移动中执行的夹紧装置4.x到5.x。影响代码所有方面的主要更改包括:

  • 夹紧装置Riemann解算器已更改,以便一组解算器可用于所有版本的代码(包括PyClaw公司通过f2磅/平方英寸(http://docs.scipy.org/doc/numpy-dev/f2py)). 这些黎曼解算器并没有出现在分散的示例目录中,而是全部收集到新的黎曼存储库。对调用序列进行了修改,以适应这种增加的通用性。

  • 许多其他Fortran子程序的调用序列也根据使用夹紧装置4.x代码。对于那些只需要Riemann解算器的人来说,这些也可以作为独立产品使用。

  • 重新设计了Python前端引擎,以便更容易地为解算器和可视化指定运行时选项。Fortran变体(经典爪子,AMR法律,以及土爪)它们都使用Python脚本来帮助设置输入变量。这些脚本使用严格指定的格式创建文本文件,然后在运行Fortran代码时读取这些文件。该界面现在允许更新输入参数,同时保持向后兼容性。

  • 对主要保守量的指数进行了重新排序。夹紧装置4.x、网格单元中方程组的第个分量(,j个)(例如二维),存储在q(i,j,m)。为了提高缓存使用率并更容易与PETSc接口(Balay等人。,2010),对订单进行了全局更改,以使组件编号优先;即。,q(m,i,j)。像这样看似微小的更改会影响代码中的大量行,并且不容易实现自动化。版本控制和回归测试的使用对项目的成功完成至关重要。

黎曼:社区驱动的近似黎曼解算器集合

中实现的方法夹紧装置,以及双曲偏微分方程的所有现代Godunov型方法,都基于“双曲问题”中讨论的Riemann问题的解然而,大多数现有的双曲偏微分方程代码都使用黎曼解算器来计算通量,夹紧装置相反,黎曼解算器计算构成黎曼解的波(或不连续性)。在非分裂算法中,夹紧装置也利用横向的,横向的Riemann解算器,负责计算仅相邻角(在2d中)或边(在3d中)的单元之间的传输。

对于非线性系统,黎曼问题的精确解计算量很大,可能涉及不连续性(冲击波和接触波)和稀疏性。几乎总是最好使用不精确的黎曼解算器,仅使用不连续性和适当的熵条件来近似解。中可用的解算器夹紧装置都是近似解算器,尽管可以轻松实现自己的精确解算器并以所需的格式提供夹紧装置日常工作。

中所有包中的一个通用功能夹紧装置suite是Fortran-Riemann解算器例程的标准接口的使用。这确保为一个包开发的新解算器或解算器改进可以立即用于所有包。为了进一步促进这种共享并避免重复,Riemann解算器(很少有例外)不在其他包下维护,而是收集在名为黎曼。为开发新解算器的用户夹紧装置鼓励将其提交给Riemann存储库。

在基于Fortran的软件包(Classic、AMRClaw和GeoClaw)中,通过修改特定于问题的Makefile,在编译时选择Riemann解算器。PyClaw公司,将在运行时选择要使用的Riemann解算器。通过编译所有黎曼解算器(当PyClaw公司)并使用生成Python包装器f2磅/平方英寸。对于PyClaw公司,黎曼还为每个解算器提供元数据(例如方程数、波数和守恒量的名称),以便设置更加透明。

经典的

这个经典存储库包含在单个统一网格上实现波传播算法的代码,其形式与原始格式基本相同夹紧装置1994年的1.0版本,但多年来添加了各种增强功能。在引入夹紧装置4.4 Python用户界面和绘图例程中没有三维例程。这些已在中重新引入夹紧装置5.此外,OpenMP共享内存并行功能已扩展到三维代码。

图示显示了标高1和标高2上的网格单元,以及标高3和标高4上的网格轮廓。

图1:图示显示了标高1和标高2上的网格单元,以及标高3和标高4上的网格轮廓。

AMR法律

中的Fortran代码AMRCaw公司存储库执行块结构自适应网格细化(伯杰和奥利格,1984;Berger&Colella公司,1989)对于两者夹紧装置土爪应用。中实现的算法AMR法律在中进行了详细讨论(Berger&LeVeque公司,1998;LeVeque,George&Berger公司,2011),但这里给出了一个简短的描述,为描述最近的更改奠定了基础。这种细化解决了逻辑矩形网格层次结构上的PDE。一个(或多个)一级网格构成整个域,而创建和销毁更精细级别的网格(而不是移动这些网格)以遵循解决方案中的重要功能(请参阅图1).

AMR法律包括以下功能:

  • 协调需要细化的点的标记,使用各种可能的标准来标记需要从每个级别细化到下一个更精细级别的单元格(包括理查森外推、梯度测试或用户特定标准;请参阅http://www.clawpack.org/flag.html),

  • 使用以下算法将标记的点组织为下一个更精细级别的有效网格补丁(Berger&Rigoutsos公司,1991),

  • 将解决方案插值到新创建的精细网格,并在这些网格上初始化辅助数据(地形、风速、公制数据等),

  • 将细网格解决方案平均到粗网格,

  • 协调自适应时间步进(即时间的子循环),

  • 将粗网格解插值到细网格虚单元,以及

  • 在分辨率级别之间的补丁边界保持保护。

AMR法律现在,用户可以指定时空中的“区域”[x个1,x个2] × [1,2] × [1,2]其中,必须至少在某种程度上进行细化L(左)1最多允许L(左)2这有助于限制细化,例如,允许或确保在全球海啸模拟中仅解决一个小的沿海区域。以前,用户可以通过编写自定义标记例程来强制执行这些条件,但现在这是以通用的方式处理的,以便可以在Python问题规范中指定上述所有参数。可以指定多个区域,并使用简单规则确定位于多个区域中的网格单元的约束。

辅助阵列通常用于夹紧装置存储描述问题和例程的数据。例行程序塞托然后必须由用户提供,以便在每次创建新网格修补程序时设置这些值。对于某些应用程序,计算这些值可能非常耗时。夹紧装置5.2中,该代码得到了改进,允许在每次重新划分时以相同的级别重用以前修补程序中的值。这是向后兼容的,因为如果使用以前编写的例程,而这些例程仍然进行计算和覆盖,而不是检查掩码,则不会造成任何危害。

夹紧装置5.3增加了指定空间变化边界条件的能力。对于单个网格,计算扩展到计算域之外的虚单元的位置并适当设置它们是一件简单的事情。然而,使用AMR,可以为位于域中任何位置的网格调用边界条件例程,并且可能包含较少或较多数量的虚单元。因此,边界条件例程不假设有固定数量的虚单元。

二维和三维都允许各向异性细化。这意味着空间和时间细化比率可以相互独立地指定(只要时间细化满足CFL条件)。此外,还添加了根据CFL条件在每个级别上及时自动选择优化比率的功能。这仅在中实现土爪其中,浅水方程中的波速取决于局部深度。最精细的网格通常仅位于浅海地区,因此在空间上较大的精细化率不会导致在时间上较大的细化率。

AMR法律已使用OpenMP指令进行并行化。结构化AMR的主要范例是细化级别上的外循环,以及该级别上所有网格上的内循环,其中在每个网格上执行相同的操作(即,采取时间步长、查找虚单元、保存更新等)。这个内部循环使用平行于循环构造一个线程被分配在一个网格上操作。使用块大小为1的动态调度。为了有助于负载平衡,每个级别的网格都是按从大到小的顺序排序的,使用网格中的单元总数作为工作指标。此外,网格在每个维度中最多限制为32个单元,否则将其平分,直到满足此条件。注意,这种方法会导致内存膨胀。每个线程必须有自己的刮擦数组,以保存传入和传出的波和通量,以便将来进行保护修复。凸起与执行的线程数成正比。对于每个线程基于堆栈的内存分配,使用环境变量OMP_堆叠尺寸可能有必要增加限额。

图2显示了在夹紧装置 应用程序存储库,说明需要自适应优化的局部现象。图3在24核Intel Xeon Haswell机器(E5-2670v3,2.3 GHz)上运行时,我们使用KMP_AFFINITY压缩每个芯有一个螺纹。出于计时目的,对输入参数所做的唯一修改是关闭检查点和图形输出。左边的图表显示,大多数挂钟时间都在积分程序中(阶梯形格栅),它密切跟踪总时间。第二个时间段是重新划分,其中包含了不完全可伸缩的算法。填充鬼影细胞的时间很少,主要来自其他补丁,但也包括域边界处的补丁。在24芯之前,效率高于80%。请注意,标高1上只有两个格线,平均为22.8个标高2格线。大部分工作都是在3级网格上进行的,在所有3级时间步长上平均有138.1个网格。在24芯电缆中,平均每个芯电缆有5.8个网格,网格的大小相差很大。

 
                     AMR定律示例演示了可压缩气体动力学欧拉方程中两次激波-气泡相互作用,说明需要进行自适应细化以捕捉局部行为。

图2: AMR法律示例演示了可压缩气体动力学欧拉方程中的两次激波相互作用,说明需要进行自适应细化以捕捉局部行为。

标高1处有两个20×10×10网格。在这个3级运行中,它们在需要的地方通过系数4和系数2进行优化。
AMRClaw的缩放结果。

图3:缩放结果AMR法律.

(A) 对于AMR法律中显示的示例图2(B)是基于总计算时间的效率图。

的目标体系结构AMR法律土爪是多核机器。PyClaw公司另一方面,通过PETSc使用MPI扩展到数万个内核(Balay等人。,2010)但不是自适应的。

GeoClaw公司

这个土爪的分支夹紧装置用于求解地形上的二维浅水方程,以模拟海啸的产生、传播和淹没。这个AMR法律代码构成了起点,但需要进行许多修改以支持此应用程序的需求,如下所述。此代码源于George的工作(乔治,2004;乔治,2006;乔治,2008)最初被称为海啸爪后来很明显,许多其他地球物理流应用也有类似的要求,该规范被概括为土爪.

其中一个主要问题是在流动边缘处网格单元的润湿和干燥处理。黎曼解算器中干态的处理很难稳健地处理,并且已经经历了多次迭代。土爪为了保持稳定状态,特别是“静止海洋”,还必须保持良好的平衡。为了实现这一点,将地形变化引起的动量方程中的源项合并到黎曼解算器中,而不是使用分步分裂方法。这对于模拟振幅相对于海洋深度变化非常小的波浪至关重要。请参见勒韦克(2010)对这些方法和乔治(2006)和乔治(2008)有关中使用的黎曼解算器的详细信息土爪。的其他功能土爪包括在球面上以经纬度坐标求解方程的能力,以及使用曼宁公式模拟底部摩擦的源项的合并。有关代码和海啸建模应用程序的更多详细信息,请参阅(Berger等人。,2011;勒维克、乔治和伯格,2011). 2011年,进行了大量的验证工作土爪根据美国国家海啸减灾计划(NTHMP)基准(González等人。,2011). NTHMP批准的代码允许土爪用于本计划或其他联邦和州机构资助的危险测绘项目,例如(González、LeVeque和Adams,2013;Gonzalez等人。,2014). 其中一个项目如图所示图4.

华盛顿州韦斯特波特的海啸模拟和规划。

图4:华盛顿州韦斯特波特的海啸模拟和规划。

格雷港(Gray’s Harbor)展示了西澳大利亚州西港(Westport)位于南部半岛。(地图数据©2016谷歌)(B)地震后40分钟,卡斯卡迪亚俯冲带潜在9级事件的模拟。(C) Westport新Ocosta小学的设计部分基于土爪仿真(González、LeVeque和Adams,2013). 图片由TCF Architecture提供。

除了各种海啸建模应用程序外,土爪已用于解决陡峭地形中的溃坝问题(乔治,2011)、风暴潮问题(曼德利和道森,2014)(请参见图5表1)和海底滑坡(基姆,2014). 该规范还为求解风暴潮模型的多层浅水方程奠定了基础(曼德利,2011;曼德利,2013),目前正在进一步扩展,以处理D-Claw包中的泥石流建模(艾弗森和乔治,2014;乔治和艾弗森,2014)(请参见图67).

 
                     GeoClaw风暴潮示例。

图5: 土爪风暴潮示例。

(A) 的快照土爪飓风艾克登陆时的风暴潮模拟。(B) 验潮仪数据计算自土爪自动循环以及同一位置的观测数据。
表1:
计算工作量和时间安排土爪adcirc公司.
发件人曼德利和道森(2014).
包裹 线程 墙壁时间 核心时间
ADCIRC公司 4,000 35分钟 2333小时
土爪 4 2小时 8小时
内政部:10.7717/每只体重68/表-1
碎屑流示例。

图6:碎屑流示例。

(A) 2010年米格尔山泥石流矿床照片,来自奥尔斯塔特(2013). (B) 模拟泥石流,来自D.George。
Oso,WA滑坡模拟。

图7:Oso,WA滑坡模拟。

2014年西澳州奥索观测(黄线)和计算(蓝色)滑坡(艾弗森等人。,2015).

中近四分之一的文件AMR法律必须为修改源库土爪。当前在中有113个文件AMR法律2D库,其中26个被替换为土爪-中具有相同名称的特定文件土爪二维库。例如,为了在插值时保持海面平坦,有必要插值表面高程(地形加水深),而不是像通常那样简单地插值解向量的深度分量AMR法律。中的另外24个文件土爪浅水方程库处理海啸和风暴潮建模需求带来的其他复杂问题。

在中实现的算法中的其他几个实质性改进土爪在版本4.6和5.3.0之间进行,包括:

  • 在深度平均流中,波速以及CFL条件取决于深度。因此,在空间上经过优化的浅水中的水流可能不需要及时进行优化。这种“可变时间步进”很容易与添加到AMRCaw公司.

  • 通过一组地形添加了可能以不同分辨率覆盖重叠区域的文件。有限体积法需要地形的单元平均值,通过积分由输入构造的分段双线性函数来计算地形每个网格单元上的文件。夹紧装置5.1.0,这一点得到了改进,允许任意数量的嵌套地形网格。当使用自适应网格细化时,每隔几步可能会进行重新划分。在5.2.0中进行了改进,以便可以复制地形,而不是在存在现有旧网格的区域总是重新计算地形。

  • 用户现在可以提供多个dtopo公司指定在一系列时间对初始地形进行更改的文件。这用于指定海啸地震期间的海底运动,但也可以用于指定海底滑坡运动或溃坝。

  • 已经开发了许多新的Python模块来帮助用户使用地形dtopo公司文件夹。这些记录在夹紧装置文档,其中一些文档用Jupyter笔记本电脑进行了说明夹紧装置画廊。

  • 5.0.0中增加了新功能,用于监控模拟指定时间范围内各种流量的最大值。这种能力对于许多需要每个点的最大流动深度、港口中的最大流速或最大动量通量(流动将施加在结构上的流体动力的测量值)的应用来说是至关重要的。还可以监测每个点的第一波到达时间。这些功能包含在4.x版本的代码中,但更为有限,并且在细化补丁的边缘附近并不总是能够正常运行。在5.2版中,这些例程得到了进一步的改进和扩展。用户可以指定监测值的点网格,新代码在允许一维网格(例如横断面)、二维矩形网格或任意点集方面更加灵活。

PyClaw公司

PyClaw公司是一个面向对象的Python包,它提供了一种方便的方法来设置问题并调用夹紧装置它最初是由另一方使用的一组数据结构和文件IO例程发展而来的夹紧装置代码和依据VisClaw公司这些例程是在4.x版本的早期版本中发布的夹紧装置这些发行版还包括纯Python中1D经典算法的全功能实现。PyClaw公司并且有助于理解算法。

的当前版本PyClaw公司包括访问经典算法以及中引入的高阶算法锋利的爪子(Ketcheson、Parsani和LeVeque公司,2013)(即WENO重构和Runge–Kutta积分器),可用于大型分布式内存并行机。对于后一种功能,PyClaw公司依赖PETSc(Balay等人。,2010). 早期Fortran Classic和锋利的爪子在安装时使用自动包装代码f2磅/平方英寸.

最近的应用PyClaw公司包括通过移动折射率扰动进行激光捕获的研究(圣罗马·阿列里吉,2015)弱非线性爆轰波的不稳定性(法里亚和卡西莫夫,2015),以及周期性材料中非线性波通过衍射的有效色散(Ketcheson和Quezada de Luna餐厅,2015). 其中两个在图8.

 
                     PyClaw示例模拟。

图8: PyClaw公司示例仿真。

(A) 反应欧拉方程的二维爆轰波解,显示了由不稳定性引起的横向冲击;看见法里亚和卡西莫夫(2015). (B) 具有匹配阻抗和周期变化声速的层状介质中波的色散;看见Ketcheson&Quezada de Luna公司(2015).

图书馆化和可扩展性

当科学软件设计为库时,它更易于使用、扩展和与其他工具集成(Brown,Knepley&Smith律师事务所,2015).夹紧装置一直被设计为可扩展,但PyClaw公司从几个方面进一步说明了这一点。首先,它通过广泛使用的包管理系统进行分发,管道第二,默认安装过程(“pip安装夹紧“)为用户提供完整编译的代码,不需要设置环境变量。像其他人一样夹紧装置包装,PyClaw公司提供了几个“钩子”供用户插入自定义例程(例如,指定边界条件)。PyClaw公司这些例程(包括Riemann解算器本身)是在运行时选择的,而不是在编译时选择的。这些例程可以直接用Python编写,或者(如果它们是性能关键的)用编译语言(如Fortran或C)编写,并用许多可用工具之一包装。问题设置(包括初始条件、算法选择和输出规范等)也在运行时执行,这意味着研究人员可以绕过大部分较慢的代码编译执行后处理周期。其目的是PyClaw公司易于在其他包中使用(无需控制主()).

Python几何体

PyClaw公司包括用于描述结构化网格集合及其上的数据的Python类。这些类也被其他代码和VisClaw公司,用于后处理。中的网格夹紧装置总是由一组(可能映射的)张量积网格(区间、四边形或六面体)组成,也称为面片。目前,PyClaw公司解算器仅在单个面片上操作,但几何体和网格已经包含了多面片功能,可在中进行可视化AMR法律土爪.

PyClaw公司解算器

PyClaw包含一个到经典解算器(前面已经描述过)和锋利的爪子(Ketcheson等人。,2012).锋利的爪子使用传统的直线方法来实现空间和时间上的高阶分辨率。首先离散空间算子,生成ODE系统,然后使用龙格-库塔或线性多步方法求解。空间导数是使用加权基本无振荡(WENO)重构计算的,该重构基于单元平均值,可抑制不连续附近的虚假振荡。中的WENO例程锋利的爪子由PyWENO生成(http://github.com/memmett/PyWENO),这是一个生成WENO例程的独立包。

中的默认时间步进例程锋利的爪子是二到四阶的强稳定性保持(SSP)Runge–Kutta方法。一些方法使用额外的阶段,以便使用更大的CFL数实现更有效的时间步进。时间介入锋利的爪子最近已扩展到包括具有可变步长的线性多步方法。这些方法使用时间步长选择来确保强大的稳定性保持特性,如中所述Hadjimichael等人。(2016).

并行性

PyClaw公司包括通过Python包装器使用PETSc的分布式并行后端宠物4py。并行代码使用相同的低级例程,无需修改。在高级例程中,只有几百行Python代码显式地处理并行通信,以便在子域之间传输虚单元信息,并找到全局最大CFL数以适应时间步长。例如图8它涉及1.2亿多个自由度,在Shaheen I BlueGene/P超级计算机的两个机架上运行。在KAUST的Shaheen I(BlueGene/P)和Shaheen II(Cray XC40)超级计算机上的数万个处理器上进行的更大规模测试中,已经证明该代码的扩展效率超过90%。MPI/OpenMP混合版本已在开发分支中提供,并将包含在未来版本中。

VisClaw:可视化夹紧装置输出

可视化仿真结果的实用方法对于求解PDE的任何软件包都至关重要。这对于使用自适应网格细化的仿真来说尤其如此,因为大多数可用的可视化软件包都没有方便地可视化分层AMR数据的工具。VisClaw公司为所有主要夹紧装置子模块,包括经典爪子,AMR法律,PyClaw公司土爪.

自1994年第一次发布以来,夹紧装置包含了可视化输出的工具夹紧装置AMRCaw公司跑。直到版本发布夹紧装置4.x,这些可视化工具主要包括Matlab公司创建一维、二维和三维图的例程,包括伪彩色图、纹影图、等高线图和散点图,包括径向或球对称数据。内置工具也可用于处理一个、两个和三维映射网格。然而,从4.x版本开始,人们认识到,对专有软件的可视化依赖阻碍了相当大的潜在用户群使用夹紧装置软件。一维和二维绘图程序从Matlab公司马特普洛特利布是一个流行的开源Python包,用于为一维和二维数据生成出版物质量的图形(亨特,2007).

随着夹紧装置版本5及更高版本,Python图形工具已收集到VisClaw公司存储库。这个VisClaw公司这些工具扩展了Version4.x Python例程的功能,用于创建一维和二维绘图,并添加了几个新功能。其中最主要的是生成网页输出的能力,在网页上可以单独查看一系列图,也可以使用Javascript包将其作为动画时间序列进行查看(https://github.com/jakevdp/JSAnimation网站)(这是由早期版本的夹紧装置). 这个VisClaw公司模块伊普洛特卡夫通过Python或IPython提示符提供交互式打印功能。提供与原始软件相同的交互功能Matlab公司日常工作,伊普洛特卡夫允许用户以交互方式逐步浏览绘图的时间序列,从一个帧跳到另一个帧,或以交互方式浏览当前时间帧中的数据。

可视化地理空间数据的工具土爪

生成的地理空间数据土爪具有特定的可视化要求。当显示淹没或洪水水位的图覆盖在背景测深或地形上时,海啸或风暴潮模拟最有用。当以图形方式与观测数据进行比较时,从固定空间位置的模拟中数值插值的补充一维时间序列数据(例如,量规数据)最有用。最后,为了更彻底地分析计算数据,仿真数据应以易于导出到GIS工具的格式提供,例如ArcGIS(网址:http://www.arcgis.com)或开源替代方案QGIS(质量地理信息系统)(网址:http://www.qgis.org). 对于探索初步结果或将结果传达给非专业人士,谷歌地球也很有帮助。

最新版本的夹紧装置包括许多专业VisClaw公司通过绘制地理空间数据来处理上述问题的例程。模拟中使用的地形或测深数据将通过绘图程序读取,并且使用不同的颜色图,可以在同一地块上查看水和陆地。此外,还可以添加仪表位置以及水和陆地的等高线。根据用户可自定义的例程,还创建了一维仪表图。在这些仪表绘图程序中,用户可以很容易地包括观测数据以进行比较土爪仿真结果。

除了HTML和Latex格式外夹紧装置结果,VisClaw公司现在还将生成适合在Google Earth中可视化结果的KML和KMZ文件。使用相同的马特普洛特利布图形例程,VisClaw公司创建可以用作KML文件中的地面覆盖要素的PNG文件。其他功能,如仪表、AMR网格上的边界以及用户指定的区域也可以显示在谷歌地球上。所有KML和PNG文件都被压缩为单个KMZ文件,可以直接在Google Earth中打开或在线使用。While期间VisClaw公司不直接支持ArcGISQGIS(质量地理信息系统),可以编辑为Google Earth创建的KML文件,以及关联的PNG文件以导出到这些其他GIS应用程序。

Matlab绘图例程

这个Matlab公司早期版本中可用的打印工具夹紧装置仍包含在VisClaw公司虽然大多数一维和二维功能最初在Matlab公司套件已移植到Python和马特普洛特利布,原件Matlab公司例程在中仍然可用Matlab公司绘图工具套件。其他绘图功能,如嵌入三维空间的二维流形,或全三维数据的三维绘图,仅在Matlab公司以直接与夹紧装置。计划在未来版本中提供更高级的三维绘图功能VisClaw公司.

结论

夹紧装置在过去20年中,它从最初的版本演变为一个小型且专注的软件包,两个核心开发人员可以在没有版本控制的情况下进行管理。现在,它是一个由相关项目组成的生态系统,这些项目共享核心理念和一些通用代码(尤其是黎曼解算器和可视化工具),但针对不同的用户社区,由分散在许多机构的重叠但有些不同的开发人员组开发。采用更好的软件工程实践,特别是使用Git和GitHub作为开放开发平台,以及使用pull请求讨论提议的更改,有助于促进本文总结的许多新功能的开发。这些面向开发人员的改进当然也会影响用户,因为更好更快的开发周期意味着更好更快的功能实现。版本5中已经实现的面向用户的功能开放了夹紧装置面向更广泛的受众。

未来计划

这个夹紧装置开发团队继续期待新的想法和努力,这些想法和努力将使项目具有更好的可访问性,以及核心开发团队没有想到的新功能。为此,正在考虑为下一个主要版本的夹紧装置包括

有关这些更改的详细信息,请访问http://depts.washington.edu/clawpack/users-4.6/changes.html.使用的4.x版本svn公司版本控制和免费软件(在BSD许可下)通过tarballs分发。
有关为特定版本的软件创建DOI的指南,请参阅http://guides.github.com/activities/citable-code/.
在中描述http://www.clawpack.org/fgmax.html.
72 引文   意见   下载