1 |
C $Header: /u/gcmpack/development/heimbach/ecco_env/pkg/cal/cal_monthsforyear.F,v 1.4 2001/02/02 16:57:22 heimbach Exp $ |
2 |
|
3 |
#include "CAL_CPPOPTIONS.h" |
4 |
|
5 |
subroutine cal_MonthsForYear( |
6 |
I iyear, |
7 |
O firstmonth, |
8 |
O lastmonth, |
9 |
O nmonths, |
10 |
I mythid |
11 |
& ) |
12 |
|
13 |
c ================================================================== |
14 |
c SUBROUTINE cal_MonthsForYear |
15 |
c ================================================================== |
16 |
c |
17 |
c o Given the current year of integration this routine returns |
18 |
c the number of months affected by the integration as well as the |
19 |
c first month and the last month in the sequence of the total |
20 |
c number of months that are to be integrated. |
21 |
c |
22 |
c This routine also checks consistency of variables quite |
23 |
c extensively. |
24 |
c |
25 |
c started: Christian Eckert eckert@mit.edu 06-Apr-2000 |
26 |
c |
27 |
c changed: |
28 |
c |
29 |
c ================================================================== |
30 |
c SUBROUTINE cal_MonthsForYear |
31 |
c ================================================================== |
32 |
|
33 |
implicit none |
34 |
|
35 |
c == global variables == |
36 |
|
37 |
#include "cal.h" |
38 |
|
39 |
c == routine arguments == |
40 |
|
41 |
integer iyear |
42 |
integer firstmonth |
43 |
integer lastmonth |
44 |
integer nmonths |
45 |
integer mythid |
46 |
|
47 |
c == local variables == |
48 |
|
49 |
integer ierr |
50 |
integer numyears |
51 |
integer firstyear |
52 |
integer firstmon |
53 |
integer lastyear |
54 |
integer lastmon |
55 |
integer lastday |
56 |
integer lastsecs |
57 |
|
58 |
c == external == |
59 |
|
60 |
integer cal_IntYears |
61 |
external cal_IntYears |
62 |
|
63 |
c == end of interface == |
64 |
|
65 |
numyears = cal_IntYears( mythid ) |
66 |
|
67 |
firstyear = modelstartdate(1)/10000 |
68 |
firstmon = mod(modelstartdate(1)/100,100) |
69 |
lastyear = modelenddate(1)/10000 |
70 |
lastmon = mod(modelenddate(1)/100,100) |
71 |
lastday = mod(modelenddate(1),100) |
72 |
lastsecs = modelenddate(2)/10000*secondsperhour + |
73 |
& mod(modelenddate(2)/100,100)*secondsperminute + |
74 |
& mod(modelenddate(2),100) |
75 |
|
76 |
if ( numyears .eq. 1 ) then |
77 |
c-- Only one calendar year affected by the integration. |
78 |
if ( iyear .eq. 1 ) then |
79 |
if ( firstyear .eq. lastyear ) then |
80 |
if ( (lastday .eq. 1) .and. (lastsecs .eq. 0) ) then |
81 |
c-- Not really next month yet. |
82 |
lastmonth = lastmon - firstmon |
83 |
else |
84 |
c-- The most frequent case. |
85 |
lastmonth = lastmon - firstmon + 1 |
86 |
endif |
87 |
firstmonth = 1 |
88 |
else if ( firstyear+1 .eq. lastyear ) then |
89 |
c-- This is only the case if we end at midnight of 01-Jan |
90 |
c-- of the next year. |
91 |
if ( ( modelenddate(2) .eq. 0) .and. |
92 |
& ( mod(modelenddate(1),100) .eq. 1 ) .and. |
93 |
& mod(modelenddate(1)/100,100) .eq. 1 ) then |
94 |
firstmonth = 1 |
95 |
lastmonth = nmonthyear - firstmon + 1 |
96 |
else |
97 |
c-- Inconsistent modelenddate; check cal_IntYears. |
98 |
ierr = 2804 |
99 |
call cal_PrintError( ierr, mythid ) |
100 |
stop ' stopped in cal_MonthsForYear.' |
101 |
endif |
102 |
else |
103 |
c-- The specification of lastyear is wrong. |
104 |
ierr = 2803 |
105 |
call cal_PrintError( ierr, mythid ) |
106 |
stop ' stopped in cal_MonthsForYear.' |
107 |
endif |
108 |
else |
109 |
c-- The variables numyears and iyear are inconsistent; |
110 |
c-- ( iyear .gt. numyears ). |
111 |
ierr = 2802 |
112 |
call cal_PrintError( ierr, mythid ) |
113 |
stop ' stopped in cal_MonthsForYear.' |
114 |
endif |
115 |
|
116 |
else if ( numyears .gt. 1 ) then |
117 |
c-- More than one year of integration. |
118 |
if ( iyear .eq. 1 ) then |
119 |
firstmonth = 1 |
120 |
lastmonth = nmonthyear - firstmon + 1 |
121 |
else if ( ( iyear .gt. 1 ) .and. |
122 |
& ( iyear .lt. numyears ) ) then |
123 |
c-- Somewhere between first and last year. |
124 |
firstmonth = (nmonthyear - firstmon + 1) + |
125 |
& (iyear - 2)*nmonthyear + 1 |
126 |
lastmonth = (nmonthyear - firstmon + 1) + |
127 |
& (iyear - 2)*nmonthyear + nmonthyear |
128 |
else if ( iyear .eq. numyears ) then |
129 |
c-- The last year of the integration. |
130 |
if ( lastyear .eq. (firstyear + numyears - 1) ) then |
131 |
if ( (lastday .eq. 1) .and. (lastsecs .eq. 0) ) then |
132 |
c-- Not really next month yet. |
133 |
lastmonth = (nmonthyear - firstmon + 1) + |
134 |
& (numyears - 2)*nmonthyear + lastmon - 1 |
135 |
else |
136 |
c-- The most frequent case. |
137 |
lastmonth = (nmonthyear - firstmon + 1) + |
138 |
& (numyears - 2)*nmonthyear + lastmon |
139 |
endif |
140 |
firstmonth = (nmonthyear - firstmon + 1) + |
141 |
& (numyears - 2)*nmonthyear + 1 |
142 |
else if ( lastyear .eq. (firstyear + numyears) ) then |
143 |
c-- This is only the case if we end at midnight of 01-Jan. |
144 |
if ( ( modelenddate(2) .eq. 0) .and. |
145 |
& ( mod(modelenddate(1),100) .eq. 1 ) .and. |
146 |
& mod(modelenddate(1)/100,100) .eq. 1 ) then |
147 |
firstmonth = (nmonthyear - firstmon) + |
148 |
& (numyears - 2)*nmonthyear + 1 |
149 |
lastmonth = (nmonthyear - firstmon) + |
150 |
& (numyears - 2)*nmonthyear + nmonthyear |
151 |
else |
152 |
c-- Inconsistent modelenddate; check cal_IntYears. |
153 |
ierr = 2807 |
154 |
call cal_PrintError( ierr, mythid ) |
155 |
stop ' stopped in cal_MonthsForYear.' |
156 |
endif |
157 |
else |
158 |
c-- The variables lastyear and numyears are inconsistent. |
159 |
ierr = 2806 |
160 |
call cal_PrintError( ierr, mythid ) |
161 |
stop ' stopped in cal_MonthsForYear.' |
162 |
endif |
163 |
else |
164 |
c-- The variables iyear and numyears are inconsistent. |
165 |
ierr = 2805 |
166 |
call cal_PrintError( ierr, mythid ) |
167 |
stop ' stopped in cal_MonthsForYear.' |
168 |
endif |
169 |
|
170 |
else |
171 |
c-- The number of years to integrate is wrong; check cal_IntYears. |
172 |
ierr = 2801 |
173 |
call cal_PrintError( ierr, mythid ) |
174 |
stop ' stopped in cal_MonthsForYear.' |
175 |
endif |
176 |
|
177 |
c-- The number of months to integrate in the given year. |
178 |
nmonths = lastmonth - firstmonth + 1 |
179 |
|
180 |
return |
181 |
end |
182 |
|