SAC文件在FORTRAN和C中的读写
(2011-07-28 21:32:22)
标签:
sacfortranc子程序rsacwsac教育 |
SAC读写子程序
你可以利用SAC子程序库让自己的C或FORTRAN程序可以读写SAC格式的文件。这个库叫做sacio.a,位于sac下的lib目录中。当编译或者连接你的代码的时候,需要将sacio.a包含进去以使用下面即将讨论的子程序。
在SAC库中有两个子程序可以使你在自己的C或FORTRAN程序中读取SAC格式的文件。
- RSAC1 读取等间隔文件
- RSAC2 读取不等间隔文件和谱文件
还有一些字程序帮助你在读入文件之后获得、设置头段变量的值:
- GETFHV、SETFHV
获得、设置浮点型头段变量值
- GETIHV、SETIHV
获取、设置用整型枚举的字符串头段变量值
- GETKHV、SETKHV
获取、设置字符串头段变量值
- GETLHV、SETLHV
获得、设置逻辑型头段变量值(declared as long in C)
- GETNHV、SETNHV
获取、设置整型头段变量值
还有三个用于将SAC数据写入磁盘的子程序:
- WSAC1 写入等间隔文件
- WSAC2 写入不等间隔文件
- WSAC0
写入比另外两个包含更多头段信息的SAC文件(如果是新文件,那么它首先需要使用一个新的子程序NEWHDR来定义头段变量。如果是写入一个已经存在的文件则不应该调用NEWHDR,在写入这样一个文件之前,它要更新如DEPMAX和BAZ这样的头段变量)
最后,有一个子程序叫做NEWHDR,用于初始化所有的SAC头段变量为未定义状态,这个子程序和WSAC0连用。
读取一个等间隔采样的SAC文件:
大多数的SAC数据都是等间隔的,因而这个字程序很常用。使用rsac1()时,子程序将返回采样间隔、开始时间和振幅数据,剩下的头段变量值将一直储存在内存中等待稍后的使用直到下一次调用rsac1()。
下面给出在C和FORTRAN中调用rsac1()的简单例子,这些例子位于sac/doc/examples目录下。
Fortran rsac1f.f:
program rsac
implicit none
integer MAX
parameter (MAX=1000)
real yarray
dimension yarray(MAX)
real beg, del
integer nlen
character*10 KNAME
integer nerr
kname = 'FILE1'
call rsac1(kname, yarray, nlen, beg, del, MAX, nerr)
if(nerr .NE. 0) then
write(*,*)'Error reading in
file: ',kname
call exit(-1)
endif
!
Do some processing...
call exit(0)
end
程序定义了一个实型数组yarray(MAX),该数组用于储存读入的文件中每个数据点的振幅值,MAX为读入的最大点数,此处为1000个数据点。要读入的文件名为“FILE1”。
调用rsac1()时需要很多参数,这些参数在使用之前需要被定义:
-kname 要读入的文件名
-yarray 数据被载入yarray数组中
-nlen 数组长度
-beg 数据开始时间
-del 数据采样间隔
-MAX
所得读入的最大数据点数,如果文件数据点数超过MAX,剩下的不会被读取(个人揣测)
-nerr
错误返回标记,0代表成功,非零代表失败。在调用子程序之后检查nerr的值是很必要的,这可以帮助你减少不必要的麻烦。
如果想试试编译并执行这个程序,你还需要做下面一些准备:整个程序只是读取文件,并没有其他操作和输出,为了更好的检验结果不妨在call exit(0)之前输入类似于print yarray,nlen,beg,del,MAX,nerr之类的简单语句;另外要读取的文件FILE1还没有呢,可以用FUNCGEN函数生成一个地震数据,然后以FILE1(注意大小写一致)为文件名写入磁盘即可。可以使用原来曾经使用过的命令来编译这个文件:
gfortran -o rsac1 rsac1f.f
/usr/local/sac/lib/sacio.a
当然还有更通用一点的办法:
gfortran -o rsac1 rsac1f.f `sac-config --cflags
--libs sacio sac`
注意命令中有一对倒引号,另外这个命令牵涉到的一个脚本sac-config有些问题,需要修改才可使用,关于sac-config的修改以及使用请参见程序编译章节。
C rsac1c.c :
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sacio.h>
#define MAX 1000
int main(int argc, char **argv)
{
float yarray[MAX], beg, del;
int nlen, nerr, max = MAX;
char kname[ 11 ] ;
strcpy( kname , "FILE1" ) ;
rsac1( kname, yarray, &nlen,
&beg, &del, &max,
&nerr, strlen( kname ) ) ;
if ( nerr != 0 ) {
fprintf(stderr, "Error reading in SAC file: %s\n", kname);
exit ( nerr
) ;
}
exit(0);
}
C程序与上面的FORTRAN程序大体相同,注意在调用rsac1()时在nerr后需要一个额外的参数,这是一个字符串长度标记符,它指明了字符串kname的长度,这个长度不包含字符串结尾的结束标志"\0"。注意除了字符串长度标记符之外的其它参数都是传引用方式传递的。编译的方法与FORTRAN程序相似,但是有所有不同,gcc -o program rsac1c.c -lm `sac-config --cflags --libs sacio sac`
读取非等间隔数据文件:
子程序rsac2()用的不是很多。在调用rsac2()时时间和幅度数据都被返回并储存起来。不像rsac1(),起始时间和时间间隔并不会被返回因为这些信息随着时间数据一起被返回了。
Fortran rsac2f.f:
program rsac_2
implicit none
integer MAX
parameter (MAX=3000)
real xarray, yarray
dimension xarray(MAX), yarray(MAX)
character*10 kname
integer nlen
integer nerr
kname='file2'
call rsac2(kname,yarray,nlen,xarray,MAX,nerr)
if(nerr .ne. 0) then
write(*,*)'error reading in sac file: ',kname
call exit(-1)
endif
!
Do some processing ....
call exit(0)
end
你可以利用SAC子程序库让自己的C或FORTRAN程序可以读写SAC格式的文件。这个库叫做sacio.a,位于sac下的lib目录中。当编译或者连接你的代码的时候,需要将sacio.a包含进去以使用下面即将讨论的子程序。
在SAC库中有两个子程序可以使你在自己的C或FORTRAN程序中读取SAC格式的文件。
还有一些字程序帮助你在读入文件之后获得、设置头段变量的值:
还有三个用于将SAC数据写入磁盘的子程序:
最后,有一个子程序叫做NEWHDR,用于初始化所有的SAC头段变量为未定义状态,这个子程序和WSAC0连用。
读取一个等间隔采样的SAC文件:
大多数的SAC数据都是等间隔的,因而这个字程序很常用。使用rsac1()时,子程序将返回采样间隔、开始时间和振幅数据,剩下的头段变量值将一直储存在内存中等待稍后的使用直到下一次调用rsac1()。
下面给出在C和FORTRAN中调用rsac1()的简单例子,这些例子位于sac/doc/examples目录下。
Fortran rsac1f.f:
!
程序定义了一个实型数组yarray(MAX),该数组用于储存读入的文件中每个数据点的振幅值,MAX为读入的最大点数,此处为1000个数据点。要读入的文件名为“FILE1”。
调用rsac1()时需要很多参数,这些参数在使用之前需要被定义:
如果想试试编译并执行这个程序,你还需要做下面一些准备:整个程序只是读取文件,并没有其他操作和输出,为了更好的检验结果不妨在call exit(0)之前输入类似于print yarray,nlen,beg,del,MAX,nerr之类的简单语句;另外要读取的文件FILE1还没有呢,可以用FUNCGEN函数生成一个地震数据,然后以FILE1(注意大小写一致)为文件名写入磁盘即可。可以使用原来曾经使用过的命令来编译这个文件:
当然还有更通用一点的办法:
注意命令中有一对倒引号,另外这个命令牵涉到的一个脚本sac-config有些问题,需要修改才可使用,关于sac-config的修改以及使用请参见程序编译章节。
C rsac1c.c :
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sacio.h>
#define MAX 1000
int main(int argc, char **argv)
{
}
C程序与上面的FORTRAN程序大体相同,注意在调用rsac1()时在nerr后需要一个额外的参数,这是一个字符串长度标记符,它指明了字符串kname的长度,这个长度不包含字符串结尾的结束标志"\0"。注意除了字符串长度标记符之外的其它参数都是传引用方式传递的。编译的方法与FORTRAN程序相似,但是有所有不同,gcc -o program rsac1c.c -lm `sac-config --cflags --libs sacio sac`
读取非等间隔数据文件:
子程序rsac2()用的不是很多。在调用rsac2()时时间和幅度数据都被返回并储存起来。不像rsac1(),起始时间和时间间隔并不会被返回因为这些信息随着时间数据一起被返回了。
Fortran rsac2f.f:
!

加载中…