HiSim_Dist
软件架构

本文介绍HiSim分布式并行求解器的基本架构。该软件是一款基于C++开发的高效的、跨平台的、支持超大规模分布式并行的多组分多相渗流数值模拟软件,软件使用通用的组分模型方程和抽象的方法框架设计,面向对象的编程特性使其具备良好的可扩展性和可读性。如图“模拟器顶层架构”所示,在顶层设计上软件包含五大模块:

  1. 前处理模块:负责读入离散网格和油藏参数,并完成网格的并行剖分和油藏信息的分布式部署,负责处理模拟的前置工作。可读入的参数文件包括Eclipse风格的输入文件,Gmsh网格文件。并行剖分部分使用开源软件包ParMetis。
  2. 油藏核心模块:包含了油藏的所有物理信息和相应的模型及对应的求解模块,如PVT模块,相渗模块,岩石模块,流动模块和井模块等,是模拟器的核心部件。
  3. 求解模块:含有针对不同问题的求解器,如等温求解器和非等温求解器,这些求解器负责提供和调度求解方法,如半隐式方法,全隐式方法,自适应隐式方法等,各方法协作油藏核心模块中的各子模块完成模拟流程。
  4. 求解控制模块:负责对求解过程进行控制,包括时间步长的选择,非线性迭代的求解和收敛控制;
  5. 后处理模块:负责将所需的结果输出以便于后续的结果可视化和数据分析,目前可以输出描述所有油藏网格物理信息动态变化的vtk格式的文件,反映油藏整体状态和井性能的Eclipse风格的SUMMARY文件,助于运行时求解分析的FastReivew文件以及反映并行效率负载均衡的statistic文件。
模拟器顶层架构

基于面向对象的编程设计思想,这些模块内部由许多大小不同的模块嵌套而成,且大部分模块都拥有统一的设计语言,如图2所示,这极大增强了模块的可复用性和程序的可读性。外部调用接口明确了该模块的功能职责以及与外部的交互方式;模块中还有公用数据集,里面存放的数据是该模块各方法计算的结果,会被用于其它模块的计算过程;关联模块集是指当前模块需要与之协作计算的模块集合,如果关联模块的公用数据集需要被不同实体共享使用,则该模块需以指针形式存放于当前模块,否则可以以实体形式存放;抽象方法集包含了针对该模块求解的各类模型与计算方法,这些方法中还存储了与该方法相关的专属参数,不同方法拥有统一的使用接口,它们读入公用数据集,必要时结合关联模块集,完成计算后将结果返回到自己的数据集进行存储。模块中方法抽象化的设计不仅增强了程序的可读性、可维护性,使得程序更加简练,其目的更在于便利了不同模块之间的不同方法的相互协作。

软件中模块的统一设计语言

软件的并行模拟流程如下图所示,其中绿色块表示由主进程串行完成,红色块表示由所有进程并行完成。首先由主进程串行读入网格文件,构建活跃网格的连接关系后得到初始剖分,分发给各个进程,之后使用ParMetis进行并行剖分,剖分规则遵循均匀划分和负载均衡的原则,剖分完成后各进程建立通信机制,随后由主进程将网格的油藏信息,连接关系发放给各个进程,至此前处理模块完成。之后进入并行求解模块,各进程并行执行矩阵组装,油藏更新,并在必要的时候进行数据交换,如线性矩阵求解完交换边界的解,油藏状态检查时同步检查状态等。模拟完成后各进程将自身所负责的区域结果输出并由主进程根据各进程的输出结果完成整合。需要提及的是,由于油藏输入文件中关键字的多样性,关键字内容的复杂性,以及关键字间的关联性,想要高效地并行读入这类文件几乎成为不可能,再考虑到对工业级输入的兼容性,因此采用串行读入的方式是必要的。当网格规模达到十亿及以上规模时,串行前处理会在内存和效率上展现出一定的劣势。

并行模拟器求解流程

作为油藏模拟的核心,PVT模块负责计算流体的静态混合性质,一方面,该模块的功能可扩展性决定了模拟器能够适应多少种不同混合物的模拟;另一方面,其计算效率和计算质量对模拟的效率和稳健性有着至关重要的影响。本软件的PVT模块设计如图“并行模拟器的PVT模块设计”所示PVTNUM数组存储了每个网格所属的PVT区域,也即适用的PVT模型,每个进程会计算分布在其上的网格块内流体的PVT性质。MixtureUnits作为完整的PVT计算单元,其核心是负责计算混合物静态混合性质的mixture模块,这是一个抽象基类,其下包括了负责EOS类混合模型的相平衡计算的mixtureComp类,以及通过K-值表获取混合性质的mixtureK类。

并行模拟器的PVT模块设计

线性求解是数值模拟的心脏,其计算时间占总模拟时间的比例往往高达70%-80。因此,设计高效灵活的线性求解模块非常关键,对内要便于离散矩阵的并行组装,适应不同离散方法的需求,对外要能够灵活地转化为目标解法器所需要的格式。软件的线性求解模块如图“并行模拟器的线性求解模块设计”所示。

并行模拟器的线性求解模块设计

线性求解模块包含三个子模块:负责存储内部矩阵的内部矩阵模块,采用分段的BSR/CSR结构存储,对问题,方法以及格式转换都有良好的适应能力;存储了网格剖分和进程通信的Domain模块,在必要时辅助计算矩阵的全局变量等信息;以及抽象解法器模块,它负责对外部解法器包提供调用接口,方便对不同解法器包的灵活调用。在并行实现中,每个进程负责存储属于它的网格块的矩阵的行,如下图所示,因此所有进程的矩阵拼凑在一起就成为了完整的大矩阵,并且没有精度丢失。

并行模拟器的矩阵并行组装和存储