APP下载

基于Qt与Fortran混合编程技术的磁偶极子源正演软件的开发

2022-03-24杨成坤陈清礼王志刚

物探化探计算技术 2022年1期
关键词:调用代码界面

杨成坤, 陈清礼, 郑 凯, 王志刚, 鲁 瑶

(1.长江大学 地球物理与石油资源学院,武汉 430100;2.长江大学 油气资源与勘探技术教育部重点实验室,武汉 430100;3.中国石油集团 东方地球物理勘探有限责任公司,涿州 072751)

0 引言

随着我国资源勘查逐渐走向深部,深部矿产资源勘查技术装备对外依赖度高、探测深度浅和精度不高等问题开始暴露出来,严重制约我国深部矿产资源的有效探测,针对这些问题,以国家重点研发计划《地下与井中地球物理勘探技术与装备》项目为依托,重点开展对项目课题《地下与井中探测软件平台研发》的研究,为我国资源勘查走向深部提供技术支撑。

在地球物理领域,大量的算法由Fortran语言编写,由于Fortran语言的标准化程度高,拥有高精度的数据结构和运算结构,具备强大的数值计算功能,许多地球物理学家、工程师使用Fortran编写了大量的地球物理数据处理和正反演程序[1]。随着计算机技术水平的提高,大量优秀的编程工具在地球物理软件开发中得到了应用,Fortran由于其界面不够友好,人机交互性差,已不能满足用户的需求[2-3]。

Qt是基于C++编写的跨平台图形界面程序开发软件,是一个灵活性好、移植性强的开发程序框架,广泛用于开发各种GUI应用程序。目前混合编程技术在地球物理勘探行业进行了大量的开发应用,冯文杰等[4]将C++和Fortran混合编程技术在多点地质统计建模中进行了应用,彭土有[5]利用转化数据文件格式的方法,使Qt编写的地震数据处理解释平台直接调用Fortran可执行程序;田仁飞等[6]利用了Qt和Fortran的混编技术对地震倒频属性计算软件进行了开发;陈楠等[7]利用Qt和Fortran语言混合编程技术开发了地震勘探可扩展软件平台;李亚彬[8]使用Fortran语言编写海洋电磁一维反演算法,Qt调用Fortran编译的动态链接库实现了海洋可控源电磁数据处理软件的开发;王锐[9]使用Qt多进程调用由Fortran编译的大地电磁反演可执行程序。

传统的Qt和Fortran混编模式一般使用显式链接调用动态链接库、隐式链接调用动态链接库和直接调用可执行程序。地下与井中探测软件平台支持显式链接调用和隐式链接调用,由于各方法模块对保密性、防盗版的需要,不允许使用直接调用可执行程序的方式进行混合编程,对平台软件模块的安全性有一定程度的保障。在集成开发此类大型综合性平台软件中,参与人员单位多,功能复杂,故在Qt中创建项目开发模板,用来统一规范动态链接库生成时的命名规则和路径以及众多开发者的代码规范,可以大大减小各开发者对算法模块集成时和项目管理人员在模块集成汇总时的工作量,其中模块开发工程模板中的算法项目模板和界面项目模板,分别对Fortran代码构建的项目和用户界面进行配置、编译。

这里利用Qt开发交互式界面,利用Fortran编写正演模块算法,对两种语言进行混合编程,实现磁偶极子源的正演软件在地下与井中探测软件平台上的集成应用。

1 磁偶极源的电磁响应

磁偶极子源电磁法是一种轻便、快捷、应用范围很广的地球物理探测方法,其原名为地面电磁波法(Melos),是上世纪60年代法国地质调查局,利用Wait推导出的垂直磁偶极子场强公式在大地电磁测深法的基础上发展而来的,是频率域电磁法勘探中的一个重要分支[10]。它利用不接地回线圈向地下发射一次脉冲电磁场,接收线圈同步接收一次场和地下良导体感应的二次场的总和,用以探测地下良导体。该方法经过半个多世纪的发展,在矿产勘探、工程勘察、地下水探测、考古探测、军事应用等领域都取得了很多成就[11]。

以垂直磁偶极子中心在地面的投影为坐标原点,建立直角坐标系,磁矩m=I×S,其中I是电流强度,S是表示垂直磁偶极子的线圈面积,放置在层状地球模型地面上方的高度Z=-h处,如图1所示为磁偶极子源正演层状模型。则电磁场分量的积分表达式[12-13]如下所示:

(1)

J0(λr)dλ

(2)

(3)

(4)

其中在式(4)中

基于上述原理,使用Fortran语言开发了磁偶极子源正演计算程序。

2 软件架构设计

软件架构的设计与软件的执行效率密切相关,合理的软件架构能够提高软件运行的效率,缩短程序计算耗时。软件架构主体结构由平台数据库、接口、数学运算库、动态链接库和界面组成。

平台数据采用Extensible Markup Language(XML)数据库技术,对软件中半结构化的数据进行存取和管理。平台中数据的格式由两部分构成,分别为文件参数和数据体,文件参数部分包括数据体中属性数据类型、属性数量、属性单位、数据行数、排序类型、版本号、文件描述等数据以及坐标范围、值范围等统计信息,数据体由行列数据构成,文件参数构成如表 1所示。

表1 文件参数信息表

接口包含了集成开发接口、数据接口和业务接口,数学运算库包括非数值类、散点数据类和方程、矩阵与方程组等五类算法,业务接口包括内存空间管理、线程管理等三类接口,上述接口和数学算法形成公共动态库,由磁偶极子源正演主程序进行调用。此外平台中提供了模块集成开发模板,该模板由平台开发人员设计,预设界面、程序结构等代码,该模板面向软件开发集成人员,集成人员根据实际算法要求,在该模板上进行后续开发。本文的软件架构如图2所示。

图2 软件架构

3 Qt与Fortran混编技术

3.1 参数数据类型

Qt是基于C++语言的,它调用Fortran动态链接库的接口标准与C++调用Fortran动态链接库的接口标准一致。在Qt调用Fortran生成的动态链接库过程中,如果传递参数的数据类型不一致,会导致调用输出结果出错,所以在设计两种语言传递参数类型的过程中,需要保持数据类型的一致性,由于Fortran和C++的数据类型不是完全一致,就软件中常用到的整型、浮点型和字符型而言,有以下的对应关系[14-15],对应关系如表2所示。

表2 Fortran与C++数据类型对应关系表

3.2 动态链接库生成

算法项目模板预设了动态库编译生成的配置信息,通过创建C++接口,配置算法项目参数,导入Fortran代码,编译,完成动态链接库的生成。动态链接库生成流程图如图3所示。

图3 动态链接库生成流程图

3.2.1 算法接口设计

依照表1中的C++与Fortran数据类型对应关系,编写Fortran算法接口。垂直磁偶极子源正演算法共有16个输入参数,分为磁偶极子特性参数和模型参数,表3、表4设计了接口函数的参数名、Fortran参数与C++参数数据类型对应关系,表中对各参数实际意义进行了说明。

表3 特性参数类型对应表

表4 模型参数类型对应表

其中头文件中定义的函数接口代码如下所示:

extern "C" void(*emdpler_for_)(int *ifact, int *idipol, int *icomp, double *r, double *ht, double *z, double *freqmax, double *freqmin, double *ri, double *area, double *rm, double *x, double *y, int *nlyr, float *res, float *h, double *outData,int *isCancel);

除了磁偶极子特性参数和模型参数外,还包括终止标识变量isCancel,在Fortran中对应INTEGER*8类型,用来监测运算是否被用户终止,当返回值为非0时,表示函数正常结束。

3.2.2 配置算法项目参数

在QtCreator中,指定项目使用MinGW-w64[16]编译环境,需要对算法项目的pro文件进行配置,算法开发模板预设了以下参数:

TEMPLATE = lib

LIBS +=-lgfortran

DESTDIR += D:/qtworkspace/fortranmodule

QMAKE_CFLAGS-=-fno-keep-inline-dllexport

SOURCES += Emdpler.for

TEMPLATE是模板变量,为qmake指定makefile的类型,值lib表示建立一个库的makefile。LIBS是用来指定要链接到项目中的库的列表,值-lgfortran表示引入了gfortran的相关库文件。DESTDIR用来指定目标动态链接库生成路径,代码中的路径即为开发人员指定的私有动态链接库目录。QMAKE_CFLAGS用来设置编译参数,-fno-keep-inline-dllexport表示忽略所有含dllexport属性的内联函数,避免编译时内存耗尽错误的产生。SOURCES设置Fortran代码文件名,用来将Fortran代码文件添加到项目中。

3.2.3 生成动态链接库

将磁偶极子源正演的Fortran代码文件拷贝至算法项目根目录,在QtCreator中选中算法项目,点击构建按钮,进行编译、调试,如无语法错误,DLL文件将生成到私有动态链接库目录下。使用Dependency Walker工具检查动态链接库依赖关系,确保动态链接库无缺少模块、无依赖项错误等,再将动态链接库加入到测试程序里进行调用、测试,如果测试结果不正确,需要重新修改源代码,编译源代码,生成DLL文件,重复流程,直到动态链接库调用测试正确为止。

3.3 Qt调用动态链接库实现过程

界面开发模板用来创建软件主程序和界面,该模板预设了界面和平台公共动态链接库接口的代码。通过配置界面项目参数、设计用户界面、编写调用动态链接库代码,编译生成可执行文件,实现用户界面、主程序、算法之间的连接。界面项目开发流程图见图4。

图4 界面项目开发流程图

3.3.1 配置界面项目参数

在QtCreator中,需要对界面项目的pro文件进行如下配置:

LIBS += fortranvmd.dll

HEADERS += fortranvmd.h

FORMS += EMDPLERDialog.h

LIBS表示将算法项目生成的动态链接库添加到界面项目中,HEADERS表示将算法项目动态链接库的头文件引入到界面项目中。

3.3.2 主程序调用动态链接库

在界面项目主程序中引入动态链接库的头文件,编写调用动态链接库代码,调用部分代码如下所示,对于算法中的模型参数电阻率res、层厚度h和自定义频率序列freq,使用平台公共接口G::alloc1float进行内存空间的申请,且该接口定义只用于接口变量,RdMemoryManager::allocateMemory2D接口用于C++代码中变量的内存空间申请,从界面获取参数后,使用动态库头文件中的接口进行直接调用,接口中返回变量outData中包含了计算输出的振幅和相位数据,创建G_HEADER类型的结构体变量outputheader,设置了输出数据文件的文件参数信息,调用接口G_Interface::IOWrite_Scatter以散点数据格式将数据输出到平台数据库中,释放申请的空间,调用结束。

调用部分代码:

float *res = G::alloc1float(static_cast(nlyr));

float *h = G::alloc1float(static_cast(nlyr-1));

float *freq = G::alloc1float(static_cast(freq_num));//申请空间用于接口变量

RdMemoryManager::allocateMemory2D(outtempData, static_cast(2), static_cast(freq_num));//申请空间用于C++代码

……//从界面获取各变量的值

emdpler_for_(&ifact,&idipol,&icomp,&r,&ht,&z,&freqmax,&freqmin,freq,&ri,&area,&rm,&x,&y,&nlyr,res,h,outData[0]);//调用接口函数

outputheader->attrType[0]=G_PHASE;

outputheader->attrType[1]=G_AMPLITUDE;//设置输出数据列名

outputheader->pointNumber = freq_num;//输出数据行数

outputheader->attrNumber = 2;//输出数据列数

G_Interface::IOWrite_Scatter(OutItem.fullFileName, outputheader, outData);//调用平台数据接口,将获取到的outData中的输出数据保存到平台数据库中

RdMemoryManager::freeMemory2D(outtempData, static_cast(clo));

G::free1float(res);

G::free1float(h);

G::free1float(freq);//释放变量内存空间

界面项目经过编译生成exe可执行文件,对exe文件进行运行测试,如测试结果不正确,修改代码,重新编译,直到程序正确执行为止。实现的软件用户界面如图5、图6所示。

图5 正演参数编辑界面

图6 模型参数编辑界面

4 对比分析

设计两层地质模型,各层电阻率分别是ρ1=100 Ω·m,ρ2=10 Ω·m,层厚度h1=100 m,电流I=1 A,线圈面积S=1 m2,收发距SR=100 m,分别使用Fortran算法和混编后的软件进行计算,计算结果经过对比如图7、图8所示。

原Fortran程序和混合编程软件计算输出的结果一致,振幅和相位的输出曲线完全重合,混合编程后的软件模块计算精度高、运行速度快,界面操作友好。

5 结论

磁偶极子源正演模块是地下及井中探测软件平台的一个重要组成部分。正演算法采用Fortran语言实现,而地下及井中探测软件平台利用QT开发。这里研究了Qt和Fortran的混合编程技术,利用软件平台开发接口和项目开发模板,实现了磁偶极子源正演在地下及井中探测软件平台上的集成应用。对比测试表明,磁偶极子源正演集成到地下及井中探测软件平台后,计算结果正确,并且其用户界面友好,软件平台模块开发效率高。本文混编模式适合于大型、综合性物探数据处理解释软件平台的开发。

猜你喜欢

调用代码界面
微重力下两相控温型储液器内气液界面仿真分析
国企党委前置研究的“四个界面”
核电项目物项调用管理的应用研究
扁平化设计在手机界面中的发展趋势
系统虚拟化环境下客户机系统调用信息捕获与分析①
创世代码
创世代码
创世代码
创世代码
利用RFC技术实现SAP系统接口通信