File: easter.f

package info (click to toggle)
x13as 1.1-B39-2
  • links: PTS, VCS
  • area: non-free
  • in suites: bullseye
  • size: 8,700 kB
  • sloc: fortran: 110,641; makefile: 14
file content (351 lines) | stat: -rw-r--r-- 11,829 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
C     Last change:  BCM  15 Apr 2005   12:12 pm
**==easter.f    processed by SPAG 4.03F  at 09:45 on  3 Oct 1994
      SUBROUTINE easter(Yhat,Khol,Kkhol,Kh2,Llda,Ihol,Nfcst)
      IMPLICIT NONE
c-----------------------------------------------------------------------
      INCLUDE 'srslen.prm'
      INCLUDE 'xeastr.cmn'
c-----------------------------------------------------------------------
      DOUBLE PRECISION TWOHND,TEN,TWO,ZERO,TWNTY4,ONE,SVNTN,ELEVEN,FOUR,
     &                 ONEHND,TWNTY1,FOURTN,TWNTY5,SEVEN
      PARAMETER(TWOHND=200D0,TEN=10D0,TWO=2D0,ZERO=0D0,TWNTY4=24D0,
     &          ONE=1D0,SVNTN=17D0,ELEVEN=11D0,FOUR=4D0,TWNTY1=21D0,
     &          FOURTN=14D0,ONEHND=100D0,TWNTY5=25D0,SEVEN=7D0)
c-----------------------------------------------------------------------
      DOUBLE PRECISION dif,dif1,dif2,sd28,sd915,sda,sdm,sum0,sum1,sum2,
     &                 suma,suma1,suma1e,suma2,suma2e,sumae,sumd1,sumd2
      DOUBLE PRECISION sumd3,summ,summe,var28,var915,vara,varm,yl1,yl2,
     &                 smfac,mfac,mfreq,Yhat
      INTEGER i,Ihol,Kh2,Khol,Kkhol,kk,ll,Llda,mm,nsuaa,nsuaa1,nsuaa2,
     &        nsum,nsum1,nsum2,nsuma,nsuma1,nsuma2,Nfcst
      DIMENSION Yhat(PLEN),mfac(0:34),mfreq(0:34)
c-----------------------------------------------------------------------
      DATA(mfreq(i),i=0,34)/
     & 0.0100D0,0.0150D0,0.0050D0,0.0175D0,0.0300D0,0.0325D0,0.0250D0,
     & 0.0300D0,0.0300D0,0.0400D0,0.0375D0,0.0350D0,0.0250D0,0.0275D0,
     & 0.0425D0,0.0425D0,0.0275D0,0.0300D0,0.0225D0,0.0400D0,0.0425D0,
     & 0.0325D0,0.0300D0,0.0350D0,0.0300D0,0.0425D0,0.0375D0,0.0350D0,
     & 0.0300D0,0.0250D0,0.0350D0,0.0300D0,0.0100D0,0.0100D0,0.0100D0/
c-----------------------------------------------------------------------
      ll=Llda
      IF(Lgenx)THEN
       CALL chkeas(Khol,Llda)
       IF((Ieast(1)*Ieast(2)*Ieast(3)*Ieast(4)).eq.0)THEN
        Ihol=0
        RETURN
       END IF
      END IF
      mm=ll+Nfcst
c      kk = Khol - 12
      kk=Kkhol
c-----------------------------------------------------------------------
C---- INVERT APRIL
c-----------------------------------------------------------------------
      DO i=Khol,ll-1,12
       Yhol(i+1)=TWOHND-Yhol(i+1)
      END DO
c-----------------------------------------------------------------------
C---- CALCULATE AVERAGES OF IRREGULARS BEFORE APRIL 2
c-----------------------------------------------------------------------
      summ=ZERO
      sum0=ZERO
      DO i=Khol,ll,12
       IF(Xhol(i).le.TEN)THEN
        summ=summ+Yhol(i)
        sum0=sum0+ONE
        IF(i.lt.ll)THEN
         summ=summ+Yhol(i+1)
         sum0=sum0+ONE
        END IF
       END IF
      END DO
      summ=summ/sum0
c-----------------------------------------------------------------------
C---- CALCULATE STANDARD DEVIATION OF OBS BEFORE APRIL 2
c-----------------------------------------------------------------------
      summe=ZERO
      nsum=0
      varm=ZERO
      DO i=Khol,ll,12
       IF(Xhol(i).le.TEN)THEN
        varm=(Yhol(i)-summ)**2+varm
        IF(i.lt.ll)varm=(Yhol(i+1)-summ)**2+varm
       END IF
      END DO
      sdm=sqrt(varm)/sqrt(sum0)*TWO
c-----------------------------------------------------------------------
C---- GET RID OF EXTREMES
c-----------------------------------------------------------------------
      DO i=Khol,ll,12
       IF(Xhol(i).le.TEN)THEN
        yl1=Yhol(i)
        dif=abs(Yhol(i)-summ)
        nsum1=1
        IF(dif.ge.sdm)THEN
         nsum1=0
         yl1=ZERO
        END IF
        yl2=ZERO
        nsum2=0
        IF(i.lt.ll)THEN
         dif=abs(Yhol(i+1)-summ)
         IF(dif.lt.sdm)THEN
          yl2=Yhol(i+1)
          nsum2=1
         END IF
        END IF
        summe=yl1+yl2+summe
        nsum=nsum1+nsum2+nsum
       END IF
      END DO
      summ=summe/nsum
c-----------------------------------------------------------------------
C---- CALCULATE AVERAGE AFTER APRIL 16TH
c-----------------------------------------------------------------------
      suma=ZERO
      sum0=ZERO
      DO i=Khol,ll,12
       IF(Xhol(i).gt.TWNTY4)THEN
        suma=suma+Yhol(i)
        sum0=sum0+ONE
        IF(i.lt.ll)THEN
         suma=suma+Yhol(i+1)
         sum0=sum0+ONE
        END IF
       END IF
      END DO
      suma=suma/sum0
c-----------------------------------------------------------------------
C---- CALCULATE STANDARD DEVIATION OF OBS AFTER APRIL 16
c-----------------------------------------------------------------------
      sumae=ZERO
      nsum=0
      vara=ZERO
      DO i=Khol,ll,12
       IF(Xhol(i).gt.TWNTY4)THEN
        vara=(Yhol(i)-suma)**2+vara
        IF(i.lt.ll)vara=(Yhol(i+1)-suma)**2+vara
       END IF
      END DO
      sda=sqrt(vara)/sqrt(sum0)*TWO
c-----------------------------------------------------------------------
C---- GET RID OF EXTREMES
c-----------------------------------------------------------------------
      DO i=Khol,ll,12
       IF(Xhol(i).gt.TWNTY4)THEN
        yl1=Yhol(i)
        dif=abs(Yhol(i)-suma)
        nsum1=1
        IF(dif.ge.sda)THEN
         nsum1=0
         yl1=ZERO
        END IF
        yl2=ZERO
        nsum2=0
        IF(i.lt.ll)THEN
         dif=abs(Yhol(i+1)-suma)
         IF(dif.lt.sda)THEN
          yl2=Yhol(i+1)
          nsum2=1
         END IF
        END IF
        sumae=yl1+yl2+sumae
        nsum=nsum1+nsum2+nsum
       END IF
      END DO
      suma=sumae/dble(nsum)
      sum1=ZERO
      sum2=ZERO
      suma1=ZERO
      suma2=ZERO
      DO i=Khol,ll,12
       IF((Xhol(i).gt.TEN).and.(Xhol(i).lt.TWNTY5))THEN
c-----------------------------------------------------------------------
C---- DO PERIOD APRIL 2 TO 8, 9 TO 15
c-----------------------------------------------------------------------
        IF(Xhol(i).le.SVNTN)THEN
         suma1=suma1+Yhol(i)
         sum1=sum1+ONE
         IF(i.lt.ll)THEN
          suma1=suma1+Yhol(i+1)
          sum1=sum1+ONE
         END IF
        ELSE
         suma2=suma2+Yhol(i)
         sum2=sum2+ONE
         IF(i.lt.ll)THEN
          suma2=suma2+Yhol(i+1)
          sum2=sum2+ONE
         END IF
        END IF
       END IF
      END DO
      suma1=suma1/sum1
      suma2=suma2/sum2
      DO i=Khol,mm,12
       IF(Xhol(i).lt.ELEVEN)THEN
        Yhat(i)=summ
        Yhat(i+1)=TWOHND-Yhat(i)
       ELSE IF(Xhol(i).gt.TWNTY4)THEN
        Yhat(i)=suma
        Yhat(i+1)=TWOHND-Yhat(i)
       ELSE IF(Xhol(i).le.FOURTN)THEN
        sumd1=FOURTN-Xhol(i)
        Yhat(i)=suma1+sumd1*(summ-suma1)/FOUR
       ELSE IF(Xhol(i).le.TWNTY1)THEN
        sumd2=TWNTY1-Xhol(i)
        Yhat(i)=suma2+sumd2*(suma1-suma2)/SEVEN
       ELSE
        sumd3=TWNTY5-Xhol(i)
        Yhat(i)=suma+sumd3*(suma2-suma)/FOUR
       END IF
      END DO
c-----------------------------------------------------------------------
C---- CALCULATE STANDARD ERRS FOR PERIODS APRIL 2-8,9-15
c-----------------------------------------------------------------------
      var28=ZERO
      var915=ZERO
      DO i=Khol,ll,12
       IF((Xhol(i).gt.TEN).and.(Xhol(i).lt.TWNTY5))THEN
        IF(Xhol(i).gt.SVNTN)THEN
         var915=(Yhol(i)-Yhat(i))**2+var915
         IF(i.lt.ll)var915=(Yhol(i+1)-Yhat(i))**2+var915
        ELSE
         var28=(Yhol(i)-Yhat(i))**2+var28
         IF(i.lt.ll)var28=(Yhol(i+1)-Yhat(i))**2+var28
        END IF
       END IF
      END DO
      sd28=sqrt(var28)/sqrt(sum1)*TWO
      sd915=sqrt(var915)/sqrt(sum2)*TWO
      nsuma=0
      suma1e=ZERO
      nsuaa=0
      suma2e=ZERO
c-----------------------------------------------------------------------
C---- THROW OUT EXTREMES BEYOND 2 STANDARD ERRORS FOR PERIODS APR 2-8
C---- AND APRIL 9-15
c-----------------------------------------------------------------------
      DO i=Khol,ll,12
       yl1=Yhol(i)
       IF(i.lt.ll)yl2=Yhol(i+1)
       IF((Xhol(i).gt.TEN).and.(Xhol(i).lt.TWNTY5))THEN
        IF(Xhol(i).gt.SVNTN)THEN
c-----------------------------------------------------------------------
C---- GET RID OF EXTREMES APRIL 9-15
c-----------------------------------------------------------------------
         dif2=abs(Yhol(i)-Yhat(i))
         IF(dif2.lt.sd915)THEN
          nsuaa1=1
         ELSE
          yl1=ZERO
          nsuaa1=0
         END IF
         IF(i.ge.ll)GO TO 20
         dif2=abs(Yhol(i+1)-Yhat(i))
         IF(dif2.ge.sd915)GO TO 20
         nsuaa2=1
         GO TO 30
        ELSE
c-----------------------------------------------------------------------
C---- APRIL 2-8
c-----------------------------------------------------------------------
         dif1=abs(Yhol(i)-Yhat(i))
         IF(dif1.lt.sd28)THEN
          nsuma1=1
         ELSE
          yl1=ZERO
          nsuma1=0
         END IF
         IF(i.lt.ll)THEN
          dif1=abs(Yhol(i+1)-Yhat(i))
          IF(dif1.lt.sd28)THEN
           nsuma2=1
           GO TO 10
          END IF
         END IF
         yl2=ZERO
         nsuma2=0
        END IF
   10   suma1e=yl1+yl2+suma1e
        nsuma=nsuma1+nsuma2+nsuma
       END IF
       GO TO 40
   20  yl2=ZERO
       nsuaa2=0
   30  suma2e=yl1+yl2+suma2e
       nsuaa=nsuaa1+nsuaa2+nsuaa
   40  CONTINUE
      END DO
      IF(nsuma.ne.0)suma1=suma1e/dble(nsuma)
      IF(nsuaa.ne.0)suma2=suma2e/dble(nsuaa)
c-----------------------------------------------------------------------
C---- RECALCULATE FIT FOR PERIODS APR 2-8,9-15 WITH EXTREMES REMOVED
c-----------------------------------------------------------------------
      DO i=kk,mm,12
       IF((Xhol(i).gt.TEN).and.(Xhol(i).lt.TWNTY5))THEN
        IF(Xhol(i).le.FOURTN)THEN
         sumd1=FOURTN-Xhol(i)
         Yhat(i)=suma1+sumd1*(summ-suma1)/FOUR
         Yhat(i+1)=TWOHND-Yhat(i)
        ELSE IF(Xhol(i).le.TWNTY1)THEN
         sumd2=TWNTY1-Xhol(i)
         Yhat(i)=suma2+sumd2*(suma1-suma2)/SEVEN
         Yhat(i+1)=TWOHND-Yhat(i)
        ELSE
         sumd3=TWNTY5-Xhol(i)
         Yhat(i)=suma+sumd3*(suma2-suma)/FOUR
         Yhat(i+1)=TWOHND-Yhat(i)
        END IF
       END IF
      END DO
c-----------------------------------------------------------------------
c     Compute seasonal component within easter effect for March.
c-----------------------------------------------------------------------
      smfac=ZERO
c      di=ZERO
      DO i=0,34
c       di=di+ONE
       IF(i.le.10)THEN
        mfac(i)=summ
       ELSE IF(i.gt.10.and.i.le.14)THEN
        sumd1=FOURTN-i
        mfac(i)=(suma1+sumd1*(summ-suma1)/FOUR)
       ELSE IF(i.gt.14.and.i.lt.21)THEN
        sumd2=TWNTY1-i
        mfac(i)=(suma2+sumd2*(suma1-suma2)/SEVEN)
       ELSE IF(i.ge.21.and.i.le.24)THEN
        sumd3=TWNTY5-i
        mfac(i)=(suma+sumd3*(suma2-suma)/FOUR)
       ELSE
        mfac(i)=suma
       END IF
       smfac=smfac+(mfreq(i)*mfac(i))
      END DO
c-----------------------------------------------------------------------
c     Divide out seasonal effect from March, April values.
c-----------------------------------------------------------------------
      DO i=kk,mm,12
       Yhat(i)=(Yhat(i)*ONEHND)/smfac
       Yhat(i+1)=(Yhat(i+1)*ONEHND)/(TWOHND-smfac)
      END DO
c-----------------------------------------------------------------------
      IF(Kh2.eq.0)RETURN
      IF(Xhol(Kh2).le.TEN)THEN
       Yhat(Kh2+1)=TWOHND-summ
      ELSE IF(Xhol(Kh2).gt.TEN.and.Xhol(Kh2).le.FOURTN)THEN
       sumd1=FOURTN-Xhol(Kh2)
       Yhat(Kh2+1)=TWOHND-(suma1+sumd1*(summ-suma1)/FOUR)
      ELSE IF(Xhol(Kh2).gt.FOURTN.and.Xhol(Kh2).le.TWNTY1)THEN
       sumd2=TWNTY1-Xhol(Kh2)
       Yhat(Kh2+1)=TWOHND-(suma2+sumd2*(suma1-suma2)/SEVEN)
      ELSE IF(Xhol(Kh2).gt.TWNTY1.and.Xhol(Kh2).le.TWNTY4)THEN
       sumd3=TWNTY5-Xhol(Kh2)
       Yhat(Kh2+1)=TWOHND-(suma+sumd3*(suma2-suma)/FOUR)
      ELSE
       Yhat(Kh2+1)=TWOHND-nsuma
      END IF
      Yhat(Kh2+1)=(Yhat(Kh2+1)*ONEHND)/(TWOHND-smfac)
c-----------------------------------------------------------------------
      RETURN
      END