Fortranについての質問です。下のプログラムは、ある地点(今回は1
Fortranについての質問です。下のプログラムは、ある地点(今回は14161~14163)の33年間(1976~2008)の気温の平均を欠損値を考慮してだしているはずです。うるう年の判定はおまけで書いています。
この平均値に標準偏差もつけるプログラムにしたいのですが、どう書いていいのか手詰まり中です。どうかアドバイスください。
---------データの一部(14162_temp1997.csv)-------------------------------------
14162 1997 1 1 141.332 43.0583 -10
14162 1997 1 2 141.332 43.0583 18
14162 1997 1 3 141.332 43.0583 -2
---------プログラム------------------------------------------------------------
program sapporo_kikouchi
INTEGER :: sum, no, point
INTEGER :: year, mon, day, data
INTEGER :: doy
REAL,dimension(365) :: temp, ndata
REAL :: lon, lat
CHARACTER*4 yyyy
CHARACTER*5 sssss
ndata(:)=0.0
temp(:)=0.0
do ispot=14161,14163
write(sssss,"(i5)") ispot
do iwork=1976, 2008
write(yyyy,"(i4.4)") iwork
open(50, file=''//sssss//'_temp'//yyyy//'.csv', status='old',iostat=io)
if (io < 0) cycle
! write(6,*) ispot iwork
do i = 1,366
read(50,*,iostat=io) id,year,mon,day,lon,lat,data
if(io < 0) exit
if(mon==2 .AND. day==29) then
cycle
endif
call date2doy(year,mon,day,doy)
temp(doy) = temp(doy) + data/10.0
ndata(doy) = ndata(doy) + 1
! doyは一年のうち何日目かを表している
enddo
close(50)
enddo !!! end of year loop
enddo
do i=1,365
if( ndata(i) == 0 ) then
temp(i) = -99999.9
else
temp(i)=temp(i)/ndata(i)
endif
write(6,*) i, temp(i), ndata(i)
! write(11,*) i,',',temp(i),',',ndata(i)
end do
stop
end program
subroutine date2doy(iy,im,id,idoy)
INTEGER,dimension(12) :: nday
INTEGER :: uruu !!uruu=1: うるう年、uruu=0: 通常の年
uruu=0
DATA nday /31,28,31,30,31,30,31,31,30,31,30,31/
if(mod(iy,4)==0 .AND. mod(iy,100)/=0) then
uruu=1
endif
if(mod(iy,1000)==0) then
uruu=1
endif
!! うるう年も無視する
itotal = 0
if( im /= 1 )then
do m=1, im-1
itotal = itotal + nday(m)
enddo
endif
idoy = id + itotal
! write(6,*) iy,im,id, idoy
return
end
お礼
他の場所にあったタイプミスが原因でした…。 何度も見直したつもりでしたがこんな初歩的なミスで申し訳ないです。 本当にありがとうございました。