/[lmdze]/trunk/Sources/IOIPSL/Calendar/ioconf_calendar.f
ViewVC logotype

Annotation of /trunk/Sources/IOIPSL/Calendar/ioconf_calendar.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 134 - (hide annotations)
Wed Apr 29 15:47:56 2015 UTC (9 years, 2 months ago) by guez
File size: 4556 byte(s)
Sources inside, compilation outside.
1 guez 92 module ioconf_calendar_m
2    
3 guez 93 ! From IOIPSL/src/calendar.f90, version 2.0 2004/04/05 14:47:47
4    
5     ! This is the calendar used to do all calculations on time. Three
6     ! types of calendars are possible:
7    
8     ! - Gregorian:
9     ! The normal calendar. The time origin for the julian day in this
10     ! case is 24 Nov -4713.
11    
12     ! - No leap:
13     ! A 365 day year without leap years. The origin for the julian days
14     ! is in this case 1 Jan 0.
15    
16     ! - xxxd:
17     ! Year of xxx days with months of equal length. The origin for the
18     ! julian days is then also 1 Jan 0.
19    
20 guez 132 ! It is difficult to go from one calendar to the other. All
21     ! operations involving julian days will be wrong. This calendar will
22     ! lock the length of the year as soon as possible and forbid any
23     ! further modification.
24 guez 93
25 guez 132 ! For the no-leap calendar, the method is still brute force. We
26     ! need to find an integer series which takes care of the length of
27     ! the various month. (Jan)
28 guez 93
29 guez 92 implicit none
30    
31 guez 93 INTEGER:: mon_len(12) = (/31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31/)
32     CHARACTER(LEN=20):: calendar_used = "gregorian"
33     REAL:: un_an = 365.2425 ! one year in days
34    
35 guez 92 contains
36    
37 guez 106 SUBROUTINE ioconf_calendar(str)
38 guez 92
39     ! This routine allows to configure the calendar to be used.
40     ! This operation is only allowed once and the first call to
41     ! ymds2ju or ju2ymsd will lock the current configuration.
42     ! the argument to ioconf_calendar can be any of the following:
43    
44 guez 132 ! - gregorian: this is the gregorian calendar (default here)
45    
46     ! - noleap: A calendar without leap years = 365 days
47    
48     ! - xxxd: A calendar of xxx days (has to be a modulo of 12) with
49     ! 12 month of equal length
50    
51 guez 93 use calendar, only: lock_unan
52 guez 132 use strlowercase_m, only: strlowercase
53     use errioipsl, only: histerr
54 guez 92
55     CHARACTER(LEN=*), INTENT(IN):: str
56    
57 guez 132 ! Local:
58     INTEGER leng, ipos
59     CHARACTER(LEN=10) str10
60 guez 92 !--------------------------------------------------------------------
61    
62 guez 132 CALL strlowercase(str)
63 guez 92
64     IF (.NOT.lock_unan) THEN
65     lock_unan=.TRUE.
66    
67     SELECT CASE(str)
68     CASE('gregorian')
69     calendar_used = 'gregorian'
70     un_an = 365.2425
71     mon_len(:)=(/31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31/)
72     CASE('standard')
73     calendar_used = 'gregorian'
74     un_an = 365.2425
75     mon_len(:)=(/31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31/)
76     CASE('proleptic_gregorian')
77     calendar_used = 'gregorian'
78     un_an = 365.2425
79     mon_len(:)=(/31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31/)
80     CASE('noleap')
81     calendar_used = 'noleap'
82     un_an = 365.0
83     mon_len(:)=(/31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31/)
84     CASE('365_day')
85     calendar_used = 'noleap'
86     un_an = 365.0
87     mon_len(:)=(/31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31/)
88     CASE('365d')
89     calendar_used = 'noleap'
90     un_an = 365.0
91     mon_len(:)=(/31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31/)
92     CASE('all_leap')
93     calendar_used = 'all_leap'
94     un_an = 366.0
95     mon_len(:)=(/31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31/)
96     CASE('366_day')
97     calendar_used = 'all_leap'
98     un_an = 366.0
99     mon_len(:)=(/31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31/)
100     CASE('366d')
101     calendar_used = 'all_leap'
102     un_an = 366.0
103     mon_len(:)=(/31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31/)
104     CASE DEFAULT
105     ipos = INDEX(str, 'd')
106     IF (ipos == 4) THEN
107     READ(str(1:3), '(I3)') leng
108 guez 132 IF ((MOD(leng, 12) == 0).AND.(leng > 1)) THEN
109 guez 92 calendar_used = str
110     un_an = leng
111     mon_len(:) = leng
112     ELSE
113     CALL histerr (3, 'ioconf_calendar', &
114 guez 93 'The length of the year has to be a modulo of 12', &
115     'so that it can be divided into 12 month of equal ' &
116     // 'length', str)
117 guez 92 ENDIF
118     ELSE
119     CALL histerr (3, 'ioconf_calendar', &
120 guez 93 'Unrecognized input, please ceck the man pages.', str, ' ')
121 guez 92 ENDIF
122     END SELECT
123     ELSE
124     WRITE(str10, '(f10.4)') un_an
125     CALL histerr (2, 'ioconf_calendar', &
126 guez 93 'The calendar was already used or configured. You are not', &
127     'allowed to change it again. '// &
128     'The following length of year is used:', str10)
129 guez 92 ENDIF
130    
131     END SUBROUTINE ioconf_calendar
132    
133     end module ioconf_calendar_m

  ViewVC Help
Powered by ViewVC 1.1.21