Ignore:
Timestamp:
01/21/08 14:44:35 (16 years ago)
Author:
bellier
Message:

calendar :

  • modification of tests to get rid of a truncation error in the determination of the date change.
  • addition in "itau2ymds" of a message to inform usage of undefined elements (call with "ioconf_startdate" not done)

restcom :

  • some orthographic correction

JB

File:
1 edited

Legend:

Unmodified
Added
Removed
  • IOIPSL/trunk/src/calendar.f90

    r11 r236  
    55!- This is the calendar which going to be used to do all 
    66!- calculations on time. Three types of calendars are possible : 
    7 !-  - gregorian : The normal calendar. The time origin for the 
    8 !-                julian day in this case is 24 Nov -4713 
    9 !-  - nolap : A 365 day year without leap years. 
    10 !-            The origin for the julian days is in this case 1 Jan 0 
    11 !-  - xxxd : Year of xxx days with month of equal length. 
    12 !-           The origin for the julian days is then also 1 Jan 0 
     7!- 
     8!-  - gregorian : 
     9!-      The normal calendar. The time origin for the 
     10!-      julian day in this case is 24 Nov -4713 
     11!-      (other names : 'standard','proleptic_gregorian') 
     12!-  - noleap : 
     13!-      A 365 day year without leap years. 
     14!-      The origin for the julian days is in this case 1 Jan 0 
     15!-      (other names : '365_day','365d') 
     16!-  - all_leap : 
     17!-      A 366 day year with leap years. 
     18!-      The origin for the julian days is in this case ???? 
     19!-      (other names : '366_day','366d' 
     20!-  - julian : 
     21!-      same as gregorian, but with all leap century years 
     22!-  - xxxd : 
     23!-      Year of xxx days with month of equal length. 
     24!-      The origin for the julian days is then also 1 Jan 0 
     25!- 
    1326!- As one can see it is difficult to go from one calendar to the other. 
    1427!- All operations involving julian days will be wrong. 
    1528!- This calendar will lock as soon as possible 
    16 !- the length of the year and  forbid any further modification. 
     29!- the length of the year and forbid any further modification. 
    1730!- 
    1831!- For the non leap-year calendar the method is still brute force. 
     
    235248  INTEGER :: l,n,i,jd,j,d,m,y,ml 
    236249  INTEGER :: add_day 
     250  REAL :: eps_day = SPACING(one_day) 
    237251!--------------------------------------------------------------------- 
    238252  lock_one_year = .TRUE. 
     
    240254  jd = julian_day 
    241255  sec = julian_sec 
    242   IF (sec > one_day) THEN 
     256  IF (sec > (one_day-eps_day)) THEN 
    243257    add_day = INT(sec/one_day) 
    244258    sec = sec-add_day*one_day 
    245259    jd = jd+add_day 
    246260  ENDIF 
    247   IF (sec < 0.) THEN 
     261  IF (sec < -eps_day) THEN 
    248262    sec = sec+one_day 
    249263    jd = jd-1 
     
    295309SUBROUTINE tlen2itau (input_str,dt,date,itau) 
    296310!--------------------------------------------------------------------- 
    297 !- This subroutine transforms a sting containing a time length 
     311!- This subroutine transforms a string containing a time length 
    298312!- into a number of time steps. 
    299313!- To do this operation the date (in julian days is needed as the 
     
    388402REAL FUNCTION itau2date (itau,date0,deltat) 
    389403!--------------------------------------------------------------------- 
    390 !- This function transforms itau into a date. The date whith which 
     404!- This function transforms itau into a date. The date with which 
    391405!- the time axis is going to be labeled 
    392406!- 
     
    410424!=== 
    411425!- 
    412 SUBROUTINE itau2ymds (itau,deltat,year,month,date,sec) 
    413 !--------------------------------------------------------------------- 
    414 !- This subroutine transforms itau into a date. The date whith which 
     426SUBROUTINE itau2ymds (itau,deltat,year,month,day,sec) 
     427!--------------------------------------------------------------------- 
     428!- This subroutine transforms itau into a date. The date with which 
    415429!- the time axis is going to be labeled 
    416430!- 
     
    420434!- 
    421435!- OUTPUT 
    422 !-   year : year 
     436!-   year  : year 
    423437!-   month : month 
    424 !-   date : date 
    425 !-   sec  : seconds since midnight 
     438!-   day   : day 
     439!-   sec   : seconds since midnight 
    426440!--------------------------------------------------------------------- 
    427441  IMPLICIT NONE 
     
    430444  REAL,INTENT(IN)    :: deltat 
    431445!- 
    432   INTEGER,INTENT(OUT) :: year,month,date 
     446  INTEGER,INTENT(OUT) :: year,month,day 
    433447  REAL,INTENT(OUT)    :: sec 
    434448!- 
     
    436450  REAL    :: julian_sec 
    437451!--------------------------------------------------------------------- 
     452  IF (.NOT.lock_startdate) THEN 
     453    CALL ipslerr (2,'itau2ymds', & 
     454 &   'You try to call this function, itau2ymds, but you didn''t', & 
     455 &   ' call ioconf_startdate to initialize date0 in calendar.', & 
     456 &   ' Please call ioconf_startdate before itau2ymds.') 
     457  ENDIF 
    438458  julian_day = start_day 
    439459  julian_sec = start_sec+REAL(itau)*deltat 
    440 !- 
    441   CALL ju2ymds_internal (julian_day,julian_sec,year,month,date,sec) 
     460  CALL ju2ymds_internal (julian_day,julian_sec,year,month,day,sec) 
    442461!----------------------- 
    443462END SUBROUTINE itau2ymds 
Note: See TracChangeset for help on using the changeset viewer.