New changes from l2g
w
This commit is contained in:
@@ -0,0 +1,147 @@
|
||||
subroutine doytotime(dayfract,fday,fhour,fmin,fsecond)
|
||||
implicit none
|
||||
double precision dayfract,fday,fhour,fmin,fsecond,term
|
||||
fday=dint(dayfract)
|
||||
term=(dayfract-fday)*24.0d0
|
||||
fhour=dint(term)
|
||||
term=(term-fhour)*60.0d0
|
||||
fmin=dint(term)
|
||||
fsecond=(term-fmin)*60.0d0
|
||||
if(dabs(fsecond-60.0d0).lt.1.0d-8)then
|
||||
fsecond=0.0d0
|
||||
fmin=fmin+1.0d0
|
||||
endif
|
||||
if(dabs(fmin-60.0d0).lt.(1.0d-8/60.0d0))then
|
||||
fmin=0.0d0
|
||||
fhour=fhour+1.0d0
|
||||
endif
|
||||
if(dabs(fhour).lt.1.0d-8.and.dabs(fmin).lt.1.0d-8.and.
|
||||
&dabs(fsecond).lt.1.0d-8)then
|
||||
if(dabs(fday-1.0d0).gt.1.0d-8)then
|
||||
fday=fday-1.0d0
|
||||
fhour=24.0d0
|
||||
fmin=0.0d0
|
||||
fsecond=0.0d0
|
||||
endif
|
||||
endif
|
||||
return
|
||||
end
|
||||
|
||||
subroutine doy_to_monthday(month,monthday,year,idoy)
|
||||
!extract month,day of month from year and day of year
|
||||
implicit none
|
||||
integer month,monthday,year,idoy,isitaleapyear,
|
||||
&i,j,k,ndays(12)
|
||||
ndays(1)=31
|
||||
ndays(2)=28+isitaleapyear(year)
|
||||
ndays(3)=31
|
||||
ndays(4)=30
|
||||
ndays(5)=31
|
||||
ndays(6)=30
|
||||
ndays(7)=31
|
||||
ndays(8)=31
|
||||
ndays(9)=30
|
||||
ndays(10)=31
|
||||
ndays(11)=30
|
||||
ndays(12)=31
|
||||
k=0
|
||||
do i=1,12
|
||||
do j=1,ndays(i)
|
||||
k=k+1
|
||||
if(k.eq.idoy)then
|
||||
month=i
|
||||
monthday=j
|
||||
return
|
||||
endif
|
||||
enddo
|
||||
enddo
|
||||
month=99
|
||||
monthday=99
|
||||
return
|
||||
end
|
||||
|
||||
subroutine timestamp(iyear,dayfract,month,monthday,idoy,ihour,
|
||||
&imin,isecond,chartimestamp)
|
||||
implicit none
|
||||
integer iyear,month,monthday,idoy,ihour,imin,isecond,itimestamp
|
||||
double precision dayfract,fday,fhour,fmin,fsecond
|
||||
character charyear*4,charmonth*2,charmonthday*2,charhour*2,
|
||||
&charmin*2,charsecond*2,chartimestamp*14
|
||||
if(dayfract.lt.1.0d0)dayfract=1.0d0
|
||||
call doytotime(dayfract,fday,fhour,fmin,fsecond)
|
||||
idoy=idnint(fday)
|
||||
ihour=idnint(fhour)
|
||||
imin=idnint(fmin)
|
||||
isecond=idnint(fsecond)
|
||||
call doy_to_monthday(month,monthday,iyear,idoy)
|
||||
call NumberToChar(iyear,4,charyear)
|
||||
call NumberToChar(month,2,charmonth)
|
||||
call NumberToChar(monthday,2,charmonthday)
|
||||
call NumberToChar(ihour,2,charhour)
|
||||
call NumberToChar(imin,2,charmin)
|
||||
call NumberToChar(isecond,2,charsecond)
|
||||
chartimestamp=
|
||||
&charyear//charmonth//charmonthday//charhour//charmin//charsecond
|
||||
return
|
||||
end
|
||||
|
||||
subroutine mnmdyeardoy(tenletters,month,monthday,
|
||||
&year,idoy,yearfract)
|
||||
!extract month,day of month, year, day of year, and year fraction (e.g. 2007.15) from
|
||||
!a string of 10 characters in the exact form as 08-21-2010 (mn-md-year)
|
||||
implicit none
|
||||
character tenletters*(*),c*1
|
||||
integer month,monthday,year,idoy,izero,isitaleapyear,
|
||||
& i,j,k,n,ndays(12),ntotdays,itime(3)
|
||||
double precision yearfract
|
||||
|
||||
do j=1,3
|
||||
itime(j)=0
|
||||
enddo
|
||||
n=len(tenletters)
|
||||
k=0
|
||||
j=1
|
||||
do i=n,1,-1
|
||||
c=tenletters(i:i)
|
||||
if(ichar(c).ge.48.and.ichar(c).le.57)then
|
||||
itime(j)=itime(j)+(ichar(c)-48)*(10**k)
|
||||
k=k+1
|
||||
else
|
||||
if(k.ne.0)j=j+1
|
||||
k=0
|
||||
endif
|
||||
enddo
|
||||
year=itime(1)
|
||||
monthday=itime(2)
|
||||
month=itime(3)
|
||||
|
||||
! izero=48
|
||||
! month=(ichar(tenletters(1:1))-izero)*10
|
||||
! month=month+(ichar(tenletters(2:2))-izero)
|
||||
! monthday=(ichar(tenletters(4:4))-izero)*10
|
||||
! monthday=monthday+(ichar(tenletters(5:5))-izero)
|
||||
! year=(ichar(tenletters(7:7))-izero)*1000
|
||||
! year=year+(ichar(tenletters(8:8))-izero)*100
|
||||
! year=year+(ichar(tenletters(9:9))-izero)*10
|
||||
! year=year+(ichar(tenletters(10:10))-izero)
|
||||
|
||||
ndays(1)=31
|
||||
ndays(2)=28+isitaleapyear(year)
|
||||
ndays(3)=31
|
||||
ndays(4)=30
|
||||
ndays(5)=31
|
||||
ndays(6)=30
|
||||
ndays(7)=31
|
||||
ndays(8)=31
|
||||
ndays(9)=30
|
||||
ndays(10)=31
|
||||
ndays(11)=30
|
||||
ndays(12)=31
|
||||
ntotdays=365+isitaleapyear(year)
|
||||
idoy=monthday
|
||||
do i=1,month-1
|
||||
idoy=idoy+ndays(i)
|
||||
enddo
|
||||
yearfract=dble(year)+dble(idoy)/dble(ntotdays)
|
||||
return
|
||||
end
|
||||
Reference in New Issue
Block a user