钟政华 陈宏文
(广州海洋地质调查局,广州,510760)
第一作者简介:钟政华,男,1969年生,工程师,1991年毕业于成都地质学院物探专业,现于广州海洋地质调查局资料处理研究所任系统部主任。
摘要 应用在油气探测和天然气水合物研究中的高分辨率采集地震资料,其海量的数据对室内的处理提出了新的难题,不仅降低了对有效数据在磁盘中的使用率,也降低了处理效率。虽然可以通过计算机硬件的升级来提高处理效率,但是我们也应在处理软件方面寻求提高磁盘使用率和处理效率的办法。本文正是根据这个思路,分析了FOCUS地震资料处理系统中最常用的磁盘读写模块DSKRD和DSKWRT,最终修改形成了一对可以读写任意时间段地震道数据的新模块WINDWR和WINRD,在实际资料处理中取得令人满意的效果。
关键词 FOCUS地震资料处理系统 地震道数据 时间段 读写磁盘
1 引言
在室内的地震资料处理中,从野外磁带解编出来的地震数据一般都是写到大容量磁盘中,以便往后接着处理。FOCUS系统中把地震数据写到磁盘的常用输出模块是DSWRT,为了提高效率和数据压缩率,FOCUS系统使用了矢量数据存储格式(VDS Vector Data Storage)存储数据,模块DSKRD则是读取由模块DSKWRT写到磁盘中的VDS格式地震数据。
DSKWRT写到磁盘中的地震数据必须从时间为0秒开始的,其模块参数中没有时间窗口参数的选择。FOCUS系统中其他的输出模块如GOUT(SEG-Y格式输出)、TAPOUT(磁带格式输出)等也有类似的缺点。
同样地,模块DSKRD读入地震道数据时必须从时间为0秒开始的,它不能读入从非0秒开始的地震道数据。其模块参数中也没有时间窗口参数(可以定义地震道输入的长度)。如记录长度为6秒的地震道数据可以输入成从0秒至4秒的长度为4秒的记录,但是不能输入从2到6秒长度为4秒的地震道记录。其他的输入模块如GIN(SEG-Y格式输入)、TAPIN(磁带格式输入)等也一样不能读入非0秒开始的地震数据。
图1所示左面第一图“0-6s-S”是DSKRD模块读入一炮记录长度为6秒的地震纪录,其中海底大约在1秒处,显然海底以上的数据对地层数据的处理是没有帮助的,如果我们可以从以海底的时间作为数据记录的开始时间来处理,那么数据的存贮量会减少,也会提高处理的效率,这在深海地震数据资料的处理中效果肯定尤为显著。甚至,在清楚目的地层的特殊处理中,如果只需要处理其中某一时间段的地震数据(比如3~5秒),那么能够实现任意时间段的数据输入和输出肯定是可以提高地震资料处理的效率的。这在高分辨天然气水合物地震资料的处理得到充分体现。
图1 从0秒开始读入数据与任意时间段读入数据的比较
Fig.1 The seismic data read from 0 second and any time gate
依据以上的思路,图1中右边三个子图所示是我们期望的可以读入或输出的时间段(可从非0秒开始)的地震道数据,即:“500-25000-S”图是从0.5秒开始到2.5秒的地震记录,“2000-4000-S”图是从2秒到4秒的地震记录,“5000-6000”图是从5秒到6秒的地震记录。
2 方法原理
2.1 原模块DSKWRT和DSKRD的分析
图2和图3分别是模块DSKWRT和DSKRD的大致程序结构流程示意简图。
在图2和图3中的“输入可选参数”中都没有时间段(时间窗口)的选择,即地震道数据是必须是从开始时间为0秒来处理的。由于读入的地震道数据是从0秒开始的地震道数据,所以在“处理选择的参数”中就不需要在地震道数据的时间参数作处理。
图2 模块DSKWRT的流程图
Fig.2 The flow chart of model DSKWRT
图3 模块DSKRD的流程图
Fig.3 The flow chart of model DSKRD
2.2 原模块程序的简单分析
模块DSKWRT的关键子程序包括VDS-RFSNEW子程序(用于建立一个VDS格式磁盘文件)和VDS-RSFPUT子程序(用来将数据写到由VDS-RFSOLD子程序打开的磁盘文件)。它们的使用语法如下:
CALL VDS-RSFNEW(UNIT,FIL-NAME,OPNOPTS,STATUS,SAMP-UNITS,SAMP-RATE,NUM-SAMP,SAMP-START,SAMP-DATUM,AMP-UNITS,DATA-CLASS,GEOMETRY,IBASE,IX-HDRDEF,ORDER-NAM,DIRECTION,MAXNTR)
CALL VDS-RFSPUT(UNIT,FUNCTION,HEADER,STATUS)
模块DSKRD的关键子程序包括VDS-RFSOLD子程序(用于打开VDS格式磁盘文件)和VDS-RSFGET子程序(读取由VDS-RFSOLD子程序打开的磁盘文件)。它们的使用语法如下:
CALL VDS-RFSOLD(UNIT,FIL-MAME,OPNOPTS,STATUS,SAMP-UNITS,SAMP-RATE,NUM-SAMP,SAMP-START,SAMP-DATUM,AMP-UNITS,DATA-CLASS,GEOMETRY,IBASE,IX-HDRDEF,ORDER-NAM,DIRECTION,MAXNTR,NUM-FUNC)
CALL VDS-RSFGET(UNIT,FUNC,HEADER,STATUS)
2.3 新模块WINWRT和WINRD的设计思路
图4和图5分别是模块WINWRT和WINRD的大致程序结构流程示意简图。
图4 模块WINWRT的流程图
Fig.4 The flow chart of model WINWRT
图5 模块WINRD的流程图
Fig.5 The flow chart of model WINRD
在图2和图3中的“输入可选参数”中都没有时间段(时间窗口)的选择,因此,在“输入可选参数”里应增加一组定义时间段的参数,使得我们可以读写(处理)任何时间段的地震道数据,这一组参数包括了定义时间段的开始时间TST、结束时间TND等参数,TST的隐含值为0秒,TND的隐含值为地震道记录长度。
在WINWRT中还增加了开关参数ZERO它使得输出的数据可以兼容DSKRD。当开关参数定义为ZERO,则输出文件是从0秒开始的,但从0秒至TST的时间段内地震道的值被填充为0.0,这样模块DSKRD和WINRD都可以读取该文件;如果开关参数定义为NOZERO,则输出数据只是定义TST和TND时间段的地震道数据值,这样可以节省输出文件的磁盘空间。
新模块WINWRT和WINRD在没有定义可选项WINDOWS的参数时,其功能和使用方法分别与DSKWRT和DSKRD模块一样。
3 实现步骤
根据以上的思路,在原模块DSKWRT和DSKRD基础上修改形成的新模块WINWRT和WINRD的具体步骤如下:
1)拷贝原模块的程序,更名为新模块WINWRT和WINRD
2)在新模块的参数定义中增加时间窗口WINDOWS的参数TST、TEND和ZERO
3)在各子程序中作必要的修改;
4)按FOCUS系统模块开发的方法编译新模块参数;
5)使用Makefile编译模块的子程序;
6)编辑FOCUS系统的模块库卡片,加入新模块名;
7)使用link-focus将新模块链入FOCUS系统。
4 应用的效果
修改完成后的WINWRT模块经过测试,可以输出任意时间段的数据的VDS文件。表1是读入一炮记录长度为6秒的地震纪录后使用WINWRT输出的VDS格式磁盘文件的统计列表。表中文件名是按输出数据的时间段来取名的。如文件“0-6000”的是从0秒至6秒(6000毫秒)的数据,其大小为18506916字节。
列表的左边部分,文件输出是从0秒开始输出的,其中从0秒至TST的数据是0.0,这些文件的大小都与使用原模块DSKWRT输出的VDS文件大小一样,原模块DSKRD可以读它们。从表中可以看出:虽然文件“5000-6000”只有1秒的非零数据,其文件的大小却与文件“0-6000”的大小相差无几,都超过18.5兆字节。
列表的右边部分,文件是从TST开始输出的,没有从0秒至TST的数据。原模块DSKRD不能读这些文件。
比较看出:文件“new-500-2500”和“new-2000-4000”都是2秒长度的数据,不管其时间深度,文件的大小是相近的,约6.2兆字节:文件“new-5000-6000”包含1秒长度的数据,不管其所处的时间深度,文件的大小只有3.1兆字节,而如果从0秒开始输出其大小超过18兆字节。
5 结论
经过以上对模块的分析、修改和对实际地震道资料的处理应用,可以看出新模块成功地达到输入/输出任意时间段的地震道数据文件的设想,而且还兼容FOCUS系统的原磁盘读写模块DSKWRT和DSKRD;由于输出可以只储存目标时间段的数据,因此不仅可以有效地节省磁盘的使用空间,同时也明显地提高了数据处理的效率。目前,FOCUS系统不仅是一个地震资料处理的有力工具,也已经成为我们试验、开发新模块和新算法的平台。
表1 模块WINWRT输出文件列表
Implement of Input/Output Seismic Traces With Any Time Gate In Focus Syste
Zhong Zhenghua Chen Hongwen
(Guangzhou▪Marine Geology Survey,Guangzhou,510760)
Abstract:The great capacity seismic data,which apply to the gas ewploration or the study in gas hydrate and gathered by high differentiate method,bring forward a new problem to data processing.It not only needs the large disk capacity,but also depresse the processing efficiency.We can improve the system performance by upgraded the computer hardware and devices.But we should do it in updating the data processing model.According to this,the article analysis the most common disk read-write model,DSKWRT and DSKRD,in FOCUS system,and design a new couple disk read-write-model,WINWRT and WINRD.We got a satisfactory result in the actual data processing application.
Key Words:FOCUS seismic data processing system Seismic traces Time gate Read-write in disk
相信很多刚接触AndroidTV开发的开发者,都会被各种焦点问题给折磨的不行。不管是学技术还是学习其他知识,都要学习和理解其中原理,碰到问题我们才能得心应手。下面就来探一探Android的焦点分发的过程。
Android焦点事件的分发是从ViewRootImpl的processKeyEvent开始的,源码如下:
源码比较长,下面我就慢慢来讲解一下具体的每一个细节。
dispatchKeyEvent方法返回true代表焦点事件被消费了。
ViewGroup的dispatchKeyEvent()方法的源码如下:
(2)ViewGroup的dispatchKeyEvent执行流程
(3)下面再来瞧瞧view的dispatchKeyEvent方法的具体的执行过程
惊奇的发现执行了onKeyListener中的onKey方法,如果onKey方法返回true,那么dispatchKeyEvent方法也会返回true
可以得出结论:如果想要修改ViewGroup焦点事件的分发,可以这么干:
注意:实际开发中,理论上所有焦点问题都可以通过给dispatchKeyEvent方法增加监听来来拦截来控制。
(1)dispatchKeyEvent方法返回false后,先得到按键的方向direction值,这个值是一个int类型参数。这个direction值是后面来进行焦点查找的。
(2)接着会调用DecorView的findFocus()方法一层一层往下查找已经获取焦点的子View。
ViewGroup的findFocus方法如下:
View的findFocus方法
说明:判断view是否获取焦点的isFocused()方法, (mPrivateFlags &PFLAG_FOCUSED) != 0 和view 的isFocused()方法是一致的。
其中isFocused()方法的作用是判断view是否已经获取焦点,如果viewGroup已经获取到了焦点,那么返回本身即可,否则通过mFocused的findFocus()方法来找焦点。mFocused其实就是ViewGroup中获取焦点的子view,如果mView不是ViewGourp的话,findFocus其实就是判断本身是否已经获取焦点,如果已经获取焦点了,返回本身。
(3)回到processKeyEvent方法中,如果findFocus方法返回的mFocused不为空,说明找到了当前获取焦点的view(mFocused),接着focusSearch会把direction(遥控器按键按下的方向)作为参数,找到特定方向下一个将要获取焦点的view,最后如果该view不为空,那么就让该view获取焦点。
(4)focusSearch方法的具体实现。
focusSearch方法的源码如下:
可以看出focusSearch其实是一层一层地网上调用父View的focusSearch方法,直到当前view是根布局(isRootNamespace()方法),通过注释可以知道focusSearch最终会调用DecorView的focusSearch方法。而DecorView的focusSearch方法找到的焦点view是通过FocusFinder来找到的。
(5)FocusFinder是什么?
它其实是一个实现 根据给定的按键方向,通过当前的获取焦点的View,查找下一个获取焦点的view这样算法的类。焦点没有被拦截的情况下,Android框架焦点的查找最终都是通过FocusFinder类来实现的。
(6)FocusFinder是如何通过findNextFocus方法寻找焦点的。
下面就来看看FocusFinder类是如何通过findNextFocus来找焦点的。一层一层往下看,后面会执行findNextUserSpecifiedFocus()方法,这个方法会执行focused(即当前获取焦点的View)的findUserSetNextFocus方法,如果该方法返回的View不为空,且isFocusable = true &&isInTouchMode() = true的话,FocusFinder找到的焦点就是findNextUserSpecifiedFocus()返回的View。
(7)findNextFocus会优先根据XML里设置的下一个将获取焦点的View ID值来寻找将要获取焦点的View。
看看View的findUserSetNextFocus方法内部都干了些什么,OMG不就是通过我们xml布局里设置的nextFocusLeft,nextFocusRight的viewId来找焦点吗,如果按下Left键,那么便会通过nextFocusLeft值里的View Id值去找下一个获取焦点的View。
可以得出以下结论:
1. 如果一个View在XML布局中设置了focusable = true &&isInTouchMode = true,那么这个View会优先获取焦点。
2. 通过设置nextFocusLeft,nextFocusRight,nextFocusUp,nextFocusDown值可以控制View的下一个焦点。
Android焦点的原理实现就这些。总结一下:
为了方便同志们学习,我这做了张导图,方便大家理解~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)