! Sample program for gtool_history/gtool5 ! program nc_io use gtool_history ! モジュール指定 implicit none character(128) :: InFileName ! 入力ファイル名 character(128) :: OutFileName ! 出力ファイル名 integer, parameter :: NLon = 144 ! 経度格子点数 integer, parameter :: NLat = 73 ! 緯度格子点数 integer, parameter :: NLevel = 17 ! 高度(圧力)格子点数 integer, parameter :: NTime = 365 ! 時間格子点数 real(4) :: x_Lon (NLon ) ! 経度配列 real(4) :: y_Lat (NLat ) ! 緯度配列 real(4) :: z_Level (NLevel) ! 高度(圧力)配列 real(4) :: t_Time (NTime ) ! 時間配列 real(4) :: xyz_Temp (NLon, NLat, NLevel) ! 温度配列 real(4) :: xyz_PotTemp(NLon, NLat, NLevel) ! 温位配列 real(4) :: Kappa = 0.29 ! R/Cp real(4) :: P0 = 1000.0 ! 基準圧力 integer :: it integer :: i integer :: j integer :: k character(64) :: range InFileName = "air.2019.nc" ! 入力ファイル名の設定 OutFileName = "output.nc" ! 出力ファイル名の設定 call HistoryGet(InFileName, 'lon' , x_Lon ) ! [入力] 経度を読む call HistoryGet(InFileName, 'lat' , y_Lat ) ! [入力] 緯度を読む call HistoryGet(InFileName, 'level', z_Level) ! [入力] 圧力を読む call HistoryGet(InFileName, 'time' , t_Time ) ! [入力] 時間を読む ! [出力] 出力ファイル作成 (開く) call HistoryCreate( & & file=OutFileName, title='atmospheric temperature', & & source='NCEP/NCAR Reanalysis data', & & institution='Department of Planetology, Kobe University', & & dims=(/'lon ','lat ','level','time '/), & & dimsizes=(/NLon,NLat,NLevel,NTime/), & & longnames=(/'longitude','latitude ','level ', 'time '/), & & units=(/'degrees_east ', & & 'degrees_north ', & & 'hPa ', & & 'hours since 1800-01-01 00:00:0.0'/) & & ) call HistoryPut('lon' ,x_Lon ) ! [出力] 次元変数出力, 経度 call HistoryPut('lat' ,y_Lat ) ! [出力] 次元変数出力, 緯度 call HistoryPut('level',z_Level) ! [出力] 次元変数出力, 高度(圧力) call HistoryPut('time' ,t_Time ) ! [出力] 次元変数出力, 時間 ! [出力] 変数定義, 温位 call HistoryAddVariable( & & varname='pottemp', dims=(/'lon ','lat ','level','time '/), & & longname='potential temperature', units='K', xtype='real' & & ) do it = 1, NTime write( 6, * ) it, t_Time(it) write( range, '(a,i5.5)' ) 'time=^', it ! 出力用の時刻情報文字列の作成 write( 6, * ) range ! [入力] it 番目のデータを読む call HistoryGet(InFileName, 'air', xyz_Temp, range = range) ! 温位の計算 do k = 1, NLevel do j = 1, NLat do i = 1, NLon xyz_PotTemp(i,j,k) = xyz_Temp(i,j,k) * ( P0 / z_Level(k) )**Kappa end do end do end do ! [出力] it 番目のデータを出力, 温位 call HistoryPut('pottemp', xyz_PotTemp, range=range) end do call HistoryClose ! [出力] 出力ファイルを閉じる stop end program nc_io