没有合适的资源?快使用搜索试试~ 我知道了~
软件X 16(2021)100807原始软件出版物FEniCS–preCICE: Coupling FEniCS to other simulation本杰明·罗登伯格a,伊沙安·德赛b,理查德·赫特里希a,亚历山大·贾斯特c,Benjamin Uekermannba德国慕尼黑工业大学信息学系计算机科学科学计算b模拟软件的可用性和可持续性,德国斯图加特大学并行和分布式系统研究所c德国斯图加特大学并行与分布式系统研究所大型系统仿真ar t i cl e i nf o文章历史记录:2021年3月20日收到收到修订版,2021年7月23日接受,2021年保留字:FEniCS流固耦合耦合传热多物理场耦合问题有限元法preCICEa b st ra ct新软件中间层通过preCICE简化了(现有的) FEniCS应用程序代码与其他仿真软件的耦合为此,FeNiCS-preCICE在FeNiCS和preCICE网格和数据结构之间进行转换,提供易于使用的耦合条件,并管理隐式耦合的数据检查点。新软件本身就是一个库,并遵循FEniCS原生风格。只需要几行额外的代码就可以为耦合准备FEniCS我们通过两个例子说明了FeNiCS-preCICE的功能这两种方案的结果进行了比较,与其他模拟软件显示出良好的协议。版权所有©2021作者。由爱思唯尔公司出版这是CC BY许可下的开放获取文章(http://creativecommons.org/licenses/by/4.0/)中找到。代码元数据当前代码版本v1.2.0用于此代码版本的代码/存储库的永久链接https://github.com/ElsevierSoftwareX/SOFTX-D-21-00054Code Ocean computecapsulehttps://codeocean.com/capsule/4816993法律代码许可证LGPL-3.0使用git的代码版本控制系统使用Python的软件代码语言、工具和服务编译要求、操作环境依赖性FeNiCS、pyprecice、numpy、scipy如果可用,链接到开发人员文档/手册https://www.precice.org/adapter-fenics.html技术支持https://precice.discourse.group/1. 动机和意义要使模拟在应对我们这个时代的重大研究挑战(无论是核聚变、个性化医疗还是气候预测)方面发挥重要作用,理想情况下,单个仿真组件可以被视为黑盒,并且可以容易地插入在一起或交换。软件preCICE [2]可以帮助做到这一点:它可以用来将任意多个这样的黑盒模拟组件粘合在一起在下文中,我们将这些组件称为耦合仿真的参与者preCICE主要侧重于基于网格的离散化,*通讯作者。电子邮件地址:benefici.rodenberg@ in.tum.de(Benjamin Rodenberg)。https://doi.org/10.1016/j.softx.2021.100807PDE模型作为参与者。有限元软件FeNiCS [3,4]是在相当紧凑的Python脚本中解决此类PDE模型的流行选择我们将这样的Python脚本称为FEniCS应用程序代码。在本文中,我们开发并记录了一个新的软件,称为preCICE本身就是一个图书馆。因此,对于耦合,参与者需要在其源代码中调用preCICE的API。由于preCICE API的高度抽象,对参与者源代码的必要更改是最小侵入性的。这些更改通常在所谓的适配器(adapter)适配器定义耦合网格,处理耦合边界条件,并实现耦合的操纵直到2352-7110/©2021作者。 由Elsevier B.V.出版。这是一篇开放获取的文章,使用CC BY许可证(http://creativecommons.org/licenses/by/4.0/)。可在ScienceDirect上获得目录列表SoftwareX期刊主页:www.elsevier.com/locate/softxBenjamin Rodenberg,Ishaan Desai,Richard Hertrich etal.软件X 16(2021)1008072大约在2016年,preCICE用户必须为他们想要耦合的代码编写自己的适配器。由于许多用户耦合相同的代码,他们必须解决相同的问题,并不断重新发明轮子。因此,用于广泛使用的软件(例如,OpenFOAM [5,6]或SU2 [7])首次引入[8],以结束宝贵的人类发展资源的浪费。这些发展极大地促进了preCICE的可用性和普及,从而促进了科学发现的进程。在本文中,我们遵循相同的论点,并介绍了一个独立的,通用的适配器FeNiCS。我们遵循FeNiCS原生风格,这使得FeNiCS用户的进入门槛尽可能低。该适配器可以轻松集成到现有的FEniCS代码中。FEniCS的分布式内存并行化是开箱即用的。FeNiCS本身不是一个单一的仿真代码,而是一个库。这使得通用适配器成为一项具有挑战性的任务。因此,我们限制了一般性:我们专注于二维问题,并研究了时间相关的该适配器还可以应用于体积耦合问题,一方面,可以很容易地3D问题,另一方面。FEniCS已经被用于解决FSI,或更通用的FSI。以整体方式解决一般多物理问题[9为此,图书馆multiphenics提供FEniCS-工具来解决多物理问题3不同物理的相互作用通过使用FEniCS求解的大型耦合方程系统对现象进行通常需要在不同的物理域上建立一致的网格然而,我们遵循分区方法,该方法允许组合几个特定的单物理参与者来解决整体多物理问题。FEniCS已经在分区的fash中耦合到reaktoro [12]以模拟反应性输运,或耦合到FEniCS的其他物质以允许FSI中的不一致网格[13]。最近,通用耦合软件MUI [14]已用于实现OpenFOAM和FEniCS[15]之间的FSI耦合。例如,可以在[2]中找到其他通用耦合软件的综述。在本文中,我们提出了一个软件耦合的FeNiCS为基础的应用程序到任意其他模拟软件通过preCICE。本文遵循SoftwareX的建议结构:我们在第2节中详细描述软件。其中包括软件架构概述、软件功能详细描述、API使用示例以及所用测试方法的简要概述我们在第3节中给出了FeNiCS-preCICE适配器的两个示例性用例之后,我们将在第4节中讨论新软件的影响。2. 软件描述FeNiCS-preCICE适配器可能被认为是一种不寻常的它既不是一个独立的程序,也不是一个可以在这样的程序中使用的库。相反,它是两个大型软件包之间的1 一个卷耦合的FEniCS示例可以在这里找到:https://github.com/precice/tutorials/pull/219。2 可以找到扩展到3D场景的适配器的工作原型在拉取请求(github.com/precice/fenics-adapter/pull/133)中。在这个原型中,涉及处理矢量数据的每个函数现在都被修改为根据问题的维度来处理2D或3D数据这个原型此外,耦合仿真根据定义由多个参与者组成到桌子上。因此,在描述FeNiCS-preCICE适配器时,必须描述新软件如何与其他软件包接口。在第2.1节中,我们概述了整个软件架构,并简要介绍了各个软件包:preCICE、FeNiCS和之后,在第2.2节中,我们详细介绍了FeNiCS-preCICE适配器的API第2.3节中的简短示例代码完成了软件描述。最后,在第2.4节中,我们解释了如何测试新软件2.1. 软件构架图1给出了一个概述如何发挥所有软件层,一起在耦合模拟使用用户提供FEniCS应用程序代码(solver.py),其使用FEniCS(导入fenics)来用有限元方法求解某个PDE模型。此外,应用程序代码导入适配器导入preCICE(导入precice)--更具体地说,是preCICE的Python绑定。最后,preCICE处理与其他仿真软件的耦合,例如OpenFOAM或SU2。让我们更仔细地看一下各个包。preCICE为耦合基于网格的偏微分方程求解器提供了三个构建模块:(1)非匹配网格之间的数据映射方法。(2)稳定耦合方程组的定点加速方法。(3)参与者之间的通信,这些参与者是单独的可执行文件,可能在异构计算集群中的不同节点上运行。preCICE是一个库,遵循对等耦合概念-不需要类似于中央服务器的实体。该库是用C++编写的,但也提供了从C++ API与Cython生成的Python绑定[16]。作为输入和输出参数,Python绑定使用原始Python数据类型以及NumPy数组[17]。preCICE在运行时通过一个xml文件进行配置,该文件描述一个完整的耦合模拟装置4FeNiCS是一个有限元Python软件包,具有广泛的C++实现,其名称为DOLFIN。它的API使用高抽象级别。FEniCS提供用于生成和管理网格的功能和数据结构。在网格之上,可以创建各种有限元空间。任意偏微分方程的弱形式可以用一个非常紧凑的符号来定义。在第2.3节中,我们给出了一个简短的代码示例,说明了FEniCS API。FeNiCS-preCICE适配器已使用FeNiCS 2019.1.0进行了测试和开发。有关FeNiCS的更多信息,我们请读者参阅[4]。FEniCS–preCICE 这意 味着 FEniCS 应用 程序 代码 调用 FEniCS-preCICE适配器,后者又调用preCICE。FeNiCS-preCICE适配器的一些API调用被简单地重定向到preCICE。对于其他API调用,适配器提供了大量的功能,例如数据结构的转换。我们在2.2节中详细解释了适配器的API。适配器通过一个JSON文件进行配置,该文件描述了适配器写入和读取的数据。为了简化,目前只有一个读和一个写数据适配器在技术上支持单个耦合网格上的字段,而preCICE API提供了更大的灵活性。在这个方向上的扩展计划。此外,已针对3D串行FSI场景进行了测试(参见github.com/precice/tutorials/pull/222)。3 https://mathlab.sissa.it/multiphenics网站。4 有关preCICE配置的详细信息,请参见https://www.precice.org/configuration-overview.htmlBenjamin Rodenberg,Ishaan Desai,Richard Hertrich etal.软件X 16(2021)1008073图1.一、 软件体系结构概述。从左到右:preCICE、solver.py仅用连续Galerkin一阶和二阶有限元进行测试,而FEniCS提供了广泛的可用有限元空间,包括高阶和不连续Galerkin。2.2. 软件功能The FEniCS–preCICE adapter uses a central 我们在图2中列出了API的重要部分,并在下面逐步描述Adapter要了解本节的所有实现细节,需要对FeNiCS有一定的了解。适配器初始化(第4-13行)。Adapter的构造函数创建并配置适配器对象。通过调用initialize初始化对象,其中coupling_subdomain参数是域边界,数据必须耦合。存在两 个 可 选 参 数 来 配 置 耦 合 : 对 于 单 向 耦 合 , 必 须 提 供read_function_space或write_object-这取决于参与者是读取还是写入数据。对于双向耦合,需要参数为 read_function_space 和 write_object 提 供 FEniCSFunctionSpace,以向适配器提供耦合网格以及函数类型(标量/向量,顺序)。如果用户想要提供初始写入数据,则可以提供FEniCS函数作为write_object。数据访问(第15-20行)。用户可以分别调用write_data和read_data 向 preCICE 写 入 数 据 或 从 preCICE 读 取 数 据 。 为write_data提供的参数write_function是一个FEniCS函数,适配器在耦合网格处对其进行采样。 调用read_data返回一个包含耦合网格点和关联数据的dict数据。它可以用直接更新耦合表达式或点源。通过表达式耦合一致的量(第22-28行)。为了实施耦合边界条件,我们需要区分两种类型的耦合数据:需要一致数据映射的量(例如温度、热通量或每单位体积的力)和需要保守数据映射的量(例如力)。让我们首先考虑相容量的边界条件。在这种情况下,FeNiCS该对象非常灵活,可以以多种不同的方式使用FeNiCS书[4]给出了许多如何使用表达式的例子,FeNiCS然而,表达式也可以直接以弱形式使用,例如用于Neumann边界条件(... + expr * v * ds)或体积项(. +expr * v * dx)。这里,expr是一个表达式,v是测试函数,ds和dx是曲面和体积积分元素。通常,对于边界条件,表达式是显式的。 给定 作为 象征性 表情5用于耦合然而,在边界上,这样的连续表示需要从preCICE给出的节点值构造。为此,适配器提供了从FEniCS的UserExpression继承的CouplingExpression连续表示是使用插值例程构造的,降低在[18]中建议的方法,其中首先构造多项式最小二乘拟合,然后是径向基函数插值。对于径向基函数插值,我们使用SciPy [19]中的例程。不要将此插值与preCICE使用的数据映射混淆。创建并返回一个未初始化的CouplingExpressioncreate_coupling_expression. 它被初始化或更新,调用update_coupling_expression并提供dict从read_data获取的数据。通过点源耦合守恒量(第30-32行)。保守量的边界条件可以通过逐点边界条件实现[20]。为此,FENICS-fersPointSource ( V , p , magnitude ) , 它 可 以 通 过PointSource.apply(rhs)应用于方程系统。这里,V是函数空间,p是应用点源的坐标,而magnitude是点源的幅度get_point_sources允许用户在各个耦合网格点处获得点源;同样,通过提供从read_data获得的dict数据。请注意,与CouplingExpression相反,CouplingExpression创建一次,然后通过类似指针的访问模式进行更新,PointSource只是被检查点(第34-40行)。 对于隐式耦合(也称为强耦合或紧耦合),每个时间步长(或甚至在所谓的时间窗口内的多个时间步长)需要迭代地重复,直到耦合残差下降到定义的阈值以下。preCICE处理收敛性测量、迭代控制和隐式耦合循环的加速。适配器的职责是提供一种时间回溯的机制。这是通过存储和检索完整的求解器状态的检查点来到Dirichlet和Neumann边界条件。 一个基本例如,Dirichlet边界条件可以定义为5例如,在一个实施例中, 表达式('sin(x[0]))+ cos(x[1]')Benjamin Rodenberg,Ishaan Desai,Richard Hertrich etal.软件X 16(2021)1008074图二、 FeNiCS-preCICE适配器的 AP I (摘录)。只要足够短,实际的实现就会被勾画出来为此,适配器提供了store_checkpoint和retrieve_checkpoint方法,它们被设计为使得用户不会意外地破坏或覆盖检查点。转向(第42-43行)。允许控制时间和耦合回路(advance和其他几种)的转向方法都直接转发到preCICE。我们参考preCICE的Python绑定文档了解详细信息。6化。FeNiCS支持基于MPI的分布式内存并行:FeNiCS-preCICE适配器直接支持这种并行化。我们要注意一些必要的实施细节。在大多数情况下,FEniCS的区域分解不会产生所有平行秩都位于耦合边界的情况。然而,为了允许串行和并行情况下的单个实现,适配器对象在所有级别上被创建和初始化。如果秩的域不连接到耦合边界,则秩被认为是不活动的。从适配器的角度来看。另一个技术挑战来自FeNiCS中的幽灵通信层作为有限元方法的标准,域边界处的顶点在所有连接的行列上都是重复然而,只有一个等级拥有特定顶点的所有权。在耦合边界处,只有拥有顶点的秩将其定义为preCICE的耦合网格因此,在适配器中,每个rank只能从其拥有的顶点上的preCICE读取新值。然而,耦合边界条件的重建也需要非所有顶点处的为了在等级之间交换这些值,适配器在从preCICE读取值这里不能使用FeNiCS附带的MPI包装器,因为通信需要在从preCICE读取数据之后和在FeNiCS中更新然而,目前的并行实现由于FEniCS中的已知问题,无法支持并行生成点源对象7此外,并行化目前仅支持2D情况。对于3D并行情况,耦合接口上的节点通常可以由两个以上的进程共享,这需要扩展我们目前对幽灵通信层的处理。6https://github.com/precice/python-bindings。7https://fenicsproject.discourse.group/t/4729。Benjamin Rodenberg,Ishaan Desai,Richard Hertrich etal.软件X 16(2021)1008075×图三. 第2.3节中描述的示例测试用例的强缩放,网格分辨率为3000每个参与者3000个,计算10个时间步长。狄利克雷参与者的时间显示在左边,诺依曼参与者的时间显示在右边。每个参与者使用#个计算节点,每个节点有28个进程。总运行时间被分成每个preCICE、FeNiCS-preCICE和FeNiCS的贡献。对于FeNiCS-preCICE和FeNiCS,我们显示了初始化(init)花费的时间和时间循环内的时间。然而,对于preCICE,适当的区分是具有挑战性的[21]。相反,我们显示了总的运行时间,这是受参与者内的负载不平衡的FEniCS和参与者间的负载不平衡的耦合设置。事实上,狄利克雷参与者需要更多的时间,每个时间步,由于额外的计算热通量。对于preCICE的性能和可扩展性的适当研究,我们参考文献[21,22]。我们观察到,虽然FeNiCS的可扩展性仍然受到相对少量的未知数的影响,但是适配器中花费的时间对于初始化和每个时间步长都很好地扩展,并且与FeNiCS和preCICE相比可以忽略不计由于纯粹的对等概念和数据映射和定点加速的为了研究新的中间层FeNiCS-preCICE是否引入任何有害的开销,我们执行强缩放研究,如图1B所示。3.第三章。我们观察到,在适配器中花费的时间显示出良好的可扩展性,并且与在求解器中花费的时间相比可以忽略不计。2.3. 示例:简单的耦合传热求解器为了完成上一节中对软件架构和API的解释,我们现在展示一个简单但几乎完整的示例应用程序代码solver.py。我们研究的例子是依赖于时间的热方程,并从FEniCS教程中借用[23]。我们定义的平方域的一个边缘作为Dirichlet耦合边界。通过该边界,我们的示例代码可以耦合到另一个也求解时间相关热方程的FEniCS应用代码,这将使整个问题变成简单的分区热方程。可替代地,耦合伙伴也可以是流体求解器,这将导致共轭热传递场景。我们在3.1节中给出了这样一个例子的结果。 设置如图所示。四、在下文中,我们首先简要介绍适配器配置,然后讨论应用程序代码。2.3.1. 适配器的配置图5显示了我们示例的配置文件。耦合参与者被命名为FEniCS和相关联的耦合网格FEniCSMesh。学员从preCICE中读取温度值,并使用它们在耦合边界处构建Dirichlet边界条件。最后,参与者写道热通量值到preCICE,其被明确地计算为温度场的梯度。2.3.2. 应用程序代码图6显示了我们示例的几乎完整的应用程序代码。让我们先来看看FEniCS代码部分。第5行和第6行定义几何图形和网格。然后,第9行和第10行定义了(二次)函数空间以及试验函数和测试函数,然后在第25行中使用这些函数来定义弱形式非耦合边界上的狄利克雷边界条件在第35行中的每个时间步长中求解离散化线性系统突出显示的行显示了与耦合相关的代码。我们在第2行中导入第7行将子域定义为耦合边界。然后,第15行到第18行创建适配器的句柄,使用用于双向耦合的读写函数空间对其进行初始化,并创建Dirichlet耦合边界条件。在第28行中,时间环路控制被移交给preCICE。如果需要,数据检查点写入第29和30行,并读取第40至43行。温度值-在线32中从preCICE读取UE,并在线33中用于更新耦合边界条件。在求解线性系统之后,从新的解中提取热通量(使用第11行的VectorFunctionSpace),并在第36和37行中写入preCICE。最后,提出了实际的耦合。这里,preCICE返回下一个时间步长的上限,这在第34行中强制执行。2.4. 测试FeNiCS-preCICE 适 配 器 的 复 杂 软 件 架 构 首 先 , FeNiCS-preCICE适配器是一个中间软件层-它由FeNiCS应用程序代码调用,并依次调用preCICE(通过其Python绑定)。第二,耦合仿真需要至少两个参与者,因此至少两个分层软件栈,其中FEniCS-preCICE适配器可以是一个或两个的一部分。这两个概念在一般的软件工程中并不罕见。因此,有一些已知的测试技术,如模拟[24]。然而,这些概念对于研究代码来说并不常见,因为研究代码通常只包含独立的可执行文件或库。我们采用两种不同的方法来测试FEniCS-preCICE第一种方法是在一个完整的耦合设置中测试软件。我们耦合两个FEniCS应用程序代码,以保持依赖的数量小。我们采用上一节中刚刚介绍的示例,并将其与对应的示例相– 一个含时的热方程与诺依曼耦合边界条件。然后,我们可以将这个分区热方程的结果与FEniCS中的单域热方程的结果进行比较。然而,我们遵循一种更简单的方法(类似于FeNiCS教程[23]):我们构建一个时间线性依赖和空间二次依赖的人工解决方案由于采用了P2有限元和一阶时间积分,离散化可以恢复精确解。用于任意(粗略)空间和时间分辨率的Tion8唯一含时热方程的解 对于时间积分,采用隐式Euler格式此外,第12行和第13行定义了8关于离散化的细节,请参考[25,第4.1节]。Benjamin Rodenberg,Ishaan Desai,Richard Hertrich etal.软件X 16(2021)1008076见图4。 单位平方,其中热方程由FEniCS参与者求解。Dirichlet边界条件应用于Γ。耦合发生在ΓC上,其中应用另一狄利克雷边界条件,并对热通量进行采样以建立耦合。图五. 适配器配置文件precice-adapter-config.json。剩余的误差分量是耦合误差,它可以通过在每个时间步中的耦合收敛措施来控制。收紧阈值可以减少误差,直到达到机器精度。9在preCICE术语中,我们称这种测试为系统测试,其中多个参与者和preCICE是依赖关系。第二种测试FeNiCS-preCICE适配器的方法为此,我们使用preCICE的Python绑定的模拟版本。这允许我们测试适配器的各个函数,然后调用模拟的虚拟实现,而不是preCICE本身。 为了说明这个概念,图。 7给出了一个关于如何测试适配器函数read_data的示例。第2行导入模拟对象MockedPrecice。在第4行中,我们使用patchfromunittest.mock10用mock对象替换preCICE的实际实现。这意味着在第8行和间接在第9行,导入的不是真正的preCICE,而是mock对象无需在测试系统上安装preCICE即可运行测试。在第13行中,我们 使 用 MagicMock 来 定 义 模 拟 的 preCICE 函 数read_block_scalar_data的行为。然后,我们可以测试read_data是否转换为并返回第22行中的正确数据。MagicMock还允许我们记录模拟函数接收的参数我们终于用这个第28行中的功能也测试preCICE是否从适配器接收到正确的输入参数。9 案例见https://github.com/precice/tutorials/tree/v202104.1。1/分区热传导。10 https://docs.python.org/3/library/unittest.mock.html网站。3. 说明性实例我们给出两个例子来展示如何首先,在第3.1节中,FEniCS中的热传导求解器耦合到OpenFOAM流体求解器以进行共轭传热(CHT)。之后,在第3.2节中,将FEniCS中的线性弹性求解器耦合到SU 2流体求解器以进行我们特意挑选了FeNiCS的两种不同应用(传热和结构力学)和两种不同的耦合伙伴(OpenFOAM,SU2),以显示新适配器的广泛适用性。对于这两种设置,我们使用简单的几何形状。这些几何设置作为preCICE教程提供给许多不同的参与者组合(FeNiCS,OpenFOAM,SU2,deal.II,Nutils , code_aster , CalculiX ) 。 FEniCS–preCICE adapterrelease v1.2.0 以 下 示 例 所 需 的 所 有 软 件都 是 preCICE 发 行 版v202104.1.014的一部分– 除了FEniCS-preCICE3.1. 使用FeNiCS和OpenFOAM的共轭传热作为一个简单的CHT测试案例,我们考虑受[26]启发的加热板15 图8(a)概述域并列出11 https://github.com/precice/fenics-adapter/releases/tag/v1.2.012 https://github.com/precice/precice/releases/tag/v2.2.013 https://github.com/precice/python-bindings/releases/tag/v2.2.0.214 https://github.com/precice/vm/releases/tag/v202104.1.015 https://github.com/precice/tutorials/tree/v202104.1.1/flow-over-heated-车牌。Benjamin Rodenberg,Ishaan Desai,Richard Hertrich etal.软件X 16(2021)1008077见图6。耦合热方程FEniCS应用程序代码。对FeNiCS-preCICE的调用所有物理参数。使用FeNiCS模拟区域下部板中的热传导,使用与第2.3节中已经解释的非常相似的应用程序代码。对在板的顶部,我们用OpenFOAM [5,6]求解器AnchorantPimpleFoam模拟从左到右的 流 体 流 动 。 为 了 耦 合 OpenFOAM , 我 们 使 用 OpenFOAM-preCICE适配器16[27]。我们使用Dirichlet-Neumann耦合:固体参与者(FEniCS)从流体参与者接收温度值,并将其用作耦合界面处的Dirichlet边界条件。流体参与者(OpenFOAM)从固体参与者接收热通量值,并将其用作Neumann边界条件。对于FeNiCS中的Dirichlet边界条件,我们使用如第2.2节所述的FeNiCS表达式。为了映射耦合界面处非匹配网格之间的耦合数据,我们使用最近邻映射(在preCICE中)。图8(b)示出了在接近稳态之后的耦合模拟来验证我们16 https://github.com/precice/openfoam-adapter/releases/tag/v1.0.0网站。结 果 , 我 们 比 较 了 OpenFOAM-FEniCS 耦 合 和 已 经 存 在 的OpenFOAM-OpenFOAM耦合。对于可比的网格分辨率,结果匹配得非常好,见图。8(c).3.2. Fluid–structure作为一个简单的流固耦合试验,我们考虑了一个壁装弹性襟翼在槽道流。图179(a)概述域并列出所有物理参数。为了模拟弹性襟翼,我们使用FeNiCS中的线性弹性代码,该代码在Richard Hertrich的学士论文[ 20 ]中开发,并在流体域中,我们使用SU2 [7]的可压缩欧拉解算器。为了耦合SU 2,我们使用SU 2-preCICE适配器18[29]。我们再次使用17 https://github.com/precice/tutorials/tree/v202104.1.1/perpendicular-flap网站。18 https://github.com/precice/su2-adapter/tree/ab84387网站。Benjamin Rodenberg,Ishaan Desai,Richard Hertrich etal.软件X 16(2021)1008078图7.第一次会议。使 用 模 拟 的 pr e C I C E 实 现 测试F E n i C S - p r e C I C E 适 配 器 的 单个函数read_data。值,并将速度值用作耦合界面处的Dirichlet边界条件。实体参与者 ( FeNiCS ) 接 收 来 自 流 体 参 与 者 的 力 值 , 并 将 其 用 作Neumann边界条件。对于FEniCS中的Neumann边界条件,我们现在使用点源,如2.2节所述。为了映射耦合界面处非匹配网格之间的耦合数据,我们再次使用最近邻映射(在preCICE中)。 图图9(b)示出了梁的最大变形时的流体速度。为了验证我们的结果,我们比较了SU 2-FEniCS耦合到一个已经存在的SU 2-deal。II耦合。我们使用deal.II v9.2 [30]和preCICE-deal.II适配器。[19]对于可比的网格分辨率,结果再次非常匹配,见图10。9 (c)。4. 影响FeNiCS-preCICE适配器仅需几行代码即可将现有的FeNiCS应用程序代码耦合到其他仿真软件。特别是,这适用于已经存在preCICE适配器的仿真软件,如OpenFOAM、SU2或deal. II。应用科学家现在可以从物理角度关注耦合问题,并让机会的增加是双向的:不仅现有的FeNiCS用户现在可以轻松连接到preCICE社区和其他模拟软件,而且其他社区(例如,大型OpenFOAM社区)现在可以直接从FeNiCS中受益。我们想用三个例子来说明机会的范围:在斯图加特大学的1313合作研究中心[31]内,研究了几种多孔介质应用,例如裂缝19 https://github.com/precice/dealii-adapter/tree/685508e网站。和多孔介质。当前的实现基于FeNiCS和preCICE [32],因为与之前基于DUNE [33]的实现相比,它降低了实现障碍。此外,基于FEniCS和preCICE的实现立即使并行计算能力。然而,当前的实现直接从应用程序代码使用preCICE API。使用新的适配器的一些扩展将是必要的,但是,以解决混合维的问题,因为它们出现在流体力学耦合模拟。我们与Helmholtz-Zentrum Geesthacht和HSU Hamburg的研究人员一起,目前正在研究电化学模型与断裂的耦合模拟腐蚀的力学。20对于这两个领域,承诺-[34]或FeNiCS [35]中的代码。与第3节中的两个示例相比,卷耦合将是必要的。但是,由于适配器将耦合条件视为一般FEniCS表达式,因此适配器已经支持卷耦合由FeNiCS-preCICE适配器创建的分层设计这里,适配器和preCICE之间的附加层用于单独实现和测试波形数据结构。鉴于preCICE社区的快速增长和FeNiCS的普及,我们预计在未来几年内对适配器的兴趣会很大。在这个时间点(2021年9月),preCICE被100多个研究小组使用,21个分布在学术界、非学术研究中心和工业界。20 原型实现可在https://github.com/uekerman/Coupled-Brittle-Fracture上获得。21 一些preCICE用户在https://www.precice.org上写了推荐信。···Benjamin Rodenberg,Ishaan Desai,Richard Hertrich etal.软件X 16(2021)10080795. 结论见图8。 共轭热传递测试用例。竞合利益新的软件我们的动机是让现有的FeNiCS用户尽可能容易地进行这种外部耦合。为此,我们隐藏了技术耦合的复杂性,如并行数据结构,数据转换,或检查点,在新的中间软件层。我们能够实现FeNiCS-preCICE作为一个库,并遵循FeNiCS-native风格。这使得FEniCS的用户可以通过添加几行易于理解的代码将现有的FEniCS应用程序代码耦合到其他仿真软件。我们通过将2DFEniCS应用程序代码耦合到OpenFOAM和SU 2来模拟共轭传热和新软件的设计已经设想了未来扩展到其他耦合问题。目前在preCICE本身的工作目标网格粒子耦合。当前版本的新软件的影响应该是巨大的。我们已经提到了两个计划在未来使用该软件的项目:将断裂力学耦合到多孔介质流动和将断裂力学耦合到电化学模型。FeNiCS本身目前正在进行一项名为DOLFIN-X的重大重新设计。初步调查表明,应该可以很容易地端口FeNiCS-preCICEDOLFIN-X,我们希望在未来的作者声明,他们没有已知的竞争性财务利益或个人关系,可能会影响本文报告的工作确认我们感谢隆德大学的Claus Führer和Philipp Birken团队在隆德接待Benjamin Rodenberg,在那里开发了适配器的第一个原型。此外,我们感谢隆德大学的Peter Meisrimel提供的技术支持和关于FEniCS的有益讨论。此外,我们感谢本文的审稿人对论文和软件的批判性评价以及他们宝贵的反馈。本杰明·罗登伯格Benjamin Uekermann的工作得到了由MarieSklodowska-Curie资助协议编号754462下的欧盟Ishaan Desai的工作由 DFG 项 目 preDOM ( 项 目 编 号 391150578 ) 和 SimTech 资 助 。Alexander Jaust 的 工 作 由 DFG SFB 1313 资 助 , 项 目 编 号 为327154368。Benjamin Rodenberg,Ishaan Desai,Richard Hertrich etal.软件X 16(2021)10080710见图9。 流固 耦 合 测 试 用 例 。引用[1] Keyes DE,McInnes LC,Woodward C,Gropp W,Myra E,Pernice M,et al. Multiphysics simulations:Challenges and opportunities. Int JHighPerformanceComputAppl2013;27(1):4-83.http://dx.doi.org/10.1177/1094342012468181.[2] Bungartz H-J , Lindner F , Gatzhammer B , Mehl M , Scheufele K ,Shukaev A,Uekermann B. preCICE -用于多物理场表面耦合的完全并行库。Comput Fluids 2016;141 : 250-8. http://dx.doi.org/10.1016/j 的 网 站 。compfluid.2016.04.003,流体-结构相互作用的进展。[
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 5
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Fisher Iris Setosa数据的主成分分析及可视化- Matlab实现
- 深入理解JavaScript类与面向对象编程
- Argspect-0.0.1版本Python包发布与使用说明
- OpenNetAdmin v09.07.15 PHP项目源码下载
- 掌握Node.js: 构建高性能Web服务器与应用程序
- Matlab矢量绘图工具:polarG函数使用详解
- 实现Vue.js中PDF文件的签名显示功能
- 开源项目PSPSolver:资源约束调度问题求解器库
- 探索vwru系统:大众的虚拟现实招聘平台
- 深入理解cJSON:案例与源文件解析
- 多边形扩展算法在MATLAB中的应用与实现
- 用React类组件创建迷你待办事项列表指南
- Python库setuptools-58.5.3助力高效开发
- fmfiles工具:在MATLAB中查找丢失文件并列出错误
- 老枪二级域名系统PHP源码简易版发布
- 探索DOSGUI开源库:C/C++图形界面开发新篇章
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功