function jdate,yymmdd ;This function returns the julian day for an integer input for the ;year (good up to year 2000) ; ;One oddity of this program is that if the input is a scalar, the ;output is a scalar. If the input is a matrix, the output is a matrix. ;At first it would seem that one could write this code with one loop ;making the scalar case a 1x1 matrix - but this wreaks havoc if the ;output is to be used as an index in a matrix. ; ;BWBerger 12/6/98 ; ;Modified by BWBerger 6/30/99 to make program y2k compatible. rw=row(yymmdd) cl=col(yymmdd) if rw eq 1 and cl eq 1 then begin ymd=strtrim(string(yymmdd),2) if (yymmdd le 991231) then begin ;year is 2-digits if yymmdd lt 501231 then begin ;year should most likely have be ;given in 4-digits print,'jdate.pro failure. You must supply 4-digit year for yr>=2000.' jday=-999. goto,fini ;year is 2000>2050 but only 2-digits given, this is an error endif else begin ;year is 2-digit and probably ok yr=long(strmid(ymd,0,2)) mo=long(strmid(ymd,2,2)) dy=long(strmid(ymd,4,2)) endelse endif else begin ;otherwise year is 4-digits yr=long(strmid(ymd,0,4)) mo=long(strmid(ymd,4,2)) dy=long(strmid(ymd,6,2)) endelse ; computes integer julian day from yr, mo, dy. ; OK with leap years case 1 of ((mo eq 1)):begin jday=0+dy end ((mo eq 2)):begin jday=31+dy end (((mo eq 3) and (yr/4. ne fix(yr/4.)))):begin jday=59+dy end (((mo eq 3) and (yr/4. eq fix(yr/4.)))):begin jday=60+dy end (((mo eq 4) and (yr/4. ne fix(yr/4.)))):begin jday=90+dy end (((mo eq 4) and (yr/4. eq fix(yr/4.)))):begin jday=91+dy end (((mo eq 5) and (yr/4. ne fix(yr/4.)))):begin jday=120+dy end (((mo eq 5) and (yr/4. eq fix(yr/4.)))):begin jday=121+dy end (((mo eq 6) and (yr/4. ne fix(yr/4.)))):begin jday=151+dy end (((mo eq 6) and (yr/4. eq fix(yr/4.)))):begin jday=152+dy end (((mo eq 7) and (yr/4. ne fix(yr/4.)))):begin jday=181+dy end (((mo eq 7) and (yr/4. eq fix(yr/4.)))):begin jday=182+dy end (((mo eq 8) and (yr/4. ne fix(yr/4.)))):begin jday=212+dy end (((mo eq 8) and (yr/4. eq fix(yr/4.)))):begin jday=213+dy end (((mo eq 9) and (yr/4. ne fix(yr/4.)))):begin jday=243+dy end (((mo eq 9) and (yr/4. eq fix(yr/4.)))):begin jday=244+dy end (((mo eq 10) and (yr/4. ne fix(yr/4.)))):begin jday=273+dy end (((mo eq 10) and (yr/4. eq fix(yr/4.)))):begin jday=274+dy end (((mo eq 11) and (yr/4. ne fix(yr/4.)))):begin jday=304+dy end (((mo eq 11) and (yr/4. eq fix(yr/4.)))):begin jday=305+dy end (((mo eq 12) and (yr/4. ne fix(yr/4.)))):begin jday=334+dy end (((mo eq 12) and (yr/4. eq fix(yr/4.)))):begin jday=335+dy end endcase endif else begin jday=intarr(cl,rw) if rw gt cl then begin leng=rw endif else begin leng=cl endelse for k=0,leng-1 do begin ymd=strtrim(string(yymmdd(k)),2) if (yymmdd(k) le 991231) then begin ;year is 2-digits if yymmdd(k) lt 501231 then begin ;year should most likely have be ;given in 4-digits print,'jdate.pro failure. You must supply 4-digit year for yr>=2000.' jday(k)=-999. goto,fini ;year is 2000>2050 but only 2-digits given, this is an error endif else begin ;year is 2-digit and probably ok yr=long(strmid(ymd,0,2)) mo=long(strmid(ymd,2,2)) dy=long(strmid(ymd,4,2)) endelse endif else begin ;otherwise year is 4-digits yr=long(strmid(ymd,0,4)) mo=long(strmid(ymd,4,2)) dy=long(strmid(ymd,6,2)) endelse ; computes integer julian day from yr, mo, dy. ; OK with leap years case 1 of ((mo eq 1)):begin jday(k)=0+dy end ((mo eq 2)):begin jday(k)=31+dy end (((mo eq 3) and (yr/4. ne fix(yr/4.)))):begin jday(k)=59+dy end (((mo eq 3) and (yr/4. eq fix(yr/4.)))):begin jday(k)=60+dy end (((mo eq 4) and (yr/4. ne fix(yr/4.)))):begin jday(k)=90+dy end (((mo eq 4) and (yr/4. eq fix(yr/4.)))):begin jday(k)=91+dy end (((mo eq 5) and (yr/4. ne fix(yr/4.)))):begin jday(k)=120+dy end (((mo eq 5) and (yr/4. eq fix(yr/4.)))):begin jday(k)=121+dy end (((mo eq 6) and (yr/4. ne fix(yr/4.)))):begin jday(k)=151+dy end (((mo eq 6) and (yr/4. eq fix(yr/4.)))):begin jday(k)=152+dy end (((mo eq 7) and (yr/4. ne fix(yr/4.)))):begin jday(k)=181+dy end (((mo eq 7) and (yr/4. eq fix(yr/4.)))):begin jday(k)=182+dy end (((mo eq 8) and (yr/4. ne fix(yr/4.)))):begin jday(k)=212+dy end (((mo eq 8) and (yr/4. eq fix(yr/4.)))):begin jday(k)=213+dy end (((mo eq 9) and (yr/4. ne fix(yr/4.)))):begin jday(k)=243+dy end (((mo eq 9) and (yr/4. eq fix(yr/4.)))):begin jday(k)=244+dy end (((mo eq 10) and (yr/4. ne fix(yr/4.)))):begin jday(k)=273+dy end (((mo eq 10) and (yr/4. eq fix(yr/4.)))):begin jday(k)=274+dy end (((mo eq 11) and (yr/4. ne fix(yr/4.)))):begin jday(k)=304+dy end (((mo eq 11) and (yr/4. eq fix(yr/4.)))):begin jday(k)=305+dy end (((mo eq 12) and (yr/4. ne fix(yr/4.)))):begin jday(k)=334+dy end (((mo eq 12) and (yr/4. eq fix(yr/4.)))):begin jday(k)=335+dy end endcase endfor endelse fini: return,jday end