插件技术在储层建模系统的应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

插件技术在储层建模系统的应用

摘要:插件技术的本质是在不修改程序主体的情况下对软件功能进行加强与扩充,可以通过制作插件来增加一些新功能。介绍了插件技术在储层建模系统中应用的基本设计思想与实现,以策略模式为基础,实现了插件接口,构建了插件式开发框架,增强了系统扩展性,使系统更易维护与复用;同时通过插件应用实例的介绍,给出了插件技术在储层建模系统中的实现方法。

关键词:插件技术;储层建模;策略模式;接口;框架

插件技术是一种组件复用的技术。近年来人们受到硬插件技术的启发,即计算机的硬件设备是由许多插件板连接而成的,而这些插件板又是将许多具有独立功能的集成电路插件按插件板的设计要求组装连接而成的,各种插件通过总线使其能够相互通信、协同工作。软件开发中插件技术的基本工作原理是:系统框架由宿主程序、接口和插件3部分组成,宿主程序负责插件之间的通信和相互操作,接口负责插件注册、卸载、插件的设置、初始化、启动、关闭工作。插件就是普通的程序,可以完成某种功能。由于对插件接口制定了统一的规范,用户可以根据自己的需要制作功能插件,通过接口集成到系统框架中去。修改或卸载某个功能插件,而宿主程序不用修改口。通过这种技术,增强软件的灵活性和可扩展性,使得软件复用性大大提高。

一般来说插件可以分为3类:①声明式插件;②组件式插件;

③接口式插件。本文主要研究的是接口式插件。插件自身不能独立运行,但是它通过宏定义输出函数或类,通过其它能独立的程序(宿主程序)调用它的内部功能。此类功能插件可以通过统一的插件接口契约,解析符号获得插件中的函数签名,由宿主程序对插件继承接口的合法性作出判断后,在恰当的时间点调用它们,对于失效的或者用户暂时不需要的功能插件,可以进行卸载,这样可以有效降低系统框架的维护功能插件的复杂度。

1基于储层建模系统框架设计

储层建模系统,正式名为“储层地质统计分析系统GASOR”(Geostatistical Analysis System of Reservoir)包含十二个基本模块,具有15万行以上代码量,研发此软件始于1985年,至1995年完成了GASOR1.0的版本,受到国家自然科学基金项目资助,并与大庆、胜利等油田进行了合作研究,在系统主体功能已经相对完善的情况下,面对用户的新需求,将近几年研发出来的新功能模块加入到系统中,因此,我们搭建了插件式开发框架,插件式框架主要包含以下4个模块:插件管理模块、界面管理模块、类型库管理模块和接口管理模块,系统基本框架图如图1所示:图1基本框架

1.1插件管理模块

插件管理模块,该模块定义了插件类型库,主要功能是维护管理插件加载或卸载。插件库在运行状态下查询实例化插件

接口的实现类等。该模块是其他功能模块的基础,其他模块在实现其功能时需要依赖于它。平台核心模块包括的主要功能为:插件接口有效性检查、插件信息识别、插件注册与卸载。

1.2界面管理模块

界面管理模块主要完成插件界面的动态加载,将系统需要的插件界面动态地加入到主界面。

1.3类型库管理模块

类型库管理模块的主要功能是:插件类型库是为记录插件类型信息,宿主程序启动时检索插件信息,并根据预定的插件接口装载插件。通过类型库管理模块,可以将我们的网格粗化插件等需要扩充的功能模块插件加载到系统。

1.4接口管理模块

此模块是基于策略模式实现的插件接口如图2。在C++实现中,abstract_interface虚基类是插件技术开发的重要类,任何需要被框架程序直接识别的插件类必须继承该类。在实现过程中name()、initial()、execute()是必须实现,在插件库注册的函数create()是必须实现的。

图2策略模式的插件接口

2主要实现代码

2.1插件注册实现

#define PLUS_IN(CLASSNAME) \//宏定义

{ \

log << "\n\n registering plus " << #CLASSNAME << "\n"; \// 输出注册信息

SmartPtr ni = \// 类型库信息

Root::instance()->interface( control_manager ); \

Manager* dir = dynamic_cast( ni.raw_ptr() ); \

if( !dir ) { \

log << "Directory " << control_manager << " does not exist \n"; \

return 1; \

} \

CLASSNAME toto; \

dir>factory( (),CLASSNAME##::create ); \// 向types_info类型库注册

} \

#if defined(_WIN32) || defined(WIN32)

#define GEOSTAT_PLUGIN(CLASSNAME)\

extern "C" __declspec(dllexport) int plugin_init() { \// 宏定义注册插件

PLUS_IN(CLASSNAME) \// extern "C"解决名字不匹配问题

return 0; \

}\

#else

#define GEOSTAT_PLUGIN(CLASSNAME)\

extern "C" int plugin_init() { \/ 宏定义注册插件

PLUS_IN(CLASSNAME) \

return 0; \

}\

#endif

2.2用户自定义插件实现

class __declspec(dllexport) plus_1:public abtract_interface // 继承接口类

{ public:

static Named_interface* create (std::string&); // 必须实现的接口,注册时调用

virtual bool initialize();// 必须实现的接口,算法初始化

virtual int execute(); // 必须实现的接口,算法调用

virtual std::string name() const { return " plus_1"; }// 必须实现的接口,查询调用

}

3结束语

本文基于储层建模系统构建了基于插件式的开发框架,通过实践证明是可行的。通过插件技术,很好地将地震解释模块、网

相关文档
最新文档