Changeset 205 for trunk/SRC/Calendar


Ignore:
Timestamp:
01/22/07 08:55:49 (17 years ago)
Author:
smasson
Message:

improve the use of high frequency calendar

Location:
trunk/SRC/Calendar
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/SRC/Calendar/caldat.pro

    r163 r205  
    7070  IF n_elements(key_caltype) EQ 0 THEN key_caltype = 'greg' 
    7171  if keyword_set(ndayspm) then key_caltype = '360d' 
     72 
     73  nParam = N_PARAMS() 
     74  IF (nParam LT 1) THEN MESSAGE, 'Incorrect number of arguments.' 
     75 
    7276  CASE key_caltype OF 
    7377    'greg':BEGIN 
    74  
    75       nParam = N_PARAMS() 
    76       IF (nParam LT 1) THEN MESSAGE, 'Incorrect number of arguments.' 
    7778 
    7879      min_julian = -1095 
     
    110111      year = TEMPORARY(year) - (month GT 2) 
    111112      year = year - (year LE 0) 
    112 ; see if we need to do hours, minutes, seconds 
    113       IF (nParam GT 4) THEN BEGIN 
    114         fraction = julian + 0.5d - TEMPORARY(julLong) 
    115         hour = floor(fraction * 24d) 
    116         fraction = TEMPORARY(fraction) - hour/24d 
    117         minute = floor(fraction*1440d) 
    118         second = (TEMPORARY(fraction) - minute/1440d) * 86400d 
    119       ENDIF 
    120  
    121 ; if julian is an array, reform all output to correct dimensions 
    122       IF (SIZE(julian, /N_DIMENSION) GT 0) THEN BEGIN 
    123         dimensions = SIZE(julian, /DIMENSION) 
    124         month = REFORM(month, dimensions) 
    125         day = REFORM(day, dimensions) 
    126         year = REFORM(year, dimensions) 
    127         IF (nParam GT 4) THEN BEGIN 
    128           hour = REFORM(hour, dimensions) 
    129           minute = REFORM(minute, dimensions) 
    130           second = REFORM(second, dimensions) 
    131         ENDIF 
    132       ENDIF 
    133113 
    134114    END  
    135115    '360d':BEGIN 
    136  
    137       jul = long(julian) 
    138       f = (jul - floor(jul)) 
    139       IF total(f NE 0.0) GT 0 THEN BEGIN ;Get hours, minutes, seconds. 
    140         hour = floor(f*24.) 
    141         f = f - hour / 24.d 
    142         minute = floor(f*1440) 
    143         second = (f - minute/1440.d0) * 86400.0d0 
    144       ENDIF ELSE BEGIN 
    145         hour = replicate(0L,  n_elements(julian)) 
    146         minute = replicate(0L,  n_elements(julian)) 
    147         second = replicate(0L,  n_elements(julian)) 
    148       ENDELSE 
    149  
     116  
    150117      IF keyword_set(ndayspm) THEN BEGIN 
    151118        IF ndayspm EQ 1 THEN ndayspm = 30 
     
    153120 
    154121      ndayspm = long(ndayspm) 
    155       Z = floor(julian) 
    156       year = z/(12*ndayspm)+1 
    157       month = (z-(12*ndayspm)*(year-1))/ndayspm+1 
    158       day = z-(12*ndayspm)*(year-1)-ndayspm*(month-1) 
     122      julLong = FLOOR(julian + 0.5d)     ;Better be long 
     123      year = julLong/(12*ndayspm)+1 
     124      month = (julLong-(12*ndayspm)*(year-1))/ndayspm+1 
     125      day = julLong-(12*ndayspm)*(year-1)-ndayspm*(month-1) 
    159126      WHILE total(day LT 1) GT 0 DO BEGIN 
    160127        tochange = where(day LT 1) 
     
    173140    'noleap':BEGIN 
    174141 
    175       jul = long(julian) 
    176       year = jul/365 + 1 
    177       day = jul MOD 365L 
    178 ; 
     142      julLong = FLOOR(julian + 0.5d)     ;Better be long 
     143      year = julLong/365 + 1 
     144      day = julLong MOD 365L 
    179145; 
    180146      zero = where(day EQ 0) 
    181  ; 
     147; 
    182148      month = 1 + (day GT 31) + (day GT 59) + (day GT 90) + (day GT 120) $ 
    183149              + (day GT 151) + (day GT 181) + (day GT 212) + (day GT 243) $ 
     
    195161        day[zero] = 31L 
    196162      ENDIF  
    197  
     163; 
    198164    END  
    199165    ELSE:BEGIN 
     
    206172  IF cnt NE 0 THEN year[zero] = year[zero]-654321L 
    207173; 
     174; see if we need to do hours, minutes, seconds 
     175  IF (nParam GT 4) THEN BEGIN 
     176    fraction = julian + 0.5d - TEMPORARY(julLong) 
     177    hour = floor(fraction * 24d) 
     178    fraction = TEMPORARY(fraction) - hour/24d 
     179    minute = floor(fraction*1440d) 
     180    second = (TEMPORARY(fraction) - minute/1440d) * 86400d 
     181  ENDIF 
     182   
     183; if julian is an array, reform all output to correct dimensions 
     184  IF (SIZE(julian, /N_DIMENSION) GT 0) THEN BEGIN 
     185    dimensions = SIZE(julian, /DIMENSION) 
     186    month = REFORM(month, dimensions, /overwrite) 
     187    day = REFORM(day, dimensions, /overwrite) 
     188    year = REFORM(year, dimensions, /overwrite) 
     189    IF (nParam GT 4) THEN BEGIN 
     190      hour = REFORM(hour, dimensions, /overwrite) 
     191      minute = REFORM(minute, dimensions, /overwrite) 
     192      second = REFORM(second, dimensions, /overwrite) 
     193    ENDIF 
     194  ENDIF 
     195; 
    208196  return 
    209197 
  • trunk/SRC/Calendar/date2jul.pro

    r157 r205  
    5050     + 2000 * (year GE  1 AND year LE 49) 
    5151;------------------------------------------------------------ 
    52    return, julday(month, day, year) 
     52  IF array_equal(date, long(date)) THEN return, julday(month, day, year) 
     53   
     54  fraction = date - long(date) 
     55  hour = floor(fraction * 24d) 
     56  fraction = TEMPORARY(fraction) - hour/24d 
     57  minute = floor(fraction*1440d) 
     58  second = (TEMPORARY(fraction) - minute/1440d) * 86400d 
     59   
     60  return, julday(month, day, year, hour, minute, second) 
     61 
    5362end 
    5463 
  • trunk/SRC/Calendar/jul2date.pro

    r157 r205  
    3030  compile_opt idl2, strictarrsubs 
    3131; 
    32  
    33   caldat, jday, month, day, year 
    34  
     32  caldat, jday, month, day, year, hour, min, sec 
     33; 
    3534  res = (10000L*year + 100L*month + day)*(year GE 0) $ 
    3635        +( 10000L*year - 100L*month - day)*(year LT 0) 
     36; 
     37  IF total([hour NE 12, min NE 0, sec NE 0]) EQ 0 THEN return, long(res) $ 
     38  ELSE return, double(res) + (hour / 24.0d0) + (min/1440.0d0) + (sec / 86400.0d0) 
    3739 
    38   return, long(res) 
    3940end 
  • trunk/SRC/Calendar/julday.pro

    r163 r205  
    9393  if keyword_set(ndayspm) then key_caltype = '360d' 
    9494; 
    95  
    9695  YEAR = long(yearin) 
    9796  zero = where(year EQ 0, cnt) 
     
    10099  CASE key_caltype OF 
    101100    'greg':BEGIN 
    102  
    103101 
    104102; Gregorian Calender was adopted on Oct. 15, 1582 
     
    245243      if n_elements(Hour) + n_elements(Minute) + n_elements(Second) eq 0 then $ 
    246244        return, JUL 
    247       if n_elements(Hour) eq 0 then Hour = 0 
     245      if n_elements(Hour) eq 0 then Hour = 12 
    248246      if n_elements(Minute) eq 0 then Minute = 0 
    249247      if n_elements(Second) eq 0 then Second = 0 
    250248       
    251       IF Hour+Minute+Second EQ 0 THEN return, JUL ELSE $ 
    252         return, JUL + (Hour / 24.0d0) + (Minute/1440.0d0) + (Second / 86400.0d0) 
     249      IF total([hour NE 12, minute NE 0, second NE 0]) EQ 0 THEN return, JUL ELSE $ 
     250        return, JUL + (Hour / 24.0d0 - 0.5d) + (Minute/1440.0d0) + (Second / 86400.0d0) 
    253251 
    254252    END  
     
    275273      daysyear = long(total([0, 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30], /cumulative)) 
    276274 
    277       return, 365*L_YEAR + daysyear[L_MONTH] + L_DAY 
     275      JUL = 365*L_YEAR + daysyear[L_MONTH] + L_DAY 
     276      if n_elements(Hour) + n_elements(Minute) + n_elements(Second) eq 0 then $ 
     277        return, JUL 
     278      if n_elements(Hour) eq 0 then Hour = 12 
     279      if n_elements(Minute) eq 0 then Minute = 0 
     280      if n_elements(Second) eq 0 then Second = 0 
     281       
     282        IF total([hour NE 12, minute NE 0, second NE 0]) EQ 0 THEN return, JUL ELSE $ 
     283        return, JUL + (Hour / 24.0d0 - 0.5d) + (Minute/1440.0d0) + (Second / 86400.0d0) 
    278284 
    279285    END  
Note: See TracChangeset for help on using the changeset viewer.