program CRUts2 c c reads the new CRU global gridded dataset 1901-2000 0.5x0.5 degree c cells prepared by Tim Mitchell. c written by pjk-trl 4/2003 c integer month,maxlon,maxlat,iu,ou1,mxyr,mnyr parameter (mxyr=2000,mnyr=1901,month=12,iu=13,ou1=14) parameter (maxlon=720,maxlat=360,gridskip=100) integer yskip1,yskip2,yskip3 integer yrmin,yrmax,vartype,gridx,gridy,numgrid integer ydata(month) integer p,j,k real indxlon(720),indxlat(360),lat,lon real mxlon,mnlon,mxlat,mnlat character*27 infl,outfl,title character*11 dattype,fmt character*17 rfmt character*80 titles(5) c logical ok1 c data fmt /'(12i5)'/ c write(*,'(1x,''Program CRUts2b PJK-TRL-LDEO 5/2003'',/)') write(*,'(/1x,'' This program serves gridded 0.5x0.5 degree LAND AREA ONLY'')') write(*,'(1x,''gridded data from the most recent CRU TS 2.0 data set'')') write(*,'(1x,''This dataset is an update of the previous CRU TS 1.0 data'')') write(*,'(1x,''set which ends in 1995-96 and includes WET-DAY information.'')') write(*,'(1x,'' This data set was put together by Dr. Tim Mitchel CRU-UEA'')') write(*,'(1x,''The proper citation, at this time, for this data set is:'')') write(*,'(/1x,'' Mitchell, T.D., et al., 2003: A comprehensive set of climate'')') write(*,'(1x,''senarios for Europe and the globe. (in preparation)'')') write(*,'(/,4x,''Select the Variable you want to extract:'',/)') write(*,'(/,1x,'' Variable Type Name Units Length'')') write(*,'(1x,''[1] Precipitation pre mm 1901-2000'')') write(*,'(1x,''[2] Mean temperature tmp degC*10 1901-2000'')') write(*,'(1x,''[3] Diurnal temperature range dtr degC*10 1901-2000'')') write(*,'(1x,''[4] Vapour pressure vap hPa*10 1901-2000'')') write(*,'(1x,''[5] Cloud cover cld oktas*10 1901-2000'')') write(*,'(1x,''[0] Exit Program'')') write(*,'(/,1x,''Enter a value from 0 to 5 ==> '',$)') read(*,'(i1)')vartype select case (vartype) case(1) dattype='CRUts2.pre.' title='glo.pre. mm' rfmt='RFMT=(1x,i4,12i5)' infl='obs.globe.lan.1901-2000.pre' case(2) dattype='CRUts2.tmp.' title='glo.tmp. degC*10' rfmt='RFMT=(1x,i4,12i5)' infl='obs.globe.lan.1901-2000.tmp' case(3) dattype='CRUts2.dtr.' title='glo.dtr. degC*10' rfmt='RFMT=(1x,i4,12i5)' infl='obs.globe.lan.1901-2000.dtr' case(4) dattype='CRUts2.vap.' title='glo.vap. hPa*10' rfmt='RFMT=(1x,i4,12i5)' infl='obs.globe.lan.1901-2000.vap' case(5) dattype='CRUts2.cld.' title='glo.cld. oktas*10' rfmt='RFMT=(1x,i4,12i5)' infl='obs.globe.lan.1901-2000.cld' case(0) write(*,'(1x,/''Program Terminating'')') stop end select outfl=dattype//'TSF' open(unit=iu,file=infl,status='old',readonly) open(unit=ou,file=outfl,status='unknown') ok1=.true. c 5 write(*,'(/,4x,''Select the Geographical Range of data to extract'')') write(*,'(/,2x,'' Enter the range of Latitude and Longitude'')') write(*,'(2x,''from which you would like to extract your data.'')') write(*,'(2x,''Enter values as REAL numbers to the nearest 0.5'')') write(*,'(2x,''degree. EXAMPLE a Latitude entered as -89.5 defines '')') write(*,'(2x,''cells bounded on the bottom by 90.0 degrees SOUTH.'')') write(*,'(2x,''Similarly a longitude entered as 180.0 are the cells '')') write(*,'(2x,''bounded to the right by -179.5 degrees WEST).'')') write(*,'(/,3x,'' All LONGITUDES WEST or [LEFT] of Greenwich '')') write(*,'(2x,'' are NEGATIVE and EAST or [RIGHT] of Greenwich '')') write(*,'(2x,'' are POSITIVE'')') write(*,'(2x,'' All LATITUDES SOUTH or [BELOW] the equator are'')') write(*,'(2x,'' NEGATIVE and NORTH latitudes [ABOVE] the equator are'')') write(*,'(2x,'' POSITIVE.'')') write(*,'(15x,'' THIS IS VERY IMPORTANT!'')') write(*,'(/,2x,'' Each grid cell value is the observation for that '')') write(*,'(2x,''cells mid-point. Example: for the cell 90.0 Lat. -179.5'')') write(*,'(2x,''Lon. The actual grid point value given is centered '')') write(*,'(2x,''over (89.75,-179.75).''/)') Pause' HIT RETURN to continue' c 10 write(*,'(8x,''Enter Max Latitude [TOP] ==> '',$)') read(*,'(f6.1)')mxlat if((mxlat.gt.90.0).or.(mxlat.lt.-90.0))then write(*,'(1x,''Invalid latitude: '',f6.1)')mxlat write(*,'(/,8x,''Valid range is 90.0 <-> -90.0'')') go to 10 endif 20 write(*,'(8x,''Enter Min Latitude [BOTTOM]==> '',$)') read(*,'(f6.1)')mnlat if(mnlat.gt.mxlat)then write(*,'(/,8x,''Your Min. Lat is greater than your Max.Lat'')') write(*,'(8x,'' MAX. LAT => '',f6.1)')mxlat write(*,'(8x,''Valid range is'',f6.1,'' -> -90.0'')')mxlat go to 20 elseif(mnlat.lt.-90.0)then write(*,'(1x,''Invalid latitude: '',f6.1)')mnlat write(*,'(/,8x,''Valid range is'',f6.1,'' -> -90.0'')')mxlat go to 20 endif 30 write(*,'(8x,''Enter Max Longitude [RIGHT] ==> '',$)') read(*,'(f6.1)')mxlon if((mxlon.gt.180.0).or.(mxlon.lt.-180.0))then write(*,'(1x,''Invalid longitude: '',f6.1)')mxlon write(*,'(/,8x,''Valid range is 180.0 <-> -180.0'')') go to 30 endif 40 write(*,'(8x,''Enter Min Longitude [LEFT] ==> '',$)') read(*,'(f6.1)')mnlon if((mnlon.gt.180.0).or.(mnlon.lt.-180.0))then write(*,'(1x,''Invalid longitude: '',f6.1)')mnlon write(*,'(/,8x,''Valid range is 180.0 <-> -180.0'')') go to 40 endif write(*,'(1x,''Values Entered are:'')') write(*,'(1x,''mxlon= '',f6.1,'' mnlon= '',f6.1,'' mxlat= '',f6.1, * '' mnlat= '',f6.1)')mxlon,mnlon,mxlat,mnlat write(*,'(1x,''Is this ok? [T]rue or [F]alse ==> '',$)') read(*,*)ok1 if(.not.ok1)goto 5 c write(*,'(/1x,''Enter the temporal range to select data from'')') write(*,'(2x,''Valid years are '',i4, ''-'',i4)')mnyr,mxyr 50 write(*,'(/,2x,''Enter the First Year Of Data you want to extract.'')') write(*,'(2x,'' FYOD ==> '',$)') read(*,'(i4)')yrmin if((yrmin.lt.mnyr).or.(yrmin.gt.mxyr))then write(*,'(/1x,''*WARNING* FYOD must be > '',i4,'' and < '',i4)')mnyr,mxyr goto 50 endif 60 write(*,'(/2x,''Enter the Last Year Of Data you want to extract.'')') write(*,'(2x,'' LYOD ==> '',$)') read(*,'(i4)')yrmax if(yrmax.lt.yrmin)then write(string,'(1x,''*WARNING* LYOD must be greater than'',i4)')yrmin write(*,'(2x,''Valid range = '',i4,''-'',i4 )')yrmin,mxyr goto 60 elseif(yrmax.gt.mxyr)then write(string,'(1x,''FYOD cannot exceed '',i4)')mxyr write(*,'(/2x,''Valid range = '',i4,'' to '',i4)')yrmin,mxyr goto 60 endif write(*,'(1x,''Values Entered are:'')') write(*,'(1x,''yrmin= '',i5,'' yrmax= '',i5)')yrmin,yrmax write(*,'(1x,''Is this ok? [T]rue or [F]alse ==> '',$)') read(*,*)ok1 if(.not.ok1)goto 60 c yskip1=yrmin-mnyr !number line to skip to first year of data yskip2=yrmax-yrmin+1 !number of lines to read data from yskip3=mxyr-yrmax !number of lines to skip to end of cell c indxlon(1)=-179.5 !180.0 indxlat(1)=-90.0 do j=2,maxlon indxlon(j)=indxlon(j-1)+0.5 end do do j=2,maxlat indxlat(j)=indxlat(j-1)+0.5 end do numgrid=0 c do j=1,5 read(iu,'(a)')titles(j) write(ou,'(1x,a)')titles(j) end do 70 read(iu,'(9x,i4,1x,i4)',err=999,end=100)gridx,gridy if((indxlon(gridx).ge.mnlon).and.(indxlon(gridx).le.mxlon))then if((indxlat(gridy).ge.mnlat).and.(indxlat(gridy).le.mxlat))then numgrid=numgrid+1 c write(*,'(1x,''cell found'')') c write(*,'(1x,''gridx= '',i5,''gridy= '',i4)')gridx,gridy c write(*,'(1x,''indxlon(gridx)= '',f8.3,'' indxlat(gridy) = '',f8.3)') c * indxlon(gridx),indxlat(gridy) c write(*,'(1x,''yskip1 = '',i4)')yskip1 c write(*,'(1x,''yskip2 = '',i4)')yskip2 c write(*,'(1x,''yskip3 = '',i4)')yskip3 if(indxlon(gridx).lt.0.0)then lon=indxlon(gridx)+0.25 else lon=indxlon(gridx)-0.25 end if if(indxlat(gridy).lt.0.0)then lat=indxlat(gridy)+0.25 else lat=indxlat(gridy)-0.25 end if write(ou,'(1x,2i4,2f8.1,2x,a,1x,a)')gridx,gridy,lon,lat,rfmt,title do p=1,yskip1 read(iu,*,end=110) end do k=0 do p=1,yskip2 read(iu,fmt,err=998,end=120)(ydata(j),j=1,month) write(ou,'(1x,i4,1x,12i5)')yrmin+k,(ydata(j),j=1,month) k=k+1 end do do p=1,yskip3 read(iu,*,end=130) end do else do p=1,gridskip read(iu,*,end=140) end do goto 70 endif else do p=1,gridskip read(iu,*,end=140) end do goto 70 endif goto 70 c 100 write(*,'(/1x,''PROGRAM TERMINATING NORMALLY'')') write(*,'(1x,''End Of File '',a,'' Reached'')')infl write(*,'(1x,i10,'' Grids Found'')')numgrid write(*,'(1x,''Output is in file '',a)')outfl close(iu) close(ou) stop 110 write(*,'(/1x,''End Of File '',a,'' Reached'')')infl write(*,'(1x,''Program Terminating '')') write(*,'(1x,''yskip1= '',i4)')yskip1 close(iu) close(ou) stop 120 write(*,'(/1x,''End Of File '',a,'' Reached'')')infl write(*,'(1x,''Program Terminating '')') write(*,'(1x,''yskip2= '',i4)')yskip2 close(iu) close(ou) stop 130 write(*,'(/1x,''End Of File '',a,'' Reached'')')infl write(*,'(1x,''Program Terminating '')') write(*,'(1x,''yskip3= '',i4)')yskip3 close(iu) close(ou) stop 140 write(*,'(/1x,''End Of File '',a,'' Reached'')')infl write(*,'(1x,''Program Terminating '')') write(*,'(1x,''gridskip= '',i4)')gridskip close(iu) close(ou) stop 998 write(*,'(/1x,''Error Reading Grid Values'')') write(*,'(1x,''Program Terminating Without Completions'')') close(iu) close(ou) stop 999 write(*,'(/1x,''Error Reading Grid reference numbers'')') write(*,'(1x,''Program Terminating Without Completions'')') close(iu) close(ou) stop end