사용 예제
먼저, 연습 삼아 Seismic Un*x에 있는 프로그램들과 동일한 기능(suwind
, supaste
)을 구현해본 후에 Seismic Un*x에서 지원하지 않는 기능을 구현해보겠습니다.
suwind
Seismic Un*x의 suwind
명령어와 같은 기능을 하는 프로그램입니다. 표준 입력 SU 파일에서 fldr
키 값이 10 이상 20 이하인 트레이스만 추출하여 표준 출력으로 내보냅니다.
1 program suwind
2 use suio
3 type(SuFile):: sf, so
4 type(SuTrace):: trc
5 character(len=4):: keyword=“fldr”
6 integer:: keymin=10, keymax=20, keyval
7
8 sf = su_input()
9 so = su_output()
10 do while( sf%fread(trc) )
keyval = trc%key(keyword)
if(keymin <= keyval .and. keyval <= keymax) call so%write(trc)
11 enddo
12 call su_close(sf, so)
13 end program
선언 부분
1행: 프로그램을 시작합니다.
2행: SU 파일 입출력 모듈을 불러옵니다.
3행: 입력 및 출력 SU 파일에 접근하기 위한 SuFile 객체들을 선언합니다.
4행: SU 트레이스를 저장하기 위한 SuTrace 객체를 선언합니다.
5-6행: window 적용에 사용할 키와 키의 최소 및 최대값을 선언합니다.
파일 열기
8-9행: 표준 입력과 표준 출력을 통해 SU 파일을 참조하는 SuFile 객체들을 생성합니다.
트레이스 읽고 쓰기
10-13행의 루프에서는 입력 파일(sf)의 끝에 도달할 때까지 반복적으로 SU 트레이스를 하나씩 읽어 들여 SuTrace 객체(trc)에 저장합니다.
11행: SuTrace 객체에서 원하는 키 값을 keyval에 저장합니다.
12행: 읽어들인 키 값이 원하는 범위에 속할 경우 출력 파일(so)에 SU 트레이스를 씁니다.
파일 닫고 끝내기
14행: 입출력 SuFile 객체 들을 제거하여 SU 파일에 대한 참조를 마칩니다.
15행: 프로그램을 끝냅니다.
위의 프로그램은 다음 명령과 동일한 기능을 수행합니다.
suwind key=fldr min=10 max=20 < input.su > output.su
supaste
input_header.su
파일에서 트레이스 헤더를 읽고, input_data.su
파일에서 트레이스 자료를 읽어 output.su
파일에 적습니다.
program supaste
use suio
type(SuFile):: sh, sd, so
type(SuTrace):: trc
integer:: itr, ntr, ns
sh = su_input(“input_header.su”, ntr=ntr)
sd = su_input(“input_data.su”, ns=ns)
so = su_output(“output.su”)
do itr = 1,ntr
trc = sd%trace(itr)
call trc%set(header=sh%header(itr), ns=ns)
call so%write(trc)
enddo
call su_close(sh, sd, so)
end program
샘플 개수가 1000개일 때, 위의 프로그램은 다음 명령과 동일한 기능을 수행합니다.
sustrip head=header < input_header.su > /dev/null
sustrip < input_data.su > data.bin
supaste ns=1000 head=header < data.bin > output.su
sunewtoold
XDR 형식의 SU 파일을 표준 입력으로부터 읽어 native binary 형식으로 출력하는 프로그램으로, suoldtonew의 역변환 프로그램입니다.
program suNewToOld
use suio
type(SuFile):: sf, so
type(SuTrace):: trc
sf = su_input(xdr=.true.)
so = su_output(xdr=.false.)
do while( sf%fread(trc) )
call so%write(trc)
enddo
call su_close(sf,so)
end program
Write a velocity file
메모리에 존재하는 속도모델을 SU 파일로 출력하는 프로그램입니다.
subroutine vel_to_su(fout, vel, n1, n2, d1, d2)
use suio
character(len=*), intent(in):: fout
integer, intent(in):: n1, n2
real, intent(in):: d1, d2, vel(n1,n2)
integer:: itr, scalco=100
type(SuFile):: sf
type(SuTrace):: trc
trc = SuTrace(ns=n1, dt=nint(d1), scalco=-scalco, ntr=n2, d1=d1, d2=d2) ! same for all traces
sf = su_output(trim(fout))
do itr = 1,n2
call trc%set(tracl=itr, gx=nint((itr-1)*d2*scalco), data=vel(:,itr))
call sf%write(trc)
enddo
call sf%close()
end subroutine