Fortran Coder

查看: 4114|回复: 2
打印 上一主题 下一主题

[其他行业算法] 关于Fortran 读取IBM格式的segy,读取结果与Segy分析工具不一...

[复制链接]

25

帖子

10

主题

0

精华

熟手

F 币
158 元
贡献
82 点
跳转到指定楼层
楼主
发表于 2020-12-10 16:08:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 紫雪封尘 于 2020-12-10 16:22 编辑

我最近用Fortran 读取SUN工作站格式sgy文件,但是读取结果与segy分析工具和matlab 读取结果不一致 ,我感觉程序有问题,下面附上我的代码,请各位老师指教
open(70,file=FileName1,           &    !打开segy文件
    access='stream',                  &    !<< 流访问,即按字节访问文件
    form='unformatted',             &
    CONVERT='BIG_ENDIAN',     &    !<< IEEE Big Endian  ^^ Little_ENDIAN
    iostat=ios,                           &
    iomsg=iom)

Do i=1,ntrace
        irec=3600+(i-1)*(nt*4+240)  !读取的二进制位置
        read(70,pos=irec+1) head
        write(19,pos=(i-1)*240+1) head
        read(70,pos=73+irec) sx(i)   !道头中73-76字节表示炮点x坐标
        write(13,pos=(i-1)*4+1) sx(i)
        read(70,pos=77+irec) sy(i)   !道头中73-76字节表示炮点y坐标
        !!道头中77-80字节表示炮点y坐标
        write(14,pos=(i-1)*4+1) sy(i)
        read(70,pos=81+irec) rx(i)   !道头中81-84字节表示检波点x坐标
        write(15,pos=(i-1)*4+1) rx(i)
        read(70,pos=85+irec) ry(i)   !道头中85-88字节表示检波点y坐标
        write(16,pos=(i-1)*4+1) ry(i)
        read(70,pos=241+irec) (sgydata(j,i),j=1,nt)!!读取sgy数据
        write(*,*)sgydata(1,i)   
    End DO



分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
沙发
发表于 2020-12-10 21:27:55 | 只看该作者
因为你的系统是 IEEE浮点,而不是IBM浮点。你需要转换一下。

25

帖子

10

主题

0

精华

熟手

F 币
158 元
贡献
82 点
板凳
 楼主| 发表于 2020-12-13 19:28:50 | 只看该作者
vvt 发表于 2020-12-10 21:27
因为你的系统是 IEEE浮点,而不是IBM浮点。你需要转换一下。

您的意思是我读取的数据是IBM格式的,但是我是用IEEE格式的浮点数存储的,所以输出到屏幕上的数值是不正确的,需要改变存储的位顺序嘛?可我不是很清楚这个怎么转换啊,我倒是从网上找到了一篇文章,和C语言的代码,但是Fortran的转换,我无处下手,请指教啊
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-4-26 20:04

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表