切换到宽版
  • 10246阅读
  • 86回复

[其他]地震处理软件开发 GeoSong [复制链接]

上一主题 下一主题
离线kissengers
发帖
604
财富
707
威望
7
交易币
0
只看该作者 50楼 发表于: 2011-03-12 | 石油求职招聘就上: 阿果石油英才网
牛呀,看界面还成呀!不过不知道做到什么程度了
离线silverwing
发帖
72
财富
303
威望
2
交易币
0
只看该作者 51楼 发表于: 2011-03-13 | 石油求职招聘就上: 阿果石油英才网
说完了操作,下面介绍怎么开发一个模块。 GeoSong系统当前版本提供了两个基本基础类,是开发模块必须用到的。
先介绍这两个类。

我是使用QT creator做开发环境的,这先介绍.pro文件,如果开发者不是用QT creator的话,就不用管了。

#-------------------------------------------------
#
#Copyright 2010-2011 by Xiaoping Song.
#Permission is granted to anyone to make or distribute verbatim copies of this document as received,
#in any medium, provided that the copyright notice and the permission notice are preserved,
# and that the distributor grants the recipient permission
#for further redistribution as permitted by this notice.
#
#-------------------------------------------------
QT       -= core gui
CONFIG+= qt release
TARGET = gs10_gather
TEMPLATE = lib
CONFIG += staticlib
DESTDIR = D:\project\GeoSong\Target
SOURCES += gs10_gather.cpp
HEADERS += gs10_gather.h

下载一个QT creator 2.0 SDK包,就自带QT4.7库。这样就方便开发了,我把project放在D:\project\GeoSong目录下,把所有目标文件和可执行文件放在D:\project\GeoSong\Target目录下,后面会有其他的pro文件可能包含了这样的路径。如果开发者路径不同,需要小心查看先,并把目录改好才能正确编译。

地震数据的单位从小到大有样点,道,道集等,在GeoSong系统里面操作的对象就是道集(gather),我们定义了一个Gs10_gather类用来实现这样的对象,上面就是这个类的头文件。以GeoSong为平台做开发,这个类是最常用的对象,目前它的成员函数还很简单,后面会丰富起来,以帮助开发者减少重复的工作。
#ifndef GATHER_H
#define GATHER_H
class Gs10_gather {
public:
    Gs10_gather();
    ~Gs10_gather();
    int gatherIndex,gatherID,traceNum,traceSize;
//道集在数据中的序号,道集的ID,道集中的道数,每道字节数
    int intervalUM,sampleNum,measureUnit;
//采样间隔(um),每道样点数,度量系统(米制/英制)
    char *traces;                        
//道集数据在内存中存储的起始位置(char *trace),这块内存的大小是traceNum*traceSize
    int copy(Gs10_gather *);             //从复制另一道集的数据,并修改本道集的对应参数
    int appendTrace(char* buff,int size);    //在数据后添加size字节数的道,数据内容从*buff读取
    int newTraces(int size);               //删除已有数据,申请size字节的新数据空间
    int getHeader4I(int chanNum,int byteFrom);
//按照4字节整形,取第chanNum道第byteFrom字节起的道头(注意,chanNum范围1-traceNum)
    int getHeader2I(int chanNum,int byteFrom);
//按照2字节整形,取第chanNum道第byteFrom字节起的道头(注意chanNum)
    int setHeader4I(int chanNum,int byteFrom,int value);  
//按照4字节整形,设置第chanNum道第byteFrom字节起的道头(注意chanNum)
    int setHeader2I(int chanNum,int byteFrom,short value);
//按照2字节整形,设置第chanNum道第byteFrom字节起的道头(注意chanNum)
    int scanMuTime();    
//扫描每道的第一个/最后一个非零样点对应时间值,并将其存储在道头111-112和113-114中
    int scanOffset(float *offsetTable,int flag);  //flag=0,1 从坐标计算或者直接读offset值
    int scanOffset();                      //从坐标计算offset并写入offset道头中
};
#endif // GATHER_H

为了实现处理模块跟平台独立,我们规定了一个基本模块类作为所有模块的父类。
#ifndef GS11_FUNCBASE_H
#define GS11_FUNCBASE_H
#include <string>
#include "gs10_gather.h"
using namespace std;
class Gs11_funcBase {
public:
    Gs11_funcBase();
    int funcIndex;                                            //模块在流程的序号
    virtual int exec(Gs10_gather**,Gs10_gather**,Gs10_gather**);   //执行函数
    virtual ~Gs11_funcBase();
};
#endif // FUNCBASE_H

其他所有的模块都从这个基类继承而来,这样系统在调用的时候,使用父类的统一的执行函数(exec())。
离线silverwing
发帖
72
财富
303
威望
2
交易币
0
只看该作者 52楼 发表于: 2011-03-13 | 石油求职招聘就上: 阿果石油英才网
有了操作的对象和统一的接口,我们来试着开发一个模块taper,它的功能是寻找一道第一个/最后一个非零样点值,根据用户的option给顶/底的振幅做斜坡。
我们来看它的头文件。
#ifndef TAPER_H
#define TAPER_H
#include <gs11_funcbase.h>
#include <gs10_gather.h>
#include <string>
#include <vector>
using namespace std;
class TAPER : public Gs11_funcBase
{    
public:
    TAPER();
    int option,taperLength;                 //option 0:做顶,1:做底, 2:上下都做
    int exec(Gs10_gather** gatherIN,Gs10_gather** gatherOUT,Gs10_gather** gatherTMP);
    ~TAPER();
};
extern "C" int checkin(int funcIndex,vector<string> *parList,Gs11_funcBase**);
#endif // TAPER_H

我们从上往下看,首先它包含了两个基础类,一个是操作的对象作为exec的参数,另一个是这个模块的父类,提供了虚函数提供统一的调用函数。
此外,它还包含了string和vector类,原本我的习惯是使用更加便利的QString和QList类,不过考虑到第三方开发者使用标准C++所以在这里使用了这两个类。他们为后面的checkin函数提供参数字符串组。
下面是TAPER类的声明,它继承自Gs11_funcBase类。其中exec对父类的虚函数重载,也就是这个模块将要多道集进行的运算过程。它的参数是三个指向道集对象指针的指针,分别为输入道集,输出道集,和临时道集。这里对临时道集使用举一个例子,假设有一个类似于promax的windowed process模块,它们成对出现,第一个模块根据指定窗口把数据分成两部分,一部分作为输出道集供后续模块处理,另一部分保存在临时道集中,当后续处理完后,第二个模块出现,它将前面的输出道集和临时道集合并为一个道集。这个过程就可以实现如区域滤波这样的操作了,需要注意的是,使用临时道集的模块成对但不可以嵌套。在实际处理中,用到临时道集的模块很少。

在定义完TAPER类以后,我们会看到有一个一个checkin函数。extern "C"表示这个函数为C语言函数,因为动态连接库是C的概念而不是C++的。在这里感慨一下,C才是王道啊,MPICH还有CUDA什么的,都是C的库而不是C++的。具体的区别有兴趣的朋友google去吧。

Checkin函数的参数为int funcIndex,vector<string> *parList,Gs11_funcBase**,分别是模块在流程中的序号,字符串形式存在的参数组,模块对象指针的指针。前两者为第三者的参数,下面我们来看实现的过程。

int checkin(int funcIndex, vector<string> *parList, Gs11_funcBase **generalOBJ)
{
    if(parList->size()!=2)    //taper有两个参数,这是在外部的dllParTemplate文件中规定的
    {
        std::cout<<"The number of TAPER parameters is wrong for the DLL!\n";
        return -1;
    }
    TAPER* taperOBJ=new TAPER();   //声明一个Taper对象,第三个参数基类指针的指针将会指向它
                                //这样的整个流程的执行中,程序不用将不同的模块做区别对待
    taperOBJ->option=atoi(parList->at(0).c_str());  //第一个参数是option:顶,底抑或都做斜坡
    taperOBJ->taperLength=atoi(parList->at(1).c_str()); //斜坡长度
    taperOBJ->funcIndex=funcIndex;
    *generalOBJ=taperOBJ;
    return 1;
}
离线silverwing
发帖
72
财富
303
威望
2
交易币
0
只看该作者 53楼 发表于: 2011-03-13 | 石油求职招聘就上: 阿果石油英才网
到这里我们有了一个taper类,它通过父类的形式交给程序来调用,并且它需要的两个参数也已经输入了。这时各位看官该关心dllParTemplate这个文件了,这是个文本文件,用记事本或者vim什么打开,这里把关于taper的部分贴出来。
TAPER       :\n taper amplitudes on top or bottom or both sides.    #模块名 说明文字
            @radio,Choose Taper Side|Top|Bottom|Both Sides,2;   #用@分隔,后面为参数表
#参数间用分号;分隔
            int,Taper Length(ms),200&      
其中第一个参数的外观为Radio button的形式,它的标签为choose taper side,它有三个选项,默认选项为2;第二个参数为int形式,标签taper length(ms),默认为200。GeoSong从dllParTemplate中读取到了这些信息,为这个模块创建外观如下。


这是一个动态的过程,也就是说你可以根据需要在dllParTemplate中规定自己模块的形式,而独立于GeoSong程序本身。GeoSong目前提供有整数,浮点数,字符串,文本,输入文件路径,输出文件路径,单选,多选和表格等形式,基本上可以实现各种参数输入的需要。上面的例子使用了其中单选和整数两种形式。

当选择top时,系统给模块传递0,选择bottom时传递1,选择both时传递2。参数传递由GeoSong来完成,那么我们就专心写好自己的执行程序就好。这个模块的实现过程很简单。
TAPER::TAPER()
{
    option=2;
    taperLength=0;
}
TAPER::~TAPER()
{
}
int TAPER::exec(Gs10_gather **gatherIN, Gs10_gather **gatherOUT, Gs10_gather **gatherTMP)
{
    if((*gatherIN)==0||(*gatherIN)->traceNum==0) return 0;
    (*gatherIN)->scanMuTime();
    
    int traceNum=(*gatherIN)->traceNum;
    int sampleNum=(*gatherIN)->sampleNum;
    int traceSampleNum=sampleNum+60;
    int intervalUM=(*gatherIN)->intervalUM;
    int taperSamples=taperLength*1000/intervalUM;
    float *buff=(float *)(*gatherIN)->traces;
    
    int startSample,endSample;
    
    float scaller[taperSamples];
    for(int i=0;i<taperSamples;i++)
        scaller=(float)(i+1)/taperSamples;
    
    if(option==0||option==2)
        for(int i=0;i<traceNum;i++)
        {
            startSample=(*gatherIN)->getHeader2I(i+1,111)*1000/intervalUM;
            endSample  =(startSample+taperSamples-1<sampleNum-1)?startSample+taperSamples-1:sampleNum-1;
            for(int j=startSample;j<=endSample;j++)
                buff[i*traceSampleNum+j+60]*=scaller[j-startSample];
        }
    
    if(option==1||option==2)
        for(int i=0;i<traceNum;i++)
        {
            endSample=(*gatherIN)->getHeader2I(i+1,113)*1000/intervalUM;
            startSample  =(endSample-taperSamples+1>0)?endSample-taperSamples+1:0;
            for(int j=startSample;j<=endSample;j++)
                buff[i*traceSampleNum+j+60]*=scaller[endSample-j];
        }
    *gatherOUT=*gatherIN;
    return 1;
}
这么看来,做一个模块是不是很简单啊,对于一个新使用GeoSong的朋友来说,唯一一点点的麻烦就是exec函数的第二行用到Gs10_gather类的scanMuTime函数,去翻看一下这个函数的意义而已。
离线silverwing
发帖
72
财富
303
威望
2
交易币
0
只看该作者 54楼 发表于: 2011-03-13 | 石油求职招聘就上: 阿果石油英才网
上面的操作和开发说明打包下载。
附件: GeoSong v1.2beta地震处理系统使用者和开发者手册.pdf (2554 K) 下载次数:2 ,你所在用户组没有附件下载权限 VIP会员免积分下载售价:1财富[记录]
1条评分
坐看云起 财富 +50 - 2011-03-19
离线allstar00001
发帖
32
财富
44
威望
0
交易币
0
只看该作者 55楼 发表于: 2011-03-13 | 石油求职招聘就上: 阿果石油英才网
不错,支持,加油
离线silverwing
发帖
72
财富
303
威望
2
交易币
0
只看该作者 56楼 发表于: 2011-03-14 | 石油求职招聘就上: 阿果石油英才网
      
[ 此帖被silverwing在2011-03-14 00:15重新编辑 ]
离线yangwqcumt
发帖
814
财富
95
威望
15
交易币
0
只看该作者 57楼 发表于: 2011-03-14 | 石油求职招聘就上: 阿果石油英才网
许多地方看懂了,也有许多地方不太懂,但有一条知道了,那就是,geosong就是silverwing!顶你!
人生苦短,学海无涯
发帖
5
财富
0
威望
0
交易币
0
只看该作者 58楼 发表于: 2011-03-19 | 石油求职招聘就上: 阿果石油英才网
楼主很强大呀!一个人做不容易!提点建议:1界面操作要简单方便2兼容性好,做成一个平台可以让他人在你基础上添加其他模块以完善你的功能3要有自己的特色,别的大型软件不屑于做但又十分繁琐的地方做好,有些操作可以两种模式:一键完成或分步完成。有不对的地方望见谅!
离线jqtony
发帖
454
财富
1145
威望
10
交易币
0
只看该作者 59楼 发表于: 2011-03-19 | 石油求职招聘就上: 阿果石油英才网
向高人学习。从中找出一些能用得上的,哈哈


基础平台开源,才能吸引更多的高手完善。

网站事务咨询:QQ:1392013 | 26189883
阿果石油网为免费个人网站,为石油人提供免费的在线即时技术交流场所,拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论和行为!
如有言论或会员共享的资料涉及到您的权益,请立即通知网站管理员,本站将在第一时间给予配合处理,谢谢!