亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于Qt與Fortran混合編程技術(shù)的磁偶極子源正演軟件的開發(fā)

        2022-03-24 12:24:12楊成坤陳清禮王志剛
        物探化探計(jì)算技術(shù) 2022年1期
        關(guān)鍵詞:磁偶極子調(diào)用代碼

        楊成坤, 陳清禮, 鄭 凱, 王志剛, 魯 瑤

        (1.長江大學(xué) 地球物理與石油資源學(xué)院,武漢 430100;2.長江大學(xué) 油氣資源與勘探技術(shù)教育部重點(diǎn)實(shí)驗(yàn)室,武漢 430100;3.中國石油集團(tuán) 東方地球物理勘探有限責(zé)任公司,涿州 072751)

        0 引言

        隨著我國資源勘查逐漸走向深部,深部礦產(chǎn)資源勘查技術(shù)裝備對(duì)外依賴度高、探測深度淺和精度不高等問題開始暴露出來,嚴(yán)重制約我國深部礦產(chǎn)資源的有效探測,針對(duì)這些問題,以國家重點(diǎn)研發(fā)計(jì)劃《地下與井中地球物理勘探技術(shù)與裝備》項(xiàng)目為依托,重點(diǎn)開展對(duì)項(xiàng)目課題《地下與井中探測軟件平臺(tái)研發(fā)》的研究,為我國資源勘查走向深部提供技術(shù)支撐。

        在地球物理領(lǐng)域,大量的算法由Fortran語言編寫,由于Fortran語言的標(biāo)準(zhǔn)化程度高,擁有高精度的數(shù)據(jù)結(jié)構(gòu)和運(yùn)算結(jié)構(gòu),具備強(qiáng)大的數(shù)值計(jì)算功能,許多地球物理學(xué)家、工程師使用Fortran編寫了大量的地球物理數(shù)據(jù)處理和正反演程序[1]。隨著計(jì)算機(jī)技術(shù)水平的提高,大量優(yōu)秀的編程工具在地球物理軟件開發(fā)中得到了應(yīng)用,F(xiàn)ortran由于其界面不夠友好,人機(jī)交互性差,已不能滿足用戶的需求[2-3]。

        Qt是基于C++編寫的跨平臺(tái)圖形界面程序開發(fā)軟件,是一個(gè)靈活性好、移植性強(qiáng)的開發(fā)程序框架,廣泛用于開發(fā)各種GUI應(yīng)用程序。目前混合編程技術(shù)在地球物理勘探行業(yè)進(jìn)行了大量的開發(fā)應(yīng)用,馮文杰等[4]將C++和Fortran混合編程技術(shù)在多點(diǎn)地質(zhì)統(tǒng)計(jì)建模中進(jìn)行了應(yīng)用,彭土有[5]利用轉(zhuǎn)化數(shù)據(jù)文件格式的方法,使Qt編寫的地震數(shù)據(jù)處理解釋平臺(tái)直接調(diào)用Fortran可執(zhí)行程序;田仁飛等[6]利用了Qt和Fortran的混編技術(shù)對(duì)地震倒頻屬性計(jì)算軟件進(jìn)行了開發(fā);陳楠等[7]利用Qt和Fortran語言混合編程技術(shù)開發(fā)了地震勘探可擴(kuò)展軟件平臺(tái);李亞彬[8]使用Fortran語言編寫海洋電磁一維反演算法,Qt調(diào)用Fortran編譯的動(dòng)態(tài)鏈接庫實(shí)現(xiàn)了海洋可控源電磁數(shù)據(jù)處理軟件的開發(fā);王銳[9]使用Qt多進(jìn)程調(diào)用由Fortran編譯的大地電磁反演可執(zhí)行程序。

        傳統(tǒng)的Qt和Fortran混編模式一般使用顯式鏈接調(diào)用動(dòng)態(tài)鏈接庫、隱式鏈接調(diào)用動(dòng)態(tài)鏈接庫和直接調(diào)用可執(zhí)行程序。地下與井中探測軟件平臺(tái)支持顯式鏈接調(diào)用和隱式鏈接調(diào)用,由于各方法模塊對(duì)保密性、防盜版的需要,不允許使用直接調(diào)用可執(zhí)行程序的方式進(jìn)行混合編程,對(duì)平臺(tái)軟件模塊的安全性有一定程度的保障。在集成開發(fā)此類大型綜合性平臺(tái)軟件中,參與人員單位多,功能復(fù)雜,故在Qt中創(chuàng)建項(xiàng)目開發(fā)模板,用來統(tǒng)一規(guī)范動(dòng)態(tài)鏈接庫生成時(shí)的命名規(guī)則和路徑以及眾多開發(fā)者的代碼規(guī)范,可以大大減小各開發(fā)者對(duì)算法模塊集成時(shí)和項(xiàng)目管理人員在模塊集成匯總時(shí)的工作量,其中模塊開發(fā)工程模板中的算法項(xiàng)目模板和界面項(xiàng)目模板,分別對(duì)Fortran代碼構(gòu)建的項(xiàng)目和用戶界面進(jìn)行配置、編譯。

        這里利用Qt開發(fā)交互式界面,利用Fortran編寫正演模塊算法,對(duì)兩種語言進(jìn)行混合編程,實(shí)現(xiàn)磁偶極子源的正演軟件在地下與井中探測軟件平臺(tái)上的集成應(yīng)用。

        1 磁偶極源的電磁響應(yīng)

        磁偶極子源電磁法是一種輕便、快捷、應(yīng)用范圍很廣的地球物理探測方法,其原名為地面電磁波法(Melos),是上世紀(jì)60年代法國地質(zhì)調(diào)查局,利用Wait推導(dǎo)出的垂直磁偶極子場強(qiáng)公式在大地電磁測深法的基礎(chǔ)上發(fā)展而來的,是頻率域電磁法勘探中的一個(gè)重要分支[10]。它利用不接地回線圈向地下發(fā)射一次脈沖電磁場,接收線圈同步接收一次場和地下良導(dǎo)體感應(yīng)的二次場的總和,用以探測地下良導(dǎo)體。該方法經(jīng)過半個(gè)多世紀(jì)的發(fā)展,在礦產(chǎn)勘探、工程勘察、地下水探測、考古探測、軍事應(yīng)用等領(lǐng)域都取得了很多成就[11]。

        以垂直磁偶極子中心在地面的投影為坐標(biāo)原點(diǎn),建立直角坐標(biāo)系,磁矩m=I×S,其中I是電流強(qiáng)度,S是表示垂直磁偶極子的線圈面積,放置在層狀地球模型地面上方的高度Z=-h處,如圖1所示為磁偶極子源正演層狀模型。則電磁場分量的積分表達(dá)式[12-13]如下所示:

        (1)

        J0(λr)dλ

        (2)

        (3)

        (4)

        其中在式(4)中

        基于上述原理,使用Fortran語言開發(fā)了磁偶極子源正演計(jì)算程序。

        2 軟件架構(gòu)設(shè)計(jì)

        軟件架構(gòu)的設(shè)計(jì)與軟件的執(zhí)行效率密切相關(guān),合理的軟件架構(gòu)能夠提高軟件運(yùn)行的效率,縮短程序計(jì)算耗時(shí)。軟件架構(gòu)主體結(jié)構(gòu)由平臺(tái)數(shù)據(jù)庫、接口、數(shù)學(xué)運(yùn)算庫、動(dòng)態(tài)鏈接庫和界面組成。

        平臺(tái)數(shù)據(jù)采用Extensible Markup Language(XML)數(shù)據(jù)庫技術(shù),對(duì)軟件中半結(jié)構(gòu)化的數(shù)據(jù)進(jìn)行存取和管理。平臺(tái)中數(shù)據(jù)的格式由兩部分構(gòu)成,分別為文件參數(shù)和數(shù)據(jù)體,文件參數(shù)部分包括數(shù)據(jù)體中屬性數(shù)據(jù)類型、屬性數(shù)量、屬性單位、數(shù)據(jù)行數(shù)、排序類型、版本號(hào)、文件描述等數(shù)據(jù)以及坐標(biāo)范圍、值范圍等統(tǒng)計(jì)信息,數(shù)據(jù)體由行列數(shù)據(jù)構(gòu)成,文件參數(shù)構(gòu)成如表 1所示。

        表1 文件參數(shù)信息表

        接口包含了集成開發(fā)接口、數(shù)據(jù)接口和業(yè)務(wù)接口,數(shù)學(xué)運(yùn)算庫包括非數(shù)值類、散點(diǎn)數(shù)據(jù)類和方程、矩陣與方程組等五類算法,業(yè)務(wù)接口包括內(nèi)存空間管理、線程管理等三類接口,上述接口和數(shù)學(xué)算法形成公共動(dòng)態(tài)庫,由磁偶極子源正演主程序進(jìn)行調(diào)用。此外平臺(tái)中提供了模塊集成開發(fā)模板,該模板由平臺(tái)開發(fā)人員設(shè)計(jì),預(yù)設(shè)界面、程序結(jié)構(gòu)等代碼,該模板面向軟件開發(fā)集成人員,集成人員根據(jù)實(shí)際算法要求,在該模板上進(jìn)行后續(xù)開發(fā)。本文的軟件架構(gòu)如圖2所示。

        圖2 軟件架構(gòu)

        3 Qt與Fortran混編技術(shù)

        3.1 參數(shù)數(shù)據(jù)類型

        Qt是基于C++語言的,它調(diào)用Fortran動(dòng)態(tài)鏈接庫的接口標(biāo)準(zhǔn)與C++調(diào)用Fortran動(dòng)態(tài)鏈接庫的接口標(biāo)準(zhǔn)一致。在Qt調(diào)用Fortran生成的動(dòng)態(tài)鏈接庫過程中,如果傳遞參數(shù)的數(shù)據(jù)類型不一致,會(huì)導(dǎo)致調(diào)用輸出結(jié)果出錯(cuò),所以在設(shè)計(jì)兩種語言傳遞參數(shù)類型的過程中,需要保持?jǐn)?shù)據(jù)類型的一致性,由于Fortran和C++的數(shù)據(jù)類型不是完全一致,就軟件中常用到的整型、浮點(diǎn)型和字符型而言,有以下的對(duì)應(yīng)關(guān)系[14-15],對(duì)應(yīng)關(guān)系如表2所示。

        表2 Fortran與C++數(shù)據(jù)類型對(duì)應(yīng)關(guān)系表

        3.2 動(dòng)態(tài)鏈接庫生成

        算法項(xiàng)目模板預(yù)設(shè)了動(dòng)態(tài)庫編譯生成的配置信息,通過創(chuàng)建C++接口,配置算法項(xiàng)目參數(shù),導(dǎo)入Fortran代碼,編譯,完成動(dòng)態(tài)鏈接庫的生成。動(dòng)態(tài)鏈接庫生成流程圖如圖3所示。

        圖3 動(dòng)態(tài)鏈接庫生成流程圖

        3.2.1 算法接口設(shè)計(jì)

        依照表1中的C++與Fortran數(shù)據(jù)類型對(duì)應(yīng)關(guān)系,編寫Fortran算法接口。垂直磁偶極子源正演算法共有16個(gè)輸入?yún)?shù),分為磁偶極子特性參數(shù)和模型參數(shù),表3、表4設(shè)計(jì)了接口函數(shù)的參數(shù)名、Fortran參數(shù)與C++參數(shù)數(shù)據(jù)類型對(duì)應(yīng)關(guān)系,表中對(duì)各參數(shù)實(shí)際意義進(jìn)行了說明。

        表3 特性參數(shù)類型對(duì)應(yīng)表

        表4 模型參數(shù)類型對(duì)應(yīng)表

        其中頭文件中定義的函數(shù)接口代碼如下所示:

        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);

        除了磁偶極子特性參數(shù)和模型參數(shù)外,還包括終止標(biāo)識(shí)變量isCancel,在Fortran中對(duì)應(yīng)INTEGER*8類型,用來監(jiān)測運(yùn)算是否被用戶終止,當(dāng)返回值為非0時(shí),表示函數(shù)正常結(jié)束。

        3.2.2 配置算法項(xiàng)目參數(shù)

        在QtCreator中,指定項(xiàng)目使用MinGW-w64[16]編譯環(huán)境,需要對(duì)算法項(xiàng)目的pro文件進(jìn)行配置,算法開發(fā)模板預(yù)設(shè)了以下參數(shù):

        TEMPLATE = lib

        LIBS +=-lgfortran

        DESTDIR += D:/qtworkspace/fortranmodule

        QMAKE_CFLAGS-=-fno-keep-inline-dllexport

        SOURCES += Emdpler.for

        TEMPLATE是模板變量,為qmake指定makefile的類型,值lib表示建立一個(gè)庫的makefile。LIBS是用來指定要鏈接到項(xiàng)目中的庫的列表,值-lgfortran表示引入了gfortran的相關(guān)庫文件。DESTDIR用來指定目標(biāo)動(dòng)態(tài)鏈接庫生成路徑,代碼中的路徑即為開發(fā)人員指定的私有動(dòng)態(tài)鏈接庫目錄。QMAKE_CFLAGS用來設(shè)置編譯參數(shù),-fno-keep-inline-dllexport表示忽略所有含dllexport屬性的內(nèi)聯(lián)函數(shù),避免編譯時(shí)內(nèi)存耗盡錯(cuò)誤的產(chǎn)生。SOURCES設(shè)置Fortran代碼文件名,用來將Fortran代碼文件添加到項(xiàng)目中。

        3.2.3 生成動(dòng)態(tài)鏈接庫

        將磁偶極子源正演的Fortran代碼文件拷貝至算法項(xiàng)目根目錄,在QtCreator中選中算法項(xiàng)目,點(diǎn)擊構(gòu)建按鈕,進(jìn)行編譯、調(diào)試,如無語法錯(cuò)誤,DLL文件將生成到私有動(dòng)態(tài)鏈接庫目錄下。使用Dependency Walker工具檢查動(dòng)態(tài)鏈接庫依賴關(guān)系,確保動(dòng)態(tài)鏈接庫無缺少模塊、無依賴項(xiàng)錯(cuò)誤等,再將動(dòng)態(tài)鏈接庫加入到測試程序里進(jìn)行調(diào)用、測試,如果測試結(jié)果不正確,需要重新修改源代碼,編譯源代碼,生成DLL文件,重復(fù)流程,直到動(dòng)態(tài)鏈接庫調(diào)用測試正確為止。

        3.3 Qt調(diào)用動(dòng)態(tài)鏈接庫實(shí)現(xiàn)過程

        界面開發(fā)模板用來創(chuàng)建軟件主程序和界面,該模板預(yù)設(shè)了界面和平臺(tái)公共動(dòng)態(tài)鏈接庫接口的代碼。通過配置界面項(xiàng)目參數(shù)、設(shè)計(jì)用戶界面、編寫調(diào)用動(dòng)態(tài)鏈接庫代碼,編譯生成可執(zhí)行文件,實(shí)現(xiàn)用戶界面、主程序、算法之間的連接。界面項(xiàng)目開發(fā)流程圖見圖4。

        圖4 界面項(xiàng)目開發(fā)流程圖

        3.3.1 配置界面項(xiàng)目參數(shù)

        在QtCreator中,需要對(duì)界面項(xiàng)目的pro文件進(jìn)行如下配置:

        LIBS += fortranvmd.dll

        HEADERS += fortranvmd.h

        FORMS += EMDPLERDialog.h

        LIBS表示將算法項(xiàng)目生成的動(dòng)態(tài)鏈接庫添加到界面項(xiàng)目中,HEADERS表示將算法項(xiàng)目動(dòng)態(tài)鏈接庫的頭文件引入到界面項(xiàng)目中。

        3.3.2 主程序調(diào)用動(dòng)態(tài)鏈接庫

        在界面項(xiàng)目主程序中引入動(dòng)態(tài)鏈接庫的頭文件,編寫調(diào)用動(dòng)態(tài)鏈接庫代碼,調(diào)用部分代碼如下所示,對(duì)于算法中的模型參數(shù)電阻率res、層厚度h和自定義頻率序列freq,使用平臺(tái)公共接口G::alloc1float進(jìn)行內(nèi)存空間的申請(qǐng),且該接口定義只用于接口變量,RdMemoryManager::allocateMemory2D接口用于C++代碼中變量的內(nèi)存空間申請(qǐng),從界面獲取參數(shù)后,使用動(dòng)態(tài)庫頭文件中的接口進(jìn)行直接調(diào)用,接口中返回變量outData中包含了計(jì)算輸出的振幅和相位數(shù)據(jù),創(chuàng)建G_HEADER類型的結(jié)構(gòu)體變量outputheader,設(shè)置了輸出數(shù)據(jù)文件的文件參數(shù)信息,調(diào)用接口G_Interface::IOWrite_Scatter以散點(diǎn)數(shù)據(jù)格式將數(shù)據(jù)輸出到平臺(tái)數(shù)據(jù)庫中,釋放申請(qǐng)的空間,調(diào)用結(jié)束。

        調(diào)用部分代碼:

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

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

        float *freq = G::alloc1float(static_cast(freq_num));//申請(qǐng)空間用于接口變量

        RdMemoryManager::allocateMemory2D(outtempData, static_cast(2), static_cast(freq_num));//申請(qǐng)空間用于C++代碼

        ……//從界面獲取各變量的值

        emdpler_for_(&ifact,&idipol,&icomp,&r,&ht,&z,&freqmax,&freqmin,freq,&ri,&area,&rm,&x,&y,&nlyr,res,h,outData[0]);//調(diào)用接口函數(shù)

        outputheader->attrType[0]=G_PHASE;

        outputheader->attrType[1]=G_AMPLITUDE;//設(shè)置輸出數(shù)據(jù)列名

        outputheader->pointNumber = freq_num;//輸出數(shù)據(jù)行數(shù)

        outputheader->attrNumber = 2;//輸出數(shù)據(jù)列數(shù)

        G_Interface::IOWrite_Scatter(OutItem.fullFileName, outputheader, outData);//調(diào)用平臺(tái)數(shù)據(jù)接口,將獲取到的outData中的輸出數(shù)據(jù)保存到平臺(tái)數(shù)據(jù)庫中

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

        G::free1float(res);

        G::free1float(h);

        G::free1float(freq);//釋放變量內(nèi)存空間

        界面項(xiàng)目經(jīng)過編譯生成exe可執(zhí)行文件,對(duì)exe文件進(jìn)行運(yùn)行測試,如測試結(jié)果不正確,修改代碼,重新編譯,直到程序正確執(zhí)行為止。實(shí)現(xiàn)的軟件用戶界面如圖5、圖6所示。

        圖5 正演參數(shù)編輯界面

        圖6 模型參數(shù)編輯界面

        4 對(duì)比分析

        設(shè)計(jì)兩層地質(zhì)模型,各層電阻率分別是ρ1=100 Ω·m,ρ2=10 Ω·m,層厚度h1=100 m,電流I=1 A,線圈面積S=1 m2,收發(fā)距SR=100 m,分別使用Fortran算法和混編后的軟件進(jìn)行計(jì)算,計(jì)算結(jié)果經(jīng)過對(duì)比如圖7、圖8所示。

        原Fortran程序和混合編程軟件計(jì)算輸出的結(jié)果一致,振幅和相位的輸出曲線完全重合,混合編程后的軟件模塊計(jì)算精度高、運(yùn)行速度快,界面操作友好。

        5 結(jié)論

        磁偶極子源正演模塊是地下及井中探測軟件平臺(tái)的一個(gè)重要組成部分。正演算法采用Fortran語言實(shí)現(xiàn),而地下及井中探測軟件平臺(tái)利用QT開發(fā)。這里研究了Qt和Fortran的混合編程技術(shù),利用軟件平臺(tái)開發(fā)接口和項(xiàng)目開發(fā)模板,實(shí)現(xiàn)了磁偶極子源正演在地下及井中探測軟件平臺(tái)上的集成應(yīng)用。對(duì)比測試表明,磁偶極子源正演集成到地下及井中探測軟件平臺(tái)后,計(jì)算結(jié)果正確,并且其用戶界面友好,軟件平臺(tái)模塊開發(fā)效率高。本文混編模式適合于大型、綜合性物探數(shù)據(jù)處理解釋軟件平臺(tái)的開發(fā)。

        猜你喜歡
        磁偶極子調(diào)用代碼
        核電項(xiàng)目物項(xiàng)調(diào)用管理的應(yīng)用研究
        LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
        創(chuàng)世代碼
        創(chuàng)世代碼
        創(chuàng)世代碼
        創(chuàng)世代碼
        基于遞推更新卡爾曼濾波的磁偶極子目標(biāo)跟蹤
        磁偶極子跟蹤的漸進(jìn)貝葉斯濾波方法
        基于系統(tǒng)調(diào)用的惡意軟件檢測技術(shù)研究
        基于磁偶極子的磁場梯度張量縮并的試驗(yàn)驗(yàn)證及相關(guān)參數(shù)確定
        天堂在线观看av一区二区三区| 久久亚洲av熟女国产| 四虎国产精品免费久久| 美女视频很黄很a免费国产| 亚洲中文字幕无码一久久区| 九九久久精品一区二区三区av| 免费观看国产精品| 又紧又大又爽精品一区二区| 一本久道视频无线视频试看| 人禽无码视频在线观看| 国产成人精品免费久久久久| 久久高潮少妇视频免费| 国产乱妇乱子视频在播放| 日韩熟女系列中文字幕| 久久久久久岛国免费网站| 国产精品自在线拍国产手机版| 精品成人av人一区二区三区| 久久av无码精品人妻糸列 | 国产美女久久久亚洲综合| 亚洲aⅴ无码成人网站国产app| 国产成人av综合色| 精品极品视频在线观看| 亚洲av乱码国产精品色| 无码Av在线一区二区三区| 精品无码人妻一区二区三区不卡| 中文字幕第一页人妻丝袜| 国产高清女人对白av在在线| 六月丁香婷婷色狠狠久久| 国产欧美精品一区二区三区四区 | 无码国产激情在线观看| 国产成人a人亚洲精品无码| 国产日产一区二区三区四区五区| 久久亚洲中文字幕精品一区四| 国产精品美女久久久久久久| 精品国产精品国产偷麻豆| 美女脱掉内裤扒开下面让人插 | 亚洲中文字幕永久网站| 日本中文字幕在线播放第1页| 免费无码一区二区三区蜜桃| 免费在线观看播放黄片视频| 国产99视频一区二区三区 |