• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于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ù)裝備對外依賴度高、探測深度淺和精度不高等問題開始暴露出來,嚴(yán)重制約我國深部礦產(chǎn)資源的有效探測,針對這些問題,以國家重點(diǎn)研發(fā)計(jì)劃《地下與井中地球物理勘探技術(shù)與裝備》項(xiàng)目為依托,重點(diǎn)開展對項(xiàng)目課題《地下與井中探測軟件平臺研發(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++編寫的跨平臺圖形界面程序開發(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ù)處理解釋平臺直接調(diào)用Fortran可執(zhí)行程序;田仁飛等[6]利用了Qt和Fortran的混編技術(shù)對地震倒頻屬性計(jì)算軟件進(jìn)行了開發(fā);陳楠等[7]利用Qt和Fortran語言混合編程技術(shù)開發(fā)了地震勘探可擴(kuò)展軟件平臺;李亞彬[8]使用Fortran語言編寫海洋電磁一維反演算法,Qt調(diào)用Fortran編譯的動態(tài)鏈接庫實(shí)現(xiàn)了海洋可控源電磁數(shù)據(jù)處理軟件的開發(fā);王銳[9]使用Qt多進(jìn)程調(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í)行程序的方式進(jìn)行混合編程,對平臺軟件模塊的安全性有一定程度的保障。在集成開發(fā)此類大型綜合性平臺軟件中,參與人員單位多,功能復(fù)雜,故在Qt中創(chuàng)建項(xiàng)目開發(fā)模板,用來統(tǒng)一規(guī)范動態(tài)鏈接庫生成時(shí)的命名規(guī)則和路徑以及眾多開發(fā)者的代碼規(guī)范,可以大大減小各開發(fā)者對算法模塊集成時(shí)和項(xiàng)目管理人員在模塊集成匯總時(shí)的工作量,其中模塊開發(fā)工程模板中的算法項(xiàng)目模板和界面項(xiàng)目模板,分別對Fortran代碼構(gòu)建的項(xiàng)目和用戶界面進(jìn)行配置、編譯。

      這里利用Qt開發(fā)交互式界面,利用Fortran編寫正演模塊算法,對兩種語言進(jìn)行混合編程,實(shí)現(xiàn)磁偶極子源的正演軟件在地下與井中探測軟件平臺上的集成應(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)由平臺數(shù)據(jù)庫、接口、數(shù)學(xué)運(yùn)算庫、動態(tài)鏈接庫和界面組成。

      平臺數(shù)據(jù)采用Extensible Markup Language(XML)數(shù)據(jù)庫技術(shù),對軟件中半結(jié)構(gòu)化的數(shù)據(jù)進(jìn)行存取和管理。平臺中數(shù)據(jù)的格式由兩部分構(gòu)成,分別為文件參數(shù)和數(shù)據(jù)體,文件參數(shù)部分包括數(shù)據(jù)體中屬性數(shù)據(jù)類型、屬性數(shù)量、屬性單位、數(shù)據(jù)行數(shù)、排序類型、版本號、文件描述等數(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é)算法形成公共動態(tài)庫,由磁偶極子源正演主程序進(jìn)行調(diào)用。此外平臺中提供了模塊集成開發(fā)模板,該模板由平臺開發(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動態(tài)鏈接庫的接口標(biāo)準(zhǔn)與C++調(diào)用Fortran動態(tài)鏈接庫的接口標(biāo)準(zhǔn)一致。在Qt調(diào)用Fortran生成的動態(tài)鏈接庫過程中,如果傳遞參數(shù)的數(shù)據(jù)類型不一致,會導(dǎo)致調(diào)用輸出結(jié)果出錯(cuò),所以在設(shè)計(jì)兩種語言傳遞參數(shù)類型的過程中,需要保持?jǐn)?shù)據(jù)類型的一致性,由于Fortran和C++的數(shù)據(jù)類型不是完全一致,就軟件中常用到的整型、浮點(diǎn)型和字符型而言,有以下的對應(yīng)關(guān)系[14-15],對應(yīng)關(guān)系如表2所示。

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

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

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

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

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

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

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

      表4 模型參數(shù)類型對應(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)識變量isCancel,在Fortran中對應(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)境,需要對算法項(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)動態(tài)鏈接庫生成路徑,代碼中的路徑即為開發(fā)人員指定的私有動態(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 生成動態(tài)鏈接庫

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

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

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

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

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

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

      LIBS += fortranvmd.dll

      HEADERS += fortranvmd.h

      FORMS += EMDPLERDialog.h

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

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

      在界面項(xiàng)目主程序中引入動態(tài)鏈接庫的頭文件,編寫調(diào)用動態(tài)鏈接庫代碼,調(diào)用部分代碼如下所示,對于算法中的模型參數(shù)電阻率res、層厚度h和自定義頻率序列freq,使用平臺公共接口G::alloc1float進(jìn)行內(nèi)存空間的申請,且該接口定義只用于接口變量,RdMemoryManager::allocateMemory2D接口用于C++代碼中變量的內(nèi)存空間申請,從界面獲取參數(shù)后,使用動態(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ù)輸出到平臺數(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)存空間

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

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

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

      4 對比分析

      設(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)過對比如圖7、圖8所示。

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

      5 結(jié)論

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

      猜你喜歡
      磁偶極子調(diào)用代碼
      核電項(xiàng)目物項(xiàng)調(diào)用管理的應(yīng)用研究
      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
      基于遞推更新卡爾曼濾波的磁偶極子目標(biāo)跟蹤
      磁偶極子跟蹤的漸進(jìn)貝葉斯濾波方法
      基于系統(tǒng)調(diào)用的惡意軟件檢測技術(shù)研究
      基于磁偶極子的磁場梯度張量縮并的試驗(yàn)驗(yàn)證及相關(guān)參數(shù)確定
      栖霞市| 宕昌县| 普格县| 手游| 龙井市| 龙川县| 石泉县| 海晏县| 景泰县| 桃园县| 石河子市| 临朐县| 鹿邑县| 定襄县| 西贡区| 阿坝县| 贞丰县| 南岸区| 宜阳县| 朝阳区| 巴楚县| 大新县| 裕民县| 应用必备| 沅陵县| 油尖旺区| 荆门市| 甘泉县| 六盘水市| 华蓥市| 循化| 连江县| 安新县| 重庆市| 镇巴县| 雅安市| 罗城| 来安县| 平南县| 株洲市| 兴国县|