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

        ?

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

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

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

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

        0 引言

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

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

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

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

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

        1 磁偶極源的電磁響應

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

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

        (1)

        J0(λr)dλ

        (2)

        (3)

        (4)

        其中在式(4)中

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

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

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

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

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

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

        圖2 軟件架構(gòu)

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

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

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

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

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

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

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

        3.2.1 算法接口設(shè)計

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

        表3 特性參數(shù)類型對應表

        表4 模型參數(shù)類型對應表

        其中頭文件中定義的函數(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ù)外,還包括終止標識變量isCancel,在Fortran中對應INTEGER*8類型,用來監(jiān)測運算是否被用戶終止,當返回值為非0時,表示函數(shù)正常結(jié)束。

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

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

        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的相關(guān)庫文件。DESTDIR用來指定目標動態(tài)鏈接庫生成路徑,代碼中的路徑即為開發(fā)人員指定的私有動態(tài)鏈接庫目錄。QMAKE_CFLAGS用來設(shè)置編譯參數(shù),-fno-keep-inline-dllexport表示忽略所有含dllexport屬性的內(nèi)聯(lián)函數(shù),避免編譯時內(nèi)存耗盡錯誤的產(chǎn)生。SOURCES設(shè)置Fortran代碼文件名,用來將Fortran代碼文件添加到項目中。

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

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

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

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

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

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

        在QtCreator中,需要對界面項目的pro文件進行如下配置:

        LIBS += fortranvmd.dll

        HEADERS += fortranvmd.h

        FORMS += EMDPLERDialog.h

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

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

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

        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]);//調(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)用平臺數(shù)據(jù)接口,將獲取到的outData中的輸出數(shù)據(jù)保存到平臺數(shù)據(jù)庫中

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

        G::free1float(res);

        G::free1float(h);

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

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

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

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

        4 對比分析

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

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

        5 結(jié)論

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

        猜你喜歡
        磁偶極子調(diào)用代碼
        核電項目物項調(diào)用管理的應用研究
        LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
        創(chuàng)世代碼
        動漫星空(2018年11期)2018-10-26 02:24:02
        創(chuàng)世代碼
        動漫星空(2018年2期)2018-10-26 02:11:00
        創(chuàng)世代碼
        動漫星空(2018年9期)2018-10-26 01:16:48
        創(chuàng)世代碼
        動漫星空(2018年5期)2018-10-26 01:15:02
        基于遞推更新卡爾曼濾波的磁偶極子目標跟蹤
        磁偶極子跟蹤的漸進貝葉斯濾波方法
        自動化學報(2017年5期)2017-05-14 06:20:53
        基于系統(tǒng)調(diào)用的惡意軟件檢測技術(shù)研究
        基于磁偶極子的磁場梯度張量縮并的試驗驗證及相關(guān)參數(shù)確定
        亚洲视频在线视频在线视频| 亚洲熟伦熟女新五十路熟妇| 免费AV一区二区三区无码| 亚洲国产av一区二区三| 那有一级内射黄片可以免费看| 天天摸夜夜摸摸到高潮| 中文字幕无码精品亚洲资源网久久| 国产精品欧美亚洲韩国日本| 水蜜桃网站视频在线观看| 亚洲精品国产成人片| 欧美aa大片免费观看视频| 精品久久亚洲一级α| 亚洲肥婆一区二区三区| 好大好湿好硬顶到了好爽视频 | 视频在线亚洲视频在线| 亚洲成a人片在线观看无码专区| 被群cao的合不拢腿h纯肉视频| 国产h视频在线观看网站免费| 国产午夜福利小视频在线观看| 很黄很色很污18禁免费| 亚洲人成人77777网站| 蜜芽尤物原创AV在线播放| 成人一区二区三区国产| 国产福利视频一区二区| 亚洲综合无码| 国产自拍伦理在线观看| 国产一区二区三区久久精品| 亚洲精品网站在线观看你懂的| 国产极品视觉盛宴在线观看| 日本中文字幕精品久久| 久久久久亚洲av成人网人人网站| 色丁香在线观看| 国产大屁股白浆一区二区三区| 少妇久久久久久被弄高潮| 亚洲成成品网站源码中国有限公司| 国产美女av一区二区三区| 成人免费在线亚洲视频| 中国国语毛片免费观看视频| 国产精品av在线一区二区三区 | 国产片在线一区二区三区| 国产精品户外野外|