基于MATCOM 平台的VC++与MATLAB混合编程地震正演模拟(完整版)

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

基于MATCOM 平台的VC++与MATLAB混合编程地震正演模拟
摘要:正演模拟是地震勘探的重要方法之一。

为解决基于Matcom4.5的VC++与Matlab接口程序的地震正演模拟问题,通过用Matcom4.5与VC++结合编程的新方法实现EDA介质中的地震波正演模拟的实例,结果显示通过Matcom实现VC++与Matlab混合编程的可行性并提高了编程效率。

关键词: Matcom;VC++; Matlab;混合编程;正演模拟
MIXED PROGRAMMING OF SEISMIC FORW ARD MODELING BETWEEN VC++
Abstract: Forward modeling is one of the important means in seismic exploration. This paper in order to solve the interface program of seismic forward modeling between Matlab and VC++ based on Matcom4.5,by using an example which achieved the results of simulate the wave equation in EDA media by a new method which is mixed programming between Matcom4.5 and VC++,the results show the advantage of efficiency by mixed programming between Matlab and VC++ based on Matcom4.5.
Keywords: Matcom;VC++;Matlab;Mixed programming;Forward modeling
0引言
近年来,随着勘探程度深入化和勘探目标的复杂化,地震勘探无论在采集、处理还是解释技术方面都面临越来越多的挑战。

复杂构造油气田、岩性油气藏和裂缝性油气藏等隐蔽性油气藏的勘探与开发越来越受到地球物理工作者的重视。

为此,需要发展复杂介质的地震波传播理论,使其进一步接近地下介质的实际情况。

正演模拟研究对复杂介质中波的传播具有指导意义[1]。

目前在地震数据处理中应用比较广泛的软件是MATLAB,但由于MATLAB本身的程序编写的一些局限,使得它在处理许多应用问题时灵活性不够。

本文引入MATCOM软件平台,它的功能相当强大,可提供近千个MATLAB的基本功能函数,通过必要的设置,可以直接实现与C++的混合编程,而不必再依赖MATLAB;笔者基于MATCOM4.5的VC++与MATLAB的接口技术实现EDA介质中的地震波正演模拟,此方法提高了代码的使用效率,说明MATCOM与VC++混合编程的可行性,取得较好的效果,为技术人员提供了另一种实现正演模拟的途径,同时也为开展相应其他研究工作奠定了基础[2]。

1VC++与MATLAB接口
Visual C++是Windows平台下主要的应用程序开发环境之一,它能方便地实现软件开发,开发的系统具有界面友好、执行速度快、易维护和升级等优点。

C++
与其他高级语言相比具有很高的编译效率。

但在地震信号的图形、图像处理一类的应用中,当程序中涉及到对矩阵的运算时,编程就变得非常复杂。

MATLAB是Mathworks公司推出的数学软件,它将数值分析、矩阵计算、信号处理和图形显示结合在一起,包含大量高度集成的函数可供调用,命令语句功能十分强大,在地震数据的计算、图形和图像处理方面,MATLAB具有其他软件无法比拟的优势。

但是MATLAB使用的是解释性语言,大大限制了它的执行速度,并且源代码的公开不利于算法和数据的保密,局限于MATLAB运行环境而不能用于开发商业软件。

采用VC++和MATLAB混合编程,可以实现两者的优势互补,提高对地震数据处理的效率,具有更广泛的使用范围,为科学研究和工程技术提供更强的技术支持。

MATLAB开发环境提供了丰富的应用接口程序(API)函数库,包括MAT函数库、MEX函数库、MX函数库、Engine函数库,实现与其他工作环境的接口[3]。

1.1 通用VC++与MATLAB接口技术
1.1.1 MATLAB编译器(compiler)
使用MATLAB Compiler可以将M文件转化为C、C++和MEX文件。

首先使用mex -setup和mbuild -setup命令配置MATLAB Compiler的编译环境,使用mcc 命令将m文件转化为可独立于MATLAB开发环境的动态链接库文件(dll文件)和.exe文件。

在充分熟悉MATLAB开发环境的C/C++数学库前提下,可以实现在C++语言中直接调用MATLAB的C/C++数学库相关命令,从而优化mcc命令自动编译生成的C、C++程序代码。

但是这种方法不能处理嵌套调用脚本m文件,不支持MATLAB对象,不能编译MATLAB的一些内联函数,并且转换代码的可读性较差。

1.1.2 MATLAB引擎技术
MATLAB应用程序接口(API)同时提供了一组引擎函数来启动和调用MATLAB 函数。

通过MATLAB引擎技术,可以保持C++编程语言的高效性并可以直接调用MATLAB丰富的工程应用函数,包括复杂的数学分析和信号处理函数等。

MATLAB Engine采用客户机/服务器模式,C/C++程序作为前台客户机,MATLAB作为计算引擎,利用Engine实现MATLAB的强大功能,引擎程序和C++程序各自作为一个进程单独运行,通过进程间的通信机制进行交互。

这种方法,需要在机器上安装MATLAB软件,而且程序执行效率低。

1.1.3 直接调用MATLAB C/C++ Math Library数学函数库
MATLAB中提供了可以供C/C++语言调用的C/C++数学函数库,在VC++中可以直接使用这些函数[4]。

但使用这种方法调用MATLAB的工具箱函数有很大困难,适合对C/C++语言比较熟悉的用户使用,且不支持MATLAB中丰富的图形句柄处理函数。

1.2 MATCOM实现MATLAB与Visual C++接口
当前MATCOM的最高版本是MATCOM4.5版本,可以支持与Visual C++的混合代码编译。

MATCOM提供了Visual MATCOM工具来实现在Visual C++环境下编译、运行MATLAB的m文件,MATCOM是一个非常有用的.m文件编译器,它有4大优点:①MATCOM是MATHTOOL公司推出的一种MATLAB编译平台,可以对MATLAB函数进行文本编译、直接运行,或者将MATLAB开发环境的m文件编译成.exe文件和.dll 文件,它与VC++有良好的接口,只要包含必要的库文件和头文件即可实现对MATLAB函数的调用,而无需运行MATLAB。

MATCOM转换过程简单,不仅可以转换独立的脚本文件,也可以转换嵌套脚本文件,它还支持一定的图形显示;②在Visual C++中启用Visual MATCOM Add-in插件,可以直接将MATLAB的m文件导入Visual C++环境中,并自动转化为对应的.h头文件和.cpp文件,与MATLAB 自带的编译器(Compiler)相比,MATCOM将m文件转化后的.cpp文件简单、易读,程序代码可读性好;③MATCOM提供了.m文件的方便快捷的编译调试环境,可以使用step、watch、breakpoint等各种调试手段;④MATCOM同时也提供了自带的Matrix <LIB> C++数学库,该数学库包含众多的数学函数,可以实现在Visual C++中使用这些数据函数进行数学分析、信号处理和图像处理等,使用Matrix<LIB>的C++数学库进行C++编程可以极大提高程序代码效率。

MATCOM的矩阵运算部分是基于一个名为Matrix<lib>的C++数学库,这个库提供了绝大多数的关于矩阵类、矩阵操作函数、数值计算函数、数学函数等的定义,在MATCOM中是以lib目录下的*.lib以及windows/system/对应名称的dll 文件提供的。

MATCOM的另一大部分就是图形部分,它是用一种非常流行的绘图OCX控件Teechart来实现的,这种控件对于一般的绘图功能都可以实现,但也存在一定缺陷。

绘图函数功能主要在lib文件和window/system/ago*.dll中定义[5]。

MATCOM编译.m文件时先将.m文件按照与MATCOM的cpp库的对应关系,翻译为cpp源代码,然后用对应版本的C编译器将该cpp文件编译为exe或dll文件,所以,在第一次运行时指定C Compiler的路径是必需的,否则将无法编译。

指定好的C Compiler信息写在Matcom/bin/matcom.ini文件中。

以MATCOM4.5、MATLAB2010b、VC++6.0和Windows7操作系统为例,Visual MATCOM的安装过程为:①安装MATCOM4.5;②拷贝<MATCOM45>\bin\usertype.dat文件到<Visual C++ 6.0>\ Common\ MSDev98\Bin目录下(<MATCOM45>、<Visual C++6.0>分别指MATCOM4.5和VC++6.0的安装路径);③运行Visual C++6.0,从菜单条中选择“工具/定制/附加项和宏文件”,选择“浏览”,改变文件类型为Add-ins(.dll),选定<MATCOM45>\ bin\mveide.dll文件,确信Visual MATCOM Add-in被选定,点击“关闭”;④此时,可以在Visual C++的开发环境中看到Visual MATCOM工具栏,表明安装成功;⑤点击VC环境中Visual MATCOM工具栏第一个或第二个按钮实现m文件向C/C++文件的转换[6-8]。

2基于MATCOM的EDA介质中的地震波正演模拟实例
地震波正演模拟是研究复杂地层的重要手段。

数值模拟的方法主要有两类:波动方程法和几何射线法。

波动方程数值模拟实质是求解波动方程,它模拟的地震波场包含了地震波传播的所有信息,为研究地震波的传播机理和复杂地层的解释提供了更多的佐证,所以波动方程数值模拟方法在地震模拟中占有更重要的地位[9]。

2.1 实例
首先要建立一个EDA介质模型,进行正演模拟的EDA介质模型大小为
t∆=,⨯个网格点,纵波速度为2540m/s,横波速度为1430m/s,1ms 400400
∆=∆=∆=。

震源采用单一Z方向力源,震源点位于(200,200)。

X测线5m
x y z
与EDA介质的对称轴夹角为0°[10,11]。

首先需要建立Visual MATCOM,接下来在Visual C++项目中装载.m程序。

①建立一个名为EDA_2D_bond.m的MATLAB源程序。

②打开Matcom45\lib文件夹,拷贝matlib.h、v4501v.lib两个文件到Matcom45\debug目录。

③打开系统文件搜索向导,查找ago4501.dll和v4501.dll两个文件,并将其
拷贝到Matcon45\debug目录。

④在VC工程文件中,加入工程目录下所有待插入的“.h”头文件及v4501.lib 库文件。

⑤新建VC++“Win32 Console Application”(Win32控制台应用程序),工程名为EDA_2D_bond,把之前创建的.m文件拷贝到VC++当前工程目录下,按Visual MATCOM工具栏第一个或第二个按钮,选EDA_2D_bond.m文件,按确定按钮后进行代码转化。

转化后在该工程的目录下可以看到增加了EDA_2D_bond.h、EDA_2D_bond.cpp、EDA_2D_bond.r、EDA_2D_bond.rsp等5个文件。

⑥向转化后的EDA_2D_bond.cpp文件添加代码如下:
int main()
{
begin_scope
initM(MATCOM_VERSION); //初始化Matcom进程
EDA_2D_bond();
exitM(); //退出Matcom进程
return 0;
end_scope
}
执行结果如图1,2,3和4所示。

图1 250 ms时在x分量波场快照图2 250 ms时y分量波场快照
Fig.1 Snapshot of x-component at 250 ms Fig.2 Snapshot of y-component at 250 ms
图3 250 ms 时z 分量波场快照 图4 第190道的地震记录 Fig.3 Snapshot of z-component at 250 ms Fig.4 Seismic record in 190th track
2.2 编程效率与执行效率的比较
在地震波正演模拟的实例中,对采用不同方法完成同一任务在编程效率和运行时间上进行了比较。

(表1、2)
表1 地震波正演模拟算法代码的运行时间
Table 1 Runtime for seismic forward modeling with its algorithmic code
对比项
全部用matlab 编写 用matcom 转换成c++编写 运行时间 约42 s 约28 min
表2 地震波正演模拟算法代码的编程效率
Table 2 Programming efficiency for seismic forward modeling with its algorithmic
code 对比项
全部用matlab 编写 用matcom 转换成c++编写 运行平台
Matlab2010b VC++6.0 代码行数
约242行 约530行 灵活性
低 高 可扩展性 弱 强
执行效率的比较是指完成同一任务的执行时间长短的比较,由于用Matcom 把Matlab 的编程语言转换成C++的可执行语言,但语言框架仍然是由Matlab 编写的,在VC++ 6.0中执行效率降低,运行时间比Matlab 要长。

从编程效率方面看,转换后的C++代码是包装后的Matlab 源程序,所以代码行数高出很多。


是由于Matlab本身对程序编写的一些局限,使得它在处理许多应用问题时灵活性和扩展性不够。

而C++虽然能够直接与系统及底层硬件交换数据,开发出高效率的可执行程序。

但要在C++应用程序中实现数据处理的种种算法却是一个费时费力的过程,即使算法函数被写出来,它的效率又难以得到保证[12]。

因此Matcom 能有效的结合使用Matlab和VC++提高编程效率,从而提供更为强大的编程手段。

3结论
(1)通过基于MATCOM平台的VC++与MATLAB混合编程地震正演模拟实例实现了VC++与MATLAB混合编程的可行性,并提高了编程的效率。

(2)将VC与MATLAB相结合,是解决地震数据中矩阵处理、运算以及图形、图像处理编程的一种有效途径。

采用VC调用MATLAB进行编程的方法,即保持了MATLAB的优良算法,又保持了C++的高执行效率,充分发挥了VC与MATLAB软件平台各自的优势。

混合编程时MATLAB中有很多工具箱函数无法在VC++环境中编译,MATCOM自身带有上千个函数,可以用MATCOM中的相应函数代替MATLAB函数,Visual MATCOM提供了一个无缝接口的编程环境。

(3)该方法适用于大数据量的计算,而大量数据资料的处理正是地球物理的特点。

MATLAB与VC++混合编程能够充分发挥两者的优势,利用MATLAB在工程技术领域强大的计算能力,编写出简短、友好、移植性好的Windows平台应用程序。

可以直接调用MATLAB工具箱函数,使技术人员从编写大量繁琐、专业、深奥的程序代码中解脱出来,把精力放在专业技术和算法的研究和应用上,对广大工程技术人员的开发工作十分有益。

参考文献:
[1] 刘洋,魏修成.复杂构造中地震波传播数值模拟[J].新疆石油地质,2008,29(1): 12-14. LIU Yang,WEI Xiu-cheng.Numerical simulation of seismic wave propagation in complex strutures[J].XinJiang Petroleum Geology,2008,29(1): 12-14.
[2] 张德丰.MATLAB与外部程序接口编程[M].北京:机械工业出版社,2009:292-294.
ZHANG De-feng.MATLAB and interface programming of external program[M].Beijing: China Machine Press,2009: 292-294.
[3] 刘会灯,朱飞.MATLAB编程基础与典型应用[M].北京:人民邮电出版社,2008: 496-497. LIU Hui-deng,ZHU Fei.MATLAB basic programming and typical
application[M].Beijing: Posts Telecom Press,2008: 496-497.
[4] 谷社峰,崔瑞华.MATCOM与VC++混合编程中自定义函数作为输入参数的调用方法[J].
电脑编程技巧与维护,2009,20(22): 21-23.
GU She-feng,CUI Rui-hua.The method of calling the user-defined function as the input argument in mixed programming with MATCOM and VC++[J].Computer
Programming Skills & Maintenance,2009,20(22): 21-23.
[5] 刘廷瑞,于瀛洁,陈明仪.基于Matcom4.5的VC++与Matlab通用接口程序编制[J].计
算机应用于软件,2004,21(11): 34-35.
LIU Ting-rui,YU Ying-jie,CHEN Ming-yi.General interface device between VC++ and Matlab based on Matcom4.5[J].Computer Applications and Software,2004,21(11): 34-35.
[6] 刘迎,师学明,陈晓玲,等.MATCOM与VC++联合编程在数据可视化处理中的应用[J].
工程地球物理学报,2007,4(5): 455-459.
LIU Ying,SHI Xue-Ming,CHEN Xiao-ling,et al.Application of mixed programming with MATCOM and VC++ in data visualization processing[J].Chinese Journal of Engineering Geophysics,2007,4(5): 455-459.
[7] 范晖.VC与MATLAB的混合编程[J].现代电子,2001,(1): 21-24.
FAN Hui.Hybrid programming between Matlab and VC++[J].Modern Electronics Technique,2001,(1): 21-24.
[8] 刘明勇,王鑫,栾晓明.VC++与Matlab的混合编程方法及应用[J].应用科技,
2005,32(10): 27-29.
LIU Ming-yong,WANG Xin,Luan Xiao-ming.Mixed programming of VC++ and Matlab[J].Applied Science and Technology,2005,32(10): 27-29.
[9] 黄天俊.EDA介质地震波场数值模拟研究:博士学位论文[D]. 成都:成都理工大学,2008. HUANG Tian-jun.Research of seismic wavefield numerical simulation in EDA media:Ph’D dissertation[D].Chengdu:Chengdu University,2008.
[10] 李红星,刘财,陶春辉.基于BISQ模型的各向同性孔隙介质弹性波三维交错网格高阶
有限差分数值模拟[J].世界地质,2007,26(4): 501-508.
LI Hong-xing,LIU Cai,TAO Chun-hui.3D staggered-grid high-order finite difference numerical simulation of elastic wave equation in porous isotropic
media based on BISQ model[J].Global Geology,2007,26(4): 501-508.
[11] 杜丽英,杜丽娟,彭苏萍,等.VTI介质中的地层弹性参数反演[J].世界地
质,2001,20(4): 396-401.
DU Li-Ying,DU Li-juan,PENG Su-ping et al.Seismic inversion of strata parameters for VTI media[J].Global Geology,2001,20(4): 396-401.
[12] 徐彬,张伟成.基于Matcom与COM的VC/Matlab混合编程[J].微计算机信息,
2009,25(3):184-185.
XU Bin,ZHANG Wei-cheng.Study of Matcom and COM based on VC/Matlab mixed programming[J].Microcomputer Information,2009,25(3): 184-185.。

相关文档
最新文档