fortran90でのGMTのgrdファイルを作るサブルーチン.
fortran用のnetcdfライブラリをインストールしてください.
ただし,GMTver4.0以下対応,GMT4.1.3は未対応
これまでのものよりサブルーチンの引数を減らしました.
----------------------------------
zz:配列「!#############################」の部分の2箇所を編集してください.
nx,ny:配列の大きさ,整数
xyrange(4):xmin,xmax,ymin,ymax,実数配列,配列の大きさは4
dx:格子幅,実数,ここではdx=dy
filegrd:作成する配列名:文字列
c=====================================================
subroutine mk_grd_z(nx,ny,xyrange,dx,zz,filgrd)
IMPLICIT REAL*8 (A-H,O-Z)
c dimension xrange(*),yrange(*),zrange(*),space(*)
dimension xyrange(*)
dimension xrange(2),yrange(2),zrange(2),space(2)
real*8 zz(nx,ny,2) !###################################
integer ncid,icon,idside,idxr,ixy
integer ixrng(1),ixsize(1),node(1),istart(1),icount(1),idim(2)
character filgrd*18
real*8 scale(1)
real*8, allocatable:: z(:,:)
include 'netcdf.inc'
allocate(z(nx,ny),stat=ier)
xrange(1)=xyrange(1);xrange(2)=xyrange(2);
yrange(1)=xyrange(3);yrange(2)=xyrange(4);
space(1)=dx;space(2)=dx;
idim(1)=nx
idim(2)=ny
ixy=idim(1)*idim(2)
do i=1,nx
do j=1,ny
z(i,j)=zz(i,j,2) !###################################
enddo
enddo
zrange(1)=minval(z);zrange(2)=maxval(z);
icon=nf_create(filgrd,NF_CLOBBER,ncid)
if(icon.ne.0) write(6,*) "creat",icon
icon=nf_def_dim(ncid,"side",2,idside)
icon=nf_def_dim(ncid,"xysize",ixy,ixys)
ixrng(1)=idside
icon=nf_def_var(ncid,'x_range',NF_DOUBLE,1,ixrng,idxr)
if(icon.ne.0) write(6,*) "def_var",icon
icon=nf_put_att_text(ncid,idxr,'units',11,'user_x_unit')
if(icon.ne.0) write(6,*) "put_att",icon
icon=nf_def_var(ncid,'y_range',NF_DOUBLE,1,ixrng,idyr)
if(icon.ne.0) write(6,*) "def_var",icon
icon=nf_put_att_text(ncid,idyr,'units',11,'user_y_unit')
if(icon.ne.0) write(6,*) "put_att",icon
icon=nf_def_var(ncid,'z_range',NF_DOUBLE,1,ixrng,idzr)
if(icon.ne.0) write(6,*) "def_var",icon
icon=nf_put_att_text(ncid,idzr,'units',11,'user_z_unit')
if(icon.ne.0) write(6,*) "put_att",icon
icon=nf_def_var(ncid,'spacing',NF_DOUBLE,1,ixrng,idsp)
if(icon.ne.0) write(6,*) "def_var",icon
icon=nf_def_var(ncid,'dimension',NF_INT,1,ixrng,iddm)
if(icon.ne.0) write(6,*) "def_var",icon
ixsize(1)=ixys
scale(1)=1.
icon=nf_def_var(ncid,'z',NF_FLOAT,1,ixsize,idz)
if(icon.ne.0) write(6,*) "def_var",icon
icon=nf_put_att_double(ncid,idz,'scale_factor',NF_DOUBLE
& ,1,scale)
scale(1)=0.
icon=nf_put_att_double(ncid,idz,'add_offset',NF_DOUBLE
& ,1,scale)
node(1)=1
icon=nf_put_att_INT1(ncid,idz,'node_offset',NF_INT
& ,1,node)
if(icon.ne.0) write(6,*) "put_att",icon
icon=nf_put_att_text(ncid,0,'title',27,
& 'Masafumi Matsuyama : CRIEPI')
icon=nf_put_att_text(ncid,0,'source',25,
& 'make grid file by fortran')
if(icon.ne.0) write(6,*) "put_att",icon
icon=nf_enddef(ncid)
istart(1)=1
icount(1)=2
icon=nf_put_vara_double(ncid,idxr,istart,icount,xrange)
icon=nf_put_vara_double(ncid,idyr,istart,icount,yrange)
icon=nf_put_vara_double(ncid,idzr,istart,icount,zrange)
icon=nf_put_vara_double(ncid,idsp,istart,icount,space)
icon=nf_put_vara_int(ncid,iddm,istart,icount,idim)
icount(1)=ixy
icon=nf_put_vara_double(ncid,idz,istart,icount,z)
icon=nf_close(ncid)
return
end