PROGRAM conv_obs implicit none integer, parameter :: NST = 488, SYR = 1980, EYR = 2007, NYR = EYR - SYR + 1, NMN = 12, NDY = 31 integer :: ist, iyr, imn, idy, itmp, RNDY character (len = *), dimension (NMN), parameter :: cmn = (/"01","02","03","04","05","06","07","08","09","10","11","12"/) character (len = 100) :: filenm character (len = 4) :: cyr, cdy real, parameter :: flag = -99. real :: rtmp real, dimension (NST,NYR,NMN,NDY) :: datain real, dimension (NST,NYR,NMN) :: monsum real, dimension (NST,NMN) :: yearsum ! ~~~ --------------------------- ~~~ ! ~~~ BEGIN !!! ! ~~~ Read Obs_Daily monsum = 0. datain = flag do iyr = 1, NYR itmp = SYR + iyr - 1 write (cyr,'(i4)') itmp print*, "Reading data in year = ",itmp do imn = 1, NMN RNDY = cnday(itmp,imn) do idy = 1, RNDY if (idy < 10) then write (cdy,'(i1)') idy filenm = "input/OBS_daily/"//trim(cyr)//"/"//trim(cmn(imn))//"/R_day_0"//trim(cdy)//".txt" else write (cdy,'(i2)') idy filenm = "input/OBS_daily/"//trim(cyr)//"/"//trim(cmn(imn))//"/R_day_"//trim(cdy)//".txt" endif open (1,file = filenm,status = "old") do ist = 1, NST read (1,*) rtmp, rtmp, datain(ist,iyr,imn,idy) enddo close (1) enddo enddo enddo print*,"Calculating sum of Month ... " yearsum = 0 do ist = 1, NST do iyr = 1, NYR do imn = 1, NMN do idy = 1, NDY if (datain(ist,iyr,imn,idy) /= flag) then monsum(ist,iyr,imn) = monsum(ist,iyr,imn) + datain(ist,iyr,imn,idy) endif enddo enddo enddo do imn = 1, NMN do iyr = 1, NYR yearsum(ist,imn) = yearsum(ist,imn) + monsum(ist,iyr,imn) enddo yearsum(ist,imn) = yearsum(ist,imn)/NYR enddo enddo Print*,"Writing Output ... " open(2, file = "output/OBS.txt") do iyr = 1, NYR do imn = 1, NMN do ist = 1, NST write (2,'(F8.3)') monsum(ist,iyr,imn) enddo enddo enddo close (2) Print*,"Writing Output ... " open(2, file = "output/OBS.yearmean.txt") do ist = 1, NST write (2,'(12(F8.3,2x))') (yearsum(ist,imn),imn = 1, NMN) enddo close (2) CONTAINS ! To cal ndays of month. integer FUNCTION cnday(year,mon) integer :: year, mon select case (mon) case (1,3,5,7,8,10,12) cnday = 31 case (4,6,9,11) cnday = 30 case (2) if (mod(year,4) == 0) then cnday = 29 if (mod(year,100) == 0) then if (mod(year,400) /= 0) then cnday = 28 endif endif else cnday = 28 endif end select return END FUNCTION END ! ~~~ STOP !!!