Takuya Miyashita
This site
Web
Start:
* NetCDF ファイルを Fortran で読む [#i6b5c4de]
他の言語では NetCDF 用のパッケージを使えば簡単に変数を読...
例として,[[生存圏研究所のデータベース>http://database.ri...
netcdf-c と netcdf-fortran がインストールされている前提....
ここで扱うのは NetCDF4 の話で, 旧バージョンの NetCDF3 に...
~
** コンパイル [#y4e3ac03]
まずは nf-config や nc-config が実行できるように,環境変...
コンパイルはコマンドをうつのが面倒くさいので Makefile に...
#codeprettify{{
FC = $(shell nf-config --fc)
FFLAGS = $(shell nf-config --fflags)
FLIBS = $(shell nf-config --flibs)
EXE = xread_msmnc
FILE = test_read.f90
.PHONY: exe clean
exe:
$(FC) $(FILE) $(FFLAGS) $(FLIBS) -o $(EXE)
clean:
-rm -f $(EXE)
}}
これを test_read.f90 と同じディレクトリに入れておけば mak...
**Fortran ソース [#icd32bae]
MSM の .nc ファイルから lon, lat や 海面更正気圧 psea な...
引数で .nc ファイルのファイル名を指定する設定にしている (...
ほとんど下記参考欄にあるリンク先のコードを参考にして書い...
#codeprettify(lang-fortran){{
program read_msmnc
use netcdf
implicit none
! dimension
integer :: nx, ny, nt
character(len=1024) :: f_in
real(kind=4), allocatable :: lon(:), lat(:), timelap(:)
real(kind=4), allocatable :: psea(:,:,:)
real(kind=4), allocatable :: u10(:,:,:), v10(:,:,:)
! parameters
integer :: ncid, varid, dimid
integer :: start_nc(3), count_nc(3)
real(kind=4) :: scale_factor, add_offset
! loop counter
integer :: k
! netcdf filename
if(iargc()>0)then
call getarg(1,f_in)
else
stop 'No ncfile specified'
end if
! open
call check_ncstatus( nf90_open( trim( f_in ), nf90_nowr...
! number of array
! -- lon
call check_ncstatus( nf90_inq_dimid(ncid, 'lon', dimid) )
call check_ncstatus( nf90_inquire_dimension(ncid, dimid...
allocate(lon(nx))
call check_ncstatus( nf90_get_var(ncid, dimid, lon) )
! -- lat
call check_ncstatus( nf90_inq_dimid(ncid, 'lat', dimid) )
call check_ncstatus( nf90_inquire_dimension(ncid, dimid...
allocate(lat(ny))
call check_ncstatus( nf90_get_var(ncid, dimid, lat) )
! -- timelap
call check_ncstatus( nf90_inq_dimid(ncid, 'time', dimid...
call check_ncstatus( nf90_inquire_dimension(ncid, dimid...
allocate(timelap(nt))
call check_ncstatus( nf90_get_var(ncid, dimid, timelap) )
! allocate
allocate(psea(nx,ny,nt))
allocate(u10(nx,ny,nt), v10(nx,ny,nt))
! indices
start_nc = [1,1,1]
count_nc = [nx,ny,nt]
! read variables
! -- psea
call check_ncstatus( nf90_inq_varid(ncid, "psea", varid...
call check_ncstatus( nf90_get_var(ncid, varid, psea, st...
call check_ncstatus( nf90_get_att(ncid, varid, "scale_f...
call check_ncstatus( nf90_get_att(ncid, varid, "add_off...
psea(:,:,:) = psea(:,:,:)*scale_factor + add_offset
! -- u10
call check_ncstatus( nf90_inq_varid(ncid, "u", varid) )
call check_ncstatus( nf90_get_var(ncid, varid, u10, sta...
call check_ncstatus( nf90_get_att(ncid, varid, "scale_f...
call check_ncstatus( nf90_get_att(ncid, varid, "add_off...
u10(:,:,:) = u10(:,:,:)*scale_factor + add_offset
! -- v10
call check_ncstatus( nf90_inq_varid(ncid, "v", varid) )
call check_ncstatus( nf90_get_var(ncid, varid, v10, sta...
call check_ncstatus( nf90_get_att(ncid, varid, "scale_f...
call check_ncstatus( nf90_get_att(ncid, varid, "add_off...
v10(:,:,:) = v10(:,:,:)*scale_factor + add_offset
! close nc file
call check_ncstatus( nf90_close(ncid) )
! --- print and check
write(*,*) nx, ny, nt
write(*,*) timelap(lbound(timelap)), timelap(ubound(tim...
write(*,*) minval(lon), maxval(lon), minval(lat), maxva...
do k = 1, nt
write(*,*) k, maxval(psea(:,:,k)), minval(psea(:,:,k)...
& maxval(u10(:,:,k)), minval(u10(:,:,k)),...
end do
contains
! -------------------------------------------------------...
subroutine check_ncstatus( status )
integer, intent (in) :: status
if(status /= nf90_noerr) then
print *, trim(nf90_strerror(status))
stop "Something went wrong while reading ncfile."
end if
end subroutine check_ncstatus
! -------------------------------------------------------...
end program read_msmnc
}}
基本的には nf90_inq_varid で変数名に対応する id を取得し...
nf90_* 系の関数は全て実行ステータスを返してくれるので,失...
~
Python や Julia のパーサでは勝手に scale_factor や offset...
また,Fortran ソース内で宣言した変数の方が real(kind=4) ...
**実行と確認 [#b129e789]
Makefile に書いた通り xread_msmnc という実行ファイルがで...
#codeprettify{{
$ ./xread_msmnc MSM2021111100S.nc
481 505 34
0.00000000 33.0000000
120.000000 150.000000 22.3999996 47....
1 102380.734 98720.1797 18.30581...
2 102347.703 98708.7188 18.31192...
3 102314.219 98696.7891 18.59327...
4 102247.703 98677.5234 19.13149...
5 102155.047 98647.2500 19.03363...
6 102072.016 98661.0078 18.72171...
7 102021.562 98694.9531 18.53822...
8 102016.516 98707.3359 18.27523...
9 102048.164 98722.9375 18.53822...
10 102117.891 98858.7188 17.49847...
11 102174.773 98965.1406 17.35779...
12 102246.789 99013.7578 17.08256...
13 102270.188 99098.1641 16.76452...
14 102309.633 99187.6172 16.81957...
15 102355.508 99236.6953 19.74312...
16 102393.117 99319.2656 20.07951...
17 102394.953 99373.8516 16.11620...
18 102404.586 99407.7969 16.33027...
19 102414.219 99425.6875 17.43119...
20 102423.391 99457.7969 17.52293...
21 102444.039 99516.0547 17.88990...
22 102467.891 99557.7969 18.58715...
23 102502.750 99610.5469 18.96636...
24 102567.891 99638.0703 18.88073...
25 102638.070 99628.8984 17.35168...
26 102672.477 99633.0312 16.69724...
27 102647.703 99627.5234 17.00305...
28 102578.898 99597.2500 17.45565...
29 102489.453 99599.0859 16.88685...
30 102404.125 99616.0547 17.19877...
31 102348.164 99651.8359 17.10703...
32 102325.688 99692.6641 17.29663...
33 102337.156 99728.4375 18.28134...
34 102387.156 99764.6797 17.77981...
}}
できた.気圧や風速の値も妥当な範囲内に収まっている.
** 参考 [#z37ffca4]
-[[FortranでNetCDFを読み書きする - Qiita>https://qiita.co...
End:
* NetCDF ファイルを Fortran で読む [#i6b5c4de]
他の言語では NetCDF 用のパッケージを使えば簡単に変数を読...
例として,[[生存圏研究所のデータベース>http://database.ri...
netcdf-c と netcdf-fortran がインストールされている前提....
ここで扱うのは NetCDF4 の話で, 旧バージョンの NetCDF3 に...
~
** コンパイル [#y4e3ac03]
まずは nf-config や nc-config が実行できるように,環境変...
コンパイルはコマンドをうつのが面倒くさいので Makefile に...
#codeprettify{{
FC = $(shell nf-config --fc)
FFLAGS = $(shell nf-config --fflags)
FLIBS = $(shell nf-config --flibs)
EXE = xread_msmnc
FILE = test_read.f90
.PHONY: exe clean
exe:
$(FC) $(FILE) $(FFLAGS) $(FLIBS) -o $(EXE)
clean:
-rm -f $(EXE)
}}
これを test_read.f90 と同じディレクトリに入れておけば mak...
**Fortran ソース [#icd32bae]
MSM の .nc ファイルから lon, lat や 海面更正気圧 psea な...
引数で .nc ファイルのファイル名を指定する設定にしている (...
ほとんど下記参考欄にあるリンク先のコードを参考にして書い...
#codeprettify(lang-fortran){{
program read_msmnc
use netcdf
implicit none
! dimension
integer :: nx, ny, nt
character(len=1024) :: f_in
real(kind=4), allocatable :: lon(:), lat(:), timelap(:)
real(kind=4), allocatable :: psea(:,:,:)
real(kind=4), allocatable :: u10(:,:,:), v10(:,:,:)
! parameters
integer :: ncid, varid, dimid
integer :: start_nc(3), count_nc(3)
real(kind=4) :: scale_factor, add_offset
! loop counter
integer :: k
! netcdf filename
if(iargc()>0)then
call getarg(1,f_in)
else
stop 'No ncfile specified'
end if
! open
call check_ncstatus( nf90_open( trim( f_in ), nf90_nowr...
! number of array
! -- lon
call check_ncstatus( nf90_inq_dimid(ncid, 'lon', dimid) )
call check_ncstatus( nf90_inquire_dimension(ncid, dimid...
allocate(lon(nx))
call check_ncstatus( nf90_get_var(ncid, dimid, lon) )
! -- lat
call check_ncstatus( nf90_inq_dimid(ncid, 'lat', dimid) )
call check_ncstatus( nf90_inquire_dimension(ncid, dimid...
allocate(lat(ny))
call check_ncstatus( nf90_get_var(ncid, dimid, lat) )
! -- timelap
call check_ncstatus( nf90_inq_dimid(ncid, 'time', dimid...
call check_ncstatus( nf90_inquire_dimension(ncid, dimid...
allocate(timelap(nt))
call check_ncstatus( nf90_get_var(ncid, dimid, timelap) )
! allocate
allocate(psea(nx,ny,nt))
allocate(u10(nx,ny,nt), v10(nx,ny,nt))
! indices
start_nc = [1,1,1]
count_nc = [nx,ny,nt]
! read variables
! -- psea
call check_ncstatus( nf90_inq_varid(ncid, "psea", varid...
call check_ncstatus( nf90_get_var(ncid, varid, psea, st...
call check_ncstatus( nf90_get_att(ncid, varid, "scale_f...
call check_ncstatus( nf90_get_att(ncid, varid, "add_off...
psea(:,:,:) = psea(:,:,:)*scale_factor + add_offset
! -- u10
call check_ncstatus( nf90_inq_varid(ncid, "u", varid) )
call check_ncstatus( nf90_get_var(ncid, varid, u10, sta...
call check_ncstatus( nf90_get_att(ncid, varid, "scale_f...
call check_ncstatus( nf90_get_att(ncid, varid, "add_off...
u10(:,:,:) = u10(:,:,:)*scale_factor + add_offset
! -- v10
call check_ncstatus( nf90_inq_varid(ncid, "v", varid) )
call check_ncstatus( nf90_get_var(ncid, varid, v10, sta...
call check_ncstatus( nf90_get_att(ncid, varid, "scale_f...
call check_ncstatus( nf90_get_att(ncid, varid, "add_off...
v10(:,:,:) = v10(:,:,:)*scale_factor + add_offset
! close nc file
call check_ncstatus( nf90_close(ncid) )
! --- print and check
write(*,*) nx, ny, nt
write(*,*) timelap(lbound(timelap)), timelap(ubound(tim...
write(*,*) minval(lon), maxval(lon), minval(lat), maxva...
do k = 1, nt
write(*,*) k, maxval(psea(:,:,k)), minval(psea(:,:,k)...
& maxval(u10(:,:,k)), minval(u10(:,:,k)),...
end do
contains
! -------------------------------------------------------...
subroutine check_ncstatus( status )
integer, intent (in) :: status
if(status /= nf90_noerr) then
print *, trim(nf90_strerror(status))
stop "Something went wrong while reading ncfile."
end if
end subroutine check_ncstatus
! -------------------------------------------------------...
end program read_msmnc
}}
基本的には nf90_inq_varid で変数名に対応する id を取得し...
nf90_* 系の関数は全て実行ステータスを返してくれるので,失...
~
Python や Julia のパーサでは勝手に scale_factor や offset...
また,Fortran ソース内で宣言した変数の方が real(kind=4) ...
**実行と確認 [#b129e789]
Makefile に書いた通り xread_msmnc という実行ファイルがで...
#codeprettify{{
$ ./xread_msmnc MSM2021111100S.nc
481 505 34
0.00000000 33.0000000
120.000000 150.000000 22.3999996 47....
1 102380.734 98720.1797 18.30581...
2 102347.703 98708.7188 18.31192...
3 102314.219 98696.7891 18.59327...
4 102247.703 98677.5234 19.13149...
5 102155.047 98647.2500 19.03363...
6 102072.016 98661.0078 18.72171...
7 102021.562 98694.9531 18.53822...
8 102016.516 98707.3359 18.27523...
9 102048.164 98722.9375 18.53822...
10 102117.891 98858.7188 17.49847...
11 102174.773 98965.1406 17.35779...
12 102246.789 99013.7578 17.08256...
13 102270.188 99098.1641 16.76452...
14 102309.633 99187.6172 16.81957...
15 102355.508 99236.6953 19.74312...
16 102393.117 99319.2656 20.07951...
17 102394.953 99373.8516 16.11620...
18 102404.586 99407.7969 16.33027...
19 102414.219 99425.6875 17.43119...
20 102423.391 99457.7969 17.52293...
21 102444.039 99516.0547 17.88990...
22 102467.891 99557.7969 18.58715...
23 102502.750 99610.5469 18.96636...
24 102567.891 99638.0703 18.88073...
25 102638.070 99628.8984 17.35168...
26 102672.477 99633.0312 16.69724...
27 102647.703 99627.5234 17.00305...
28 102578.898 99597.2500 17.45565...
29 102489.453 99599.0859 16.88685...
30 102404.125 99616.0547 17.19877...
31 102348.164 99651.8359 17.10703...
32 102325.688 99692.6641 17.29663...
33 102337.156 99728.4375 18.28134...
34 102387.156 99764.6797 17.77981...
}}
できた.気圧や風速の値も妥当な範囲内に収まっている.
** 参考 [#z37ffca4]
-[[FortranでNetCDFを読み書きする - Qiita>https://qiita.co...
Page:
Edit with a page name which already exists