首页/文章/ 详情

高效CFD代码开发:编译型、解释型和JIT语言哪一种好?

1月前浏览1466

在计算流体动力学(CFD)等领域进行计算模拟或者开发求解器时,选择合适的编程语言至关重要。所选语言可以显著影响模拟的性能、开发过程和整体效率。因此,理解编程语言之间的细微差别变得非常重要。


一、计算模拟中选择正确编程语言的重要性


     

   

编程世界提供了广泛的选择,每种语言都有其自身的优势和劣势。通过仔细考虑您的CFD应用程序的特定要求,您可以就使用哪种语言做出明智的决定。必须考虑计算需求、开发资源、项目目标和平台考虑等因素。


二、编译型、解释型和即时编译(JIT)语言的差异


     

   

在深入了解CFD编程语言的细节之前,了解编译型、解释型和即时编译(JIT)语言之间的基本差异非常重要。

  1. 编译型语言:编译型语言是在执行前将源代码翻译成机器代码的语言。这种转换由编译器执行,生成一个可执行文件,可以直接在目标平台上运行。在CFD领域中流行的编译型语言包括Fortran、C和C++

  2. 解释型语言:另一方面,解释型语言直接执行源代码,无需事先编译。解释器逐行读取并执行代码。Python和MATLAB是CFD领域广泛使用的知名解释型语言。

  3. 即时编译(JIT)语言:JIT编译语言结合了编译型和解释型语言的元素。它们最初使用解释器执行代码,但在运行时,它们还对某些代码段进行动态编译成机器代码,优化性能。JIT编译对于计算密集型任务特别有益。在CFD中使用的JIT编译语言的例子包括C#、Julia和Java(带有V8等JIT编译器)。

理解这些差异至关重要,因为它影响CFD模拟的各个方面,包括性能、执行速度、可移植性和开发过程。通过根据您的特定要求选择最合适的编程语言,您可以优化模拟的效率和生产力。

在接下来的部分中,我们将探讨编译型和解释型语言,探索它们在CFD应用中的特性、优势和劣势。我们还将研究即时编译的作用以及它如何弥合编译型和解释型语言之间的差距,为CFD应用提供潜在的性能优势。


三、编译型编程语言


     

   

编译型编程语言在CFD中提供高性能和高效率例子包括Fortran、C、C++。它们在执行速度方面是黄金标准,但可能需要为不同的平台重新编译。开发和调试过程可能更加复杂。

3.1 编译型语言的定义和特性


   


编译型语言是执行前经过编译过程的编程语言。在这个过程中,源代码被编译器翻译成特定于目标平台的机器代码。生成的编译程序可以直接执行,提供高水平的性能和效率。编译型语言的主要特点包括:

  1. 效率:编译型语言以其高执行速度和效率而闻名。由于代码被转换为机器代码,可以直接被计算机硬件理解,因此可以充分利用系统资源,实现更快的执行时间。

  2. 强类型:编译型语言通常强制执行严格的数据类型检查。这意味着变量和数据结构必须明确定义,允许在编译过程中更好地检测错误。

3.2 CFD中流行的编译型语言示例


   


在计算流体动力学领域,由于它们的性能和计算能力,几种编译型编程语言已经获得了显著的地位。一些值得注意的例子包括:

  1. Fortran:Fortran(Formula Translation的缩写)在科学计算和CFD中有着悠久的历史。它高效的数组处理和数学库使其非常适合数值密集型模拟。大多数遗留代码仍然使用Fortran,上次你查看天气预报时看到的结果可能来自Fortran代码库。Fortran的示例代码包括NASA的CFL3D和FUN3D求解器

  2. C和C++:C及其面向对象的扩展C++由于它们的低级控制和卓越性能,在CFD中被广泛使用。它们提供了广泛的库,允许高效的内存管理和与系统硬件的紧密交互。现在较新的CFD代码主要是用C++(如OpenFOAM、SU2)和C(如code_saturne)编写的。

3.3 编译型语言的优势和劣势


   


  1. 性能和执行速度:编译型语言的主要优势是它们的高性能。通过直接将代码翻译成机器指令,编译型语言可以优化计算任务,实现CFD模拟的更快执行时间。

  2. 可移植性和平台依赖性:编译型语言的一个挑战是它们的平台依赖性。由于编译代码特定于目标平台,可能需要重新编译或修改才能在不同的操作系统(Windows、macOS、UNIX(Linux))或硬件架构(32位vs64位)上运行。然而,这种负担可以通过使用平台 独立的编译器和构建系统来减轻。

  3. 开发和调试过程:虽然编译型语言提供了高性能,但与解释型语言相比,开发和调试过程有时可能更加复杂。编译错误可能在构建过程中发生,需要仔细注意语法、类型检查和链接。调试编译型代码也可能需要更多的努力,因为低级访问和潜在的优化复杂性。小型代码库可能编译得快,但大型代码编译可能需要几分钟甚至几小时,需要进一步的策略来分块编译而不是整个代码库。

尽管存在这些挑战,由于它们的性能优势和科学计算优化库的可用性,编译型语言仍然是CFD领域的流行选择。CFD模拟计算成本高,我们似乎总是需要比可用的计算资源更多的资源。性能是关键,作为一个好的CFD工程师,你需要至少精通一种编译型语言。C++是目前的流行选择,尽管学习曲线陡峭,特别是面向对象部分及其不断增长的复杂性,但了解C++在行业中被认为是一种资产。它通常排在最受欢迎和使用最多的编程语言前五名,并且有其庞大的指导委员会支持,C++在不久的将来不太可能改变。


四、解释型编程语言


     

   

像Python和MATLAB这样的解释型编程语言在CFD中也被广泛使用它们提供了灵活性、可移植性和易用性虽然它们的执行速度可能较慢,但像即时编译(JIT)这样的进步可以提高性能。

4.1 解释型语言的定义和特性


   


解释型语言是直接执行源代码而无需事先编译的编程语言。它们不生成可执行文件,而是在运行时由解释器逐行读取和处理代码。这种解释性方法提供了某些特性:

  1. 灵活性:解释型语言以其灵活性和动态性而闻名。它们允许交互式开发,并支持动态类型(变量可以改变其类型,例如从字符串变为浮点数)和运行时代码修改,这可以提高生产力和易用性。

  2. 可移植性:解释型语言通常比编译型语言更可移植。由于源代码是被解释而不是编译成特定于平台的机器代码,解释程序可以在不同的平台上运行,无需重新编译。

4.2 CFD中流行的解释型语言示例


   


由于它们的易于实现和广泛的库,几种解释型编程语言已经得到了广泛的使用。一些突出的例子包括:

  1. Python:Python是一种多才多艺且被广泛采用的解释型语言,在科学计算和CFD中。它的简单性、可读性和广泛的库生态系统(例如NumPy、SciPy)使其成为CFD中原型设计、数据分析和可视化任务的理想选择。Python的大多数科学包(例如NumPy)是用编译型语言实现的,提供与编译型语言相似的速度,因此这些包可以大大提高底层Python代码的性能。

  2. MATLAB:MATLAB是一种在包括CFD在内的各种科学和工程领域广泛使用的解释型语言。它提供了强大的矩阵操作能力、丰富的可视化工具和为数值计算量身定制的众多专业工具箱。其语言语法类似于C编程,并且它提供了一个丰富的用户界面,可以在其中键入MATLAB代码。

4.3 解释型语言的优势和劣势


   



  1. 性能和执行速度:由于需要运行时解释,解释型语言通常比它们的编译型对应物慢。如上所述,解释型语言可能通过用编译型语言实现的包和库提供性能提升,这消除了解释型语言的一些劣势。然而,这将引入轻微的开销,这些解释型语言总是比纯编译型语言慢。

  2. 可移植性和平台 独立性:解释型语言在可移植性方面表现出色。由于代码是被解释而不是编译成机器代码,程序可以轻松地在不同的平台上运行,最小化修改,增强了可移植性并减少了平台依赖性。

  3. 开发和调试过程:解释型语言通常提供更用户友好的开发体验。它们通常具有更简单的语法、动态类型和交互式环境,实现快速原型设计、探索和调试。然而,缺少编译步骤可能会将错误检测延迟到运行时。

尽管可能存在性能限制,但由于它们的易用性、原型设计能力和广泛的库,解释型语言在CFD中已经获得了流行。它们的灵活性和可移植性使它们适合广泛的应用。


五、即时编译(JIT)


     

   

即时编译(JIT)通过在运行时动态编译代码段来提高CFD的性能它提供了性能改进、动态优化,但也带来了初始化开销。JIT编译是优化解释型语言中CFD模拟的有价值工具。

5.1 JIT编译的解释及其在编程语言中的作用


   



即时编译(JIT)是一种结合了编译型和解释型语言元素的技术。它旨在通过在运行时动态编译代码的某些部分来提高解释型语言的性能。这一过程弥合了解释型和编译型语言之间的差距,提供了性能优势,同时保留了解释的灵活性。

5.2 JIT编译在实践中的工作原理


   


在实践中,JIT编译涉及几个步骤:

  1. 初始解释:源代码最初由解释器解释和执行。

  2. 分析和识别:在执行期间,JIT编译器分析代码,识别热点——频繁执行并可能从编译中受益的代码段。

  3. 即时编译:当识别到热点时,相应的代码被动态编译成机器代码。这个编译版本替换了解释的代码,提高了该代码段后续执行的性能。典型的例子是耗时较长的循环,例如时间和空间循环。

  4. 动态优化:JIT编译器可以根据运行时信息对编译的代码应用进一步的优化。这包括内联函数调用、消除冗余计算和优化内存访问模式。

5.3 CFD中流行的JIT编译语言示例


   



CFD代码主要是用编译型或解释型语言编写的。然而,在某些边缘情况下,JIT编译语言可能是一个不错的选择。下面的列表提供了合适的候选概述:

  1. Julia:Julia是一种高级、高性能的编程语言,专门设计用于数值和科学计算。凭借其内置的即时编译(JIT),Julia提供了快速的执行速度、动态类型和用户友好的语法,使其成为CFD模拟的理想选择。

  2. C#:C Sharp是由微软开发的现代、面向对象的编程语言。它结合了静态类型的能力和JIT编译的灵活性。C#提供了丰富的功能集,包括内存管理、与.NET框架的强大集成和广泛的社区支持,使其成为需要性能和生产力的CFD应用的可行选择。但是,如果您想充分利用它,您必须在Windows上开发。

  3. Python:等等,你不是说Python是解释型的吗?是的,它是,但它丰富的生态系统意味着我们也可以通过像Numba或PyPy这样的包获得JIT编译。这些包在Python中启用了JIT编译,允许我们在继续使用Python提供的所有其他功能的同时享受性能提升的好处。

5.4 JIT编译在CFD应用中的优势和劣势


   


  1. 性能提升:JIT编译可以显著提高用解释型语言编写的CFD应用的性能。通过选择性地编译热点,计算密集型代码段可以以接近编译型语言的速度执行。这使得模拟和数据分析更快。

  2. 动态优化:JIT编译器的优势在于能够适应运行时条件。它们可以根据分析信息动态优化代码,通过定制编译代码以适应特定的执行环境来提高性能。这可以导致有效的内存使用和更好的硬件资源利用。

  3. 开销和初始化时间:JIT编译在程序的初始执行期间引入开销,因为编译器需要分析和编译代码。这可能导致与纯解释型语言相比增加的初始化时间。然而,编译代码的后续运行不会受到这种开销的影响,整体性能提升可以超过初始成本。

尽管JIT编译提供了显著的优势,但必须考虑潜在的缺点:

  1. 内存消耗:JIT编译器在运行时生成编译代码,导致与纯解释执行相比增加的内存消耗。当处理需要有效内存管理的大型CFD模拟时,这可能是一个考虑因素。

  2. 预热期:JIT编译器通常需要一个预热期来识别和编译热点。最初,解释的代码可能较慢,直到JIT编译器收集了足够的分析数据来优化性能。这个预热期可能影响短命程序的性能或在需要快速执行的情况下的性能。

总的来说,JIT编译可以是优化用解释型语言编写的CFD应用性能的有价值工具。它在运行时动态编译和优化代码的能力提供了性能和灵活性之间的平衡。然而,尽管上述列出的一些优势,JIT编译语言很少用于编写CFD求解器。


总结


     

   

理解编译型和解释型语言之间的权衡对于在CFD应用中做出明智的决策至关重要。编译型语言在性能和执行速度方面表现出色,使它们成为计算密集型模拟的理想选择。解释型语言提供了灵活性、易用性和快速原型设计能力即时编译语言提供了这些语言之间的一条路径,从程序员那里拿走了识别计算热点的负担,同时提供了与解释型语言相同的灵活性。


最终,选择权在您手中,将取决于您的项目。然而,我对这个问题有自己的看法,我强烈认为你需要知道如何使用C++如果你对C++开发是认真的,这是你可以做出的最好的投资来提升你的简历。






来源:CFD饭圈
FluentCFXOpenFOAM燃烧MATLABPolyflow控制
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-09-08
最近编辑:1月前
CFD饭圈
硕士 分享CFD文章,感谢关注
获赞 27粉丝 27文章 378课程 0
点赞
收藏
作者推荐

【经典教材翻译】3-流体的理想气体、体变模量、蒸汽压力、表面张力和毛细力

1、理想气体定律 气体的压力、密度和温度通过一个状态方程相互关联。在空气的普通条件下,其中 P 是绝对压力,ρ 是密度,T 是绝对温度,R 是气体常数。上述方程称为理想气体定律或完美气体方程。遵守这个方程的气体称为理想气体。理想气体定律的气体常数 R 由给出,其中 ℝ 是称为通用气体常数,等于 8314 J/kg.K,M 是气体的摩尔质量。对于空气,气体常数 R = 286.9 J/kg.K。 2、体变模量,Ev 体变模量bulk modulus决定了流体的可压缩性。换句话说,它是流体在受到压力时密度变化的量度。它定义为 其中 dP 是为了使体积改变 dVi 所需的压力变化,Vi 是初始体积。负号表示压力的增加伴随着体积的减少。体变模量的量纲是 FL^-2;单位是 N/m^2。体变模量较高的值表明压缩流体很困难。例如,水的体变模量是 2.15 x 10^9 N/m^2,这意味着需要巨大的压力才能稍微改变水的体积。在所有实际目的中,水(和许多其他液体)被视为不可压缩的。 3、气体的体变模量 气体有一个将压力、密度和温度联系起来的状态方程。这使我们能够推导出压力和密度之间的显式关系。这样的关系取决于正在考虑的过程——等温(isothermal,在恒定温度下)或等熵(isentropic,在恒定熵下)。方程是和其中 k 是在恒定压力下特定的热容,Cp 与在恒定体积下的特定热容,Cv 的比率。另外 其中 R 是气体常数。在普通条件下,空气的 k = 1.4。通过将定义代入体变模量,Ev = P 对于等温过程Ev = kP 对于等熵过程因此,我们看到气体的体变模量取决于其压力。鉴于在标准温度和压力条件下,空气的大气压力为 1.01325 x 10^5 N/m^2,体变模量是同一量级,而水的为 2.15 x 10^9 N/m^2。这些数字表明,空气大约是水的 15,000 倍可压缩。 4、蒸汽压力 当液体暴露于大气中时,分子从其表面以蒸汽形式逸出。如果将液体置于封闭容器中,这种活动持续进行,以至于蒸汽填充了液体水平面和容器之间的空间。产生的压力达到平衡。蒸汽被认为已饱和。它对液体表面施加的压力是蒸汽压力。 5、表面张力,σ 表面张力作用于两种不相混合的液体之间或液体和气体之间,即水和空气之间。两种流体之间的界面假定像处于拉伸应力下的拉伸膜一样。这种应力是保持膜位置所需的。在日常生活中可以找到许多表面张力影响的例子。钢针会因水面上发展出的明显张力而浮在水上。水珠在光滑表面上形成。当汞倒在光滑表面上时,会形成微小的球形。在界面上作用于液体分子的未平衡的内聚力由表面张力产生的拉力平衡。表面张力,σ,表示为单位距离的力(N/m),量纲为 FL^-1。它的大小取决于接触的两种流体和温度。 6、液滴内的压力 正是由于表面张力,液滴内部的液体压力会增加。考虑下图所示的气泡的自由体图。如果边缘处的表面张力力与气泡内部的压力力平衡,我们有 即,其中 P 是液滴内部与外部之间的压力差。此外,液滴内部的压力大于外部的压力。 7、毛细管 如果将一个小开口管插入装有水的容器中,水会上升到管中。形成了一个液-气-固界面。在这种情况下,固体和水之间的吸附力或粘附力很强,能够克服液体分子之间的相互内聚力。这就是水上升到管中的原因。液体被认为润湿了表面。液体柱的高度与表面张力、管半径、液体的比重量和液体与管之间的接触角 θ 有关。由于表面张力产生的垂直力 2πRσcos(θ) 和流体的重量 γπR^2h,将彼此平衡。 或可以看出,如果管半径小,毛细上升 h 就会很明显。也就是说,管越窄,流体在其中上升的高度就越高。流体是否在毛细管中上升取决于上图所示的接触角 (θ)。这是固体和液体表面之间的角度。当这个角度小于 90° 时,表面张力就会把流体拉过管子。存在一个向上凹的液面(meniscus)。液体被认为润湿了表面。但是,当角度大于 90° 时,如与汞发生的情况一样,液位实际上被压低了,液体不润湿表面。 来源:CFD饭圈

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈