[Fortran] 纯文本查看 复制代码
e = 2421
ALLOCATE( site2(e), lonx(e), laty(e) )
[/quote]
1. 還是有點小錯: "k==day(i)" ---> "k/=day(i)"
2. 改善Loop的效率: "IF(l/=year(i) .OR. j/=month(i))"往前提 (not function of "iday" loop)
3. 重要的subscripts: "l, j, k" ---> "iyear, imonth, iday", 可讀性高
4. 數理/Fortran的文化: "z"不宜為subscript "iz"可也
5. for REAL: "100" ---> "100.0"
[mw_shl_code=fortran,true] INTEGER :: iyear, imonth, iday, nn
!-----------------
nn = 2421
ALLOCATE( site2(nn), lonx(nn), laty(nn) )
OPEN( UNIT=11, FILE='...' )
DO i = 1, nn
READ(11,*) site2(i), lonx(i), laty(i)
END DO
CLOSE( UNIT=11 )
!-----------------
DO iyear = 2010, 2015
DO imonth = 1, 12
WRITE(filename(32:37), '(i6)') iyear*100 + imonth
OPEN( UNIT=11, FILE='...', ACTION='READ' )
m = 0
DO
READ(11,*,IOSTAT=ier) line
IF( ier == -1 ) EXIT ! end-of-file
m = m + 1
END DO
ALLOCATE( site1(m), lat(m), lon(m), h(m), year(m), month(m), day(m), tmax(m), tmin(m) )
REWIND( UNIT=11 )
mm = 0
DO i = 1, m
mm = mm + 1
READ(11,*) site1(mm), lat(mm), lon(mm), h(mm), year(mm), month(mm), day(mm), ave, tmax(mm), tmin(mm)
IF( year(mm)/=iyear .OR. month(mm)/=imonth .OR. &
tmax(mm)==3270.0 .OR. tmax(mm)==3276.6 .OR. tmin(mm)==3270.0 .OR. tmin(mm)==3276.6 ) THEN
mm = mm - 1
CYCLE
END IF
IF( h(mm) >= 100000.0 ) h(mm) = h(mm) - 100000.0
h (mm) = h (mm)*0.1
tmax(mm) = tmax(mm)*0.1
tmin(mm) = tmin(mm)*0.1
lon (mm) = lon (mm)/100.0
lat (mm) = lat (mm)/100.0
END DO
CLOSE( UNIT=11 )
!-----
IF( mm == 0 ) CYCLE
!-----
DO iday = 1, daysinyear(iyear,imonth)
WRITE(outfile(1:8),'(i8)') iyear*10000 + imonth*100 + iday
OPEN( UNIT=15, FILE='...' )
OPEN( UNIT=16, FILE='...' )
100 FORMAT(i5,2x,f6.2,2x,f5.2,2x,f12.4,2x,f12.4,2x,f6.2)
DO i = 1, mm
IF( iday /= day(i) ) CYCLE
DO j = 1, nn
IF( site1(i) /= site2(j) ) CYCLE
WRITE(15,100) site1(i), lon(i), lat(i), lonx(j), laty(j), tmax(i)+(h(i)/100.0)*0.6
WRITE(16,100) site1(i), lon(i), lat(i), lonx(j), laty(j), tmin(i)+(h(i)/100.0)*0.6
WRITE(*,*) site1(i), year(i), month(i), day(i)
END DO
END DO
CLOSE( UNIT=15 )
CLOSE( UNIT=16 )
END DO
DEALLOCATE( site1, lat, lon, h, year, month, day, tmax, tmin )
END DO
END DO
DEALLOCATE( site2, lonx, laty )
END PROGRAM weather