前一阵子,遇到修改地震数据道头的问题,很多软件没有这个功能,遂自己动手,查阅了大量文献资料。无奈我自己只会fortran,就写写吧,反正数值处理和计算并不需要很多界面。。。

下面是子程序

!C+-----------------------------------------------------------------------+

!C| Module        : SGY文件读写模块(简版)                               |

!C| Last modified :10-22-2019                                            |

!C| Written by    : LAUQRU                                          |

!C| 主要功能:   1、支持IBM格式、IEEE格式、无卷头PC格式                  |

!C|               2、自动判断文件格式                                     |

!C|               3、自动读取采样长度、采样率及道数                       |

!C+-----------------------------------------------------------------------+

|

!C+-----------------------------------------------------------------------+

module SGYmodule

implicit none

contains

!C+-----------------------------------------------------------------------+

!C| Subroutine    : GetFileLength                                         |

!C| Last modified : 10-22-2019                                           |

!C| Written by    : LAUQRU                                           |

!C| 主要功能:   1、获得文件大小                                         |

!C+-----------------------------------------------------------------------+

Subroutine  GetFileLength( FileName,Length )

!    USE DFPORT

implicit none

character(len=128)::FileName

Integer(kind=4)::Length

INTEGER*4 ierr, statb(13)

ierr = STAT ( FileName, statb )

if ( ierr .ne. 0 ) stop 'stat: error'

Length = statb(8)

End Subroutine

!C+-----------------------------------------------------------------------+

!C| Subroutine    : PREREAD                                               |

!C| Last modified : 10-22-2017                                            |

!C| Written by    : LAUQRU                                           |

!C| 主要功能:   1、预读SGY文件,获取相关参数                            |

!C+-----------------------------------------------------------------------+

!C| SgyFormat:0--IBM,1--IEEE,2--无卷头PC                                 |

!C+-----------------------------------------------------------------------+

Subroutine  PREREAD( FileName,SgyFormat,NTR,NT,DT )

implicit none

character(len=128)::FileName

integer:: ios,mark_pos=1

character(len=128):: iom='OK'

Integer(kind=4)::Length,NTR,NT,DT,tmp

integer(kind=1)::SgyFormat

integer(kind=2),dimension(1800):: REEL !3600字节

integer(kind=2),dimension(120):: HEAD  !240字节

CALL GetFileLength(FileName, Length)

!    WRITE(*,*)Length

!==============================================================================

!  打开SEG-Y文件

!==============================================================================

open(70,file=FileName,       &

access='stream',          &    !<< 流访问,即按字节访问文件

form='unformatted',       &

CONVERT='BIG_ENDIAN',     &    !<< IEEE Big Endian  ^^ Little_ENDIAN

iostat=ios,               &

iomsg=iom)

read(70)REEL

dt = reel(1609)

nt = reel(1611)

tmp = Mod(Length - 3600, nt * 4 +240)

read(70)HEAD

if(tmp .eq.0 .and. HEAD(58) .eq. nt .and. head(59) .eq.dt) then

SgyFormat = 0

NTR = (Length - 3600) / (nt * 4 +240)

!    write(*,*)"IBM Format"

else

close(70)

mark_pos=1

open(70,file=FileName,    &

access='stream',          &    !<< 流访问,即按字节访问文件

form='unformatted',       &

CONVERT='Little_ENDIAN',  &    !<< IEEE Big Endian  ^^ Little_ENDIAN

iostat=ios,               &

iomsg=iom)

REWIND(UNIT=70)

read(70)REEL

dt = reel(1609)

nt = reel(1611)

tmp = Mod(Length - 3600, nt * 4 +240)

read(70)HEAD

if(tmp .eq.0 .and. HEAD(58) .eq. nt .and. head(59) .eq.dt) then

SgyFormat = 1

NTR = (Length - 3600) / (nt * 4 +240)

!        write(*,*)"IEE 带卷头Format"

else

REWIND(UNIT=70)

read(70)HEAD

dt = head(59)

nt = HEAD(58)

tmp = Mod(Length, nt * 4 +240)

if(tmp .eq.0 ) then

NTR = Length/ (nt * 4 +240)

SgyFormat = 2

!      write(*,*)"IEEE 无卷头Format"

end if

end if

end if

close(70)

End Subroutine

!C+-----------------------------------------------------------------------+

!C| Subroutine    : READSgy                                               |

!C| Last modified : 10-22-2019                                            |

!C| Written by    : LAUQRU                                          |

!C| 主要功能:   1、读取SGY文件                                          |

!C+-----------------------------------------------------------------------+

!C| SgyFormat:0--IBM,1--IEEE,2--无卷头PC                                 |

!C+-----------------------------------------------------------------------+

Subroutine READSgy( FileName,SgyFormat,NTR,NT,Date,REEL,SgyHead )

implicit none

character(len=128)::FileName

Integer(kind=4)::NTR,NT,i

integer(kind=1)::SgyFormat

integer:: ios

character(len=128):: iom='OK'

integer(kind=2),dimension(1800):: REEL !3600字节

!    integer(kind=2),dimension(120):: HEAD  !240字节

real(kind=4)::Date(NTR,NT)

Integer(kind=2)::SgyHead(NTR,120)

if(SgyFormat .EQ. 0) then !IBM格式文件的读取

open(70,file=FileName,    &

access='stream',          &    !<< 流访问,即按字节访问文件

form='unformatted',       &

CONVERT='BIG_ENDIAN',     &    !<< IEEE Big Endian  ^^ Little_ENDIAN

iostat=ios,               &

iomsg=iom)

read(70)REEL

Do i=1,Ntr

Read(70)SgyHead(i,:),Date(i,:)

End DO

Close(70)

else if(SgyFormat .EQ. 1) then !IEEE文件的读取

open(70,file=FileName,    &

access='stream',          &    !<< 流访问,即按字节访问文件

form='unformatted',       &

CONVERT='Little_ENDIAN',     &    !<< IEEE Big Endian  ^^ Little_ENDIAN

iostat=ios,               &

iomsg=iom)

read(70)REEL

Do i=1,Ntr

Read(70)SgyHead(i,:),Date(i,:)

End DO

Close(70)

else if(SgyFormat .EQ. 2) then  !无卷头PC格式的读取

open(70,file=FileName,    &

access='stream',          &    !<< 流访问,即按字节访问文件

form='unformatted',       &

CONVERT='Little_ENDIAN',     &    !<< IEEE Big Endian  ^^ Little_ENDIAN

iostat=ios,               &

iomsg=iom)

Do i=1,Ntr

Read(70)SgyHead(i,:),Date(i,:)

End DO

Close(70)

end if

End Subroutine

!C+-----------------------------------------------------------------------+

!C| Subroutine    : WriteSgy                                              |

!C| Last modified : 10-22-2019                                            |

!C| Written by    : LAUQRU                                           |

!C| 主要功能:   1、写SGY文件                                            |

!C+-----------------------------------------------------------------------+

!C| SgyFormat:0--IBM,1--IEEE,2--无卷头PC                                 |

!C+-----------------------------------------------------------------------+

Subroutine  WriteSgy( FileName,SgyFormat,NTR,NT,Date,REEL,SgyHead )

implicit none

character(len=128)::FileName

Integer(kind=4)::NTR,NT,i

integer(kind=1)::SgyFormat

integer:: ios

character(len=128):: iom='OK'

integer(kind=2),dimension(1800):: REEL !3600字节

!    integer(kind=2),dimension(120):: HEAD  !240字节

real(kind=4)::Date(NTR,NT)

Integer(kind=2)::SgyHead(NTR,120)

if(SgyFormat .EQ. 0) then !IBM格式文件的读取

open(70,file=FileName,    &

access='stream',          &    !<< 流访问,即按字节访问文件

form='unformatted',       &

CONVERT='BIG_ENDIAN',     &    !<< IEEE Big Endian  ^^ Little_ENDIAN

iostat=ios,               &

iomsg=iom)

write(70)REEL

Do i=1,Ntr

Write(70)SgyHead(i,:),Date(i,:)

End DO

Close(70)

else if(SgyFormat .EQ. 1) then !IEEE文件的读取

open(70,file=FileName,    &

access='stream',          &    !<< 流访问,即按字节访问文件

form='unformatted',       &

CONVERT='Little_ENDIAN',     &    !<< IEEE Big Endian  ^^ Little_ENDIAN

iostat=ios,               &

iomsg=iom)

write(70)REEL

Do i=1,Ntr

Write(70)SgyHead(i,:),Date(i,:)

End DO

Close(70)

else if(SgyFormat .EQ. 2) then  !无卷头PC格式的读取

open(70,file=FileName,    &

access='stream',          &    !<< 流访问,即按字节访问文件

form='unformatted',       &

CONVERT='Little_ENDIAN',     &    !<< IEEE Big Endian  ^^ Little_ENDIAN

iostat=ios,               &

iomsg=iom)

Do i=1,Ntr

Write(70)SgyHead(i,:),Date(i,:)

End DO

Close(70)

end if

End Subroutine

end module

用文件fw读写链表_用FORTRAN95写的sgy文件读写程序相关推荐

  1. python对文件操作的相关函数_第六章、Python文件操作

    第六章.Python文件操作 Python可以对文件进行查看.创建等功能,可以对文件内容进行添加.修改.删除,且所使用到的函数在Python3.5.x为open,在Python2.7.x同时支持fil ...

  2. java 文件追加 变大_用java写在doc中追加内容代码时,为什么它只能写入一次内容,后面都只是增加文件的大小,不增加内容啊?...

    用java写在doc中追加内容代码时,为什么它只能写入一次内容,后面都只是增加文件的大小,不增加内容啊? 答案:1  信息版本:手机版 电脑版 解决时间 2020-07-02 16:34 已解决 20 ...

  3. java中文件处理之图片_在Java 7中处理文件

    java中文件处理之图片 以下是The Well-Grounded Java Developer的草稿的修改后的片段. 它使您快速了解与以前版本相比,在Java 7中操作文件要容易得多. 通过使用新的 ...

  4. oracle 控制文件在哪里设置_更改Oracle默认的控制文件设置

    环境:Windows XP SP2 32位 Oracle 9.2.0.1 32位 创建数据库后,Oracle默认的3个控制文件都在c:/oracle/oradata/SID/下,3个鸡蛋都在一个篮子里 ...

  5. python修改文件内容最后一行_关于python:如何修改文件的最后一行?

    我文件的最后一行是: 29-dez,40, 号 如何修改该行,使其显示: 29-Dez,40,90,100,50 号 注意:我不想写新行.我想在29-Dez,40,后面加一行新值. 我是Python的 ...

  6. python关于文件的编程题_《Python编程》源代码文件

    压缩包 : bbc59749e0028c3f1ab3a1c9a762a6d.rar 列表 <Python编程>源代码文件/.gitignore <Python编程>源代码文件/ ...

  7. 复制assert目录文件到私有目录_每天学点之CentOS文件/目录的权限

    Linux中,最基本的两个命令:"cd"与"ls"."cd"是可以切换目录,如:cd /dev,就是进入到"根"目录下的 ...

  8. win10 桌面的的文件都不见了 提示不注销保存都文件都为临时_无网也能传文件?!Win10 自带的“就近共享”功能这么腻害你知道吗?...

    给同事朋友发送文件,或在不同的电脑上互相传输文件都是很常见的需求.我们曾推荐过「 Feem」.「Send Anywhere」.「奶牛快传」.扫扫传.AirDroid 等都是文件传送工具利器. 但这类工 ...

  9. csv文件导入后台乱码_用Excel打开CSV格式文件乱码,三种方法可以处理好!

    日常办公中,我们使用办公软件办公是比较平凡的,现在的办公软件也有好几种(微软的office.金山的WPS等).而且小编觉得在所有的办公软件中是微软的office是比较有名的.这款软件不仅功能齐全,还可 ...

最新文章

  1. 不经历风雨,怎么能见彩虹!马克斯与我的不解之缘!
  2. Happy Number
  3. 【NLP】文本分类还停留在BERT?对偶对比学习框架也太强了
  4. nyoj 586 疯牛(二分+贪心)
  5. 如果编程语言是女孩,你最喜欢哪一个?
  6. C语言的本质(37)——makefile之隐含规则和模式规则
  7. Unity中Debug打印信息的颜色设置
  8. stm32头文件学习之Core_cm3.c(h)
  9. Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
  10. android代码实现删除,Android中RecyclerView实现Item添加和删除的代码示例
  11. linux d开头是什么文件夹,linux文件权限,p开头/d开头/l开头
  12. ffmpeg源码简析(十)libswscale中的SwsContext,sws_scale()
  13. html塔防游戏,HTML5 版塔防游戏
  14. scrcpy CreateProcessW() error 5
  15. java软件开发工程师证书考试费用,太完整了!
  16. linux 替换文件中的字符串
  17. 钣金系统三维设计与工艺展开功能的实现
  18. TP6------邮箱验证码发送邮件
  19. Android 12 (S) 新加系统服务
  20. Fibonacci(斐波那契)数列

热门文章

  1. 第 16 章 MySQL Cluster
  2. sqlite数据库的多线程访问问题
  3. 实现 ASP.NET 网站地图提供者
  4. iOS,macOS,darwin,unix 简介
  5. linux ubuntu kubuntu与xubuntu等各版本差别
  6. 数字货币HD钱包 BIP32、BIP44、BIP39 简介
  7. linux c va_list 32位和64位的差异
  8. linux 找不到动态链接库 .so文件的解决方法
  9. WIn32中CInternetSession运行异常(afxCurrentAppName 为空)
  10. 内核模式下的字符串操作