source: PSPA/parmelaPSPA/trunk/gpindp.f @ 315

Last change on this file since 315 was 12, checked in by lemeur, 12 years ago

parmela pspa initial

File size: 12.0 KB
Line 
1c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
2      DOUBLE PRECISION FUNCTION GPINDP(A,B,EPSIN,EPSOUT,FUNC,IOP)
3C     from cernlib
4C     PARAMETERS
5C
6C     A       = LOWER BOUNDARY
7C     B       = UPPER BOUNDARY
8C     EPSIN   = ACCURACY REQUIRED FOR THE APPROXINATION
9C     EPSOUT  = IMPROVED ERROR ESTIMATE FOR THE APPROXIMATION
10C     FUNC    = FUNCTION ROUTINE FOR THE FUNCTION FUNC(X).TO BE DE-
11C               CLARED EXTERNAL IN THE CALLING ROUTINE
12C     IOP     = OPTION PARAMETER , IOP=1 , MODIFIED ROMBERG ALGORITHM,
13C                                          ORDINARY CASE
14C                                  IOP=2 , MODIFIED ROMBERG ALGORITHM,
15C                                          COSINE TRANSFORMED CASE
16C                                  IOP=3 , MODIFIED CLENSHAW-CURTIS AL
17C                                          GORITHM
18C
19C     PARAMETERS IN COMMON BLOCK / GPINT /
20C
21C     TEND    = UPPER BOUND FOR VALUE OF INTEGRAL
22C     UMID    = LOWER BOUND FOR VALUE OF INTEGRALC
23C     N       = THE NUMBER OF INTEGRAND VALUES USED IN THE CALCULATION
24C     LINE    = LINE NO IN ROMBERG TABLE (RELATED TO N THROUGH
25C               N-1=2**(LINE-1) , APPLICABLE ONLY FOR IOP=1 OR 2)
26C     IOUT    = ELEMENT NO IN LINE (APPLICABLE ONLY FOR IOP=1 OR 2)
27C     JOP     = OPTION PARAMETER , JOP=0 , NO PRINTING OF INTERMEDIATE
28C                                          CALCULATIONS
29C                                  JOP=1 , PRINT INTERMEDIATE CALCULA-
30C                                          TIONS
31C     KOP     = OPTION PARAMETER , KOP=0 , NO TIME ESTIMATE
32C                                  KOP=1 , ESTIMATE TIME
33C     T       = TIME USED FOR CALCULATION IN MSEC.
34C
35C     INTEGRATION PARAMETERS
36C
37C     NUPPER  = 9 , CORRESPONDS TO 1024 SUB-INTERVALS FOR THE UNFOLDED
38C               INTEGRAL.THE MAX.NO OF FUNCTION EVALUATIONS THUS BEEING
39C               1025.THE HIGHEST END-POINT APPROXIMATION IS THUS USING
40C               1024 INTERVALS WHILE THE HIGHEST MID-POINT APPROXIMA-
41C               TION IS USING 512 INTERVALS.
42C
43C     INPUT/OUTPUT PARAMETERS
44C
45      EXTERNAL FUNC
46      DOUBLE PRECISION A,B,EPSIN,EPSOUT,BOUND,FUNC
47C
48C     INTERNAL ARRAYS
49C
50      DOUBLE PRECISION ACOF(513),BCOF(513),CCOF(1025)
51C
52C     CONSTANTS IN DATA STATEMENTS
53C
54C*NS  DOUBLE PRECISION ZERO,FOURTH,HALF,ONE,TWO,THREE,FOUR,FAC1,FAC2,PI,
55C*NS 1RANDER
56      DOUBLE PRECISION ZERO,FOURTH,HALF,ONE,TWO,      FOUR,FAC1,FAC2,PI
57C
58C     VARIABLES DEPENDING ON STEPSIZE
59C
60      DOUBLE PRECISION ALF,BET,RN,HNSTEP,TEND,UMID,WMEAN,DELN,TNEW,AR
61C
62C     CONSTANTS RELATED TO CALCULATION OF TRIGONOMETRIC FUNCTIONS
63C
64      DOUBLE PRECISION TRIARG,ALFN0,BETN0,GAMMAN,DELTAN,ALFNJ,BETNJ,ETAN
65     1K,KSINK
66C
67C     OTHER VARIABLES USED
68C
69C*NS  DOUBLE PRECISION CONST1,CONST2,XPLUS,XMIN,ERROR,RK,A0,A1,A2,COF,FA
70C*NS 1CTOR,ENDPTS
71      DOUBLE PRECISION CONST1,CONST2,XPLUS,XMIN,      RK,A0,A1,A2,COF,FA
72     1CTOR,ENDPTS
73C
74      COMMON /GPINT/ TEND, UMID, N, LINE, IOUT, JOP, KOP, T
75      DATA ZERO,FOURTH,HALF,ONE,TWO,FOUR/0.D0,.25D0,.5D0,1.D0,2.D0,4.D0/
76      DATA PI,FAC1,FAC2/3.141592653589793238462643383279D0,.411233516712
77     1056609118103791649D0,.822467033424113218236207583298D0/
78C
79      DATA NUPPER/9/
80C
81C     TIMEX(T) IS A LIBRARY SUBROUTINE GIVING THE ELAPSED CP TIME
82C
83      IF(KOP .NE. 0)  T=1000.*T
84C
85C     INITIAL CALCULATIONS
86C
87      ALF=HALF*(B-A)
88      BET=HALF*(B+A)
89      CONST1=FUNC(A)+FUNC(B)
90      CONST2=FUNC(BET)
91      HNSTEP=TWO
92      IF(IOP.EQ.2) HNSTEP=PI
93C
94      IF(IOP.GT.1) GOTO 10
95C
96C     MODIFIED ROMBERG ALGORITHM,ORDINARY CASE
97C
98      BCOF(1)=HNSTEP*CONST2
99      ACOF(1)=HALF*(CONST1+BCOF(1))
100      FACTOR=ONE
101      ACOF(2)=ACOF(1)-(ACOF(1)-BCOF(1))/(FOUR*FACTOR-ONE)
102      GOTO 30
103C
10410    IF(IOP.GT.2) GOTO 20
105C
106C     MODIFIED ROMBERG ALGORITHM,COSINE TRANSFORMED CASE
107C
108      AR=FAC1
109      ENDPTS=CONST1
110      ACOF(1)=FAC2*CONST1
111      BCOF(1)=HNSTEP*CONST2-AR*CONST1
112      FACTOR=FOUR
113      ACOF(1)=HALF*(ACOF(1)+BCOF(1))
114      ACOF(2)=ACOF(1)-(ACOF(1)-BCOF(1))/(FOUR*FACTOR-ONE)
115      AR=FOURTH*AR
116      GOTO 30
117C
11820    CONST1=HALF*CONST1
119      ACOF(1)=HALF*(CONST1+CONST2)
120      ACOF(2)=HALF*(CONST1-CONST2)
121      BCOF(2)=ACOF(2)
122      TEND=TWO*(ACOF(1)-ACOF(2)/(ONE+TWO))
123C
124C     MODIFIED CLENSHAW-CURTIS ALGORITHM
125C
12630    HNSTEP=HALF*HNSTEP
127      NHALF=1
128      N=2
129      RN=TWO
130C
131      IF(IOP.NE.1) THEN
132C
133C     INITIAL PARAMETERS SPECIAL FOR THE MODIFIED ROMBERG ALGORITHM,
134C     COSINE TRANSFORMED CASE AND THE MODIFIED CLENSHAW-CURTIS ALGORITHM
135C
136        TRIARG=FOURTH*PI
137        ALFN0=-ONE
138      ENDIF
139C
140C     END OF INITIAL CALCULATIONS
141C
142C     START ACTUAL CALCULATION
143C
144C---  Transform this DO-loop into a GOTO to avoid illegal jumps into it
145C
146C     DO 350 I=1,NUPPER
147      I=0
14841    I=I+1
149      IF(I.GT.NUPPER) GOTO 350
150      LINE=I+2
151C
152      IF(IOP.GT.1) GOTO 60
153C
154C     MODIFIED ROMBERG ALGORITHM,ORDINARY CASE
155C
156C     COMPUTE FIRST ELEMENT IN MID-POINT FORMULA FOR ORDINARY CASE
157C
158      UMID=ZERO
159      ALFNJ=HALF*HNSTEP
160      DO 50 J=1,NHALF
161      XPLUS=ALF*ALFNJ+BET
162      XMIN=-ALF*ALFNJ+BET
163      UMID=UMID+FUNC(XPLUS)+FUNC(XMIN)
164      ALFNJ=ALFNJ+HNSTEP
16550    CONTINUE
166      UMID=HNSTEP*UMID
167      GOTO 100
168C
169C     COMPUTE FUNCTION VALUES FOR MODIFIED ROMBERG ALGORITHM,COSINE
170C     TRANSFORMED CASE AND MODIFIED CLENSHAW-CURTIS ALGORITHM
171C
17260    CONST1=-SIN(TRIARG)
173      CONST2=HALF*ALFN0/CONST1
174      IF(IOP.EQ.2) ETANK=CONST2
175      ALFN0=CONST1
176      BETN0=CONST2
177      GAMMAN=ONE-TWO*ALFN0**2
178      DELTAN=-TWO*ALFN0*BETN0
179C
180      DO 70 J=1,NHALF
181      ALFNJ=GAMMAN*CONST1+DELTAN*CONST2
182      BETNJ=GAMMAN*CONST2-DELTAN*CONST1
183      XPLUS=ALF*ALFNJ+BET
184      XMIN=-ALF*ALFNJ+BET
185      CCOF(J)=FUNC(XPLUS)+FUNC(XMIN)
186      CONST1=ALFNJ
187      CONST2=BETNJ
18870    CONTINUE
189C
190      IF(IOP.EQ.3) GOTO 190
191C
192C     COMPUTE FIRST ELEMENT IN MID-POINT FORMULA FOR COSINE TRANSFORMED
193C     ROMBERG ALGORITHM
194C
195      NCOF=NHALF-1
196      COF=TWO*(TWO*ETANK**2-ONE)
197      A2=ZERO
198      A1=ZERO
199      A0=CCOF(NHALF)
200      IF(NCOF.EQ.0) GOTO 90
201      DO 80 J=1,NCOF
202      A2=A1
203      A1=A0
204      INDEX=NHALF-J
205      A0=CCOF(INDEX)+COF*A1-A2
20680    CONTINUE
20790    UMID=HNSTEP*(A0-A1)*ETANK-AR*ENDPTS
208      AR=FOURTH*AR
209C
210C     MODIFIED ROMBERG ALGORITHM,CALCULATE (I+1)-TH ROW IN U-TABLE
211C
212100   CONST1=FOUR*FACTOR
213      INDEX=I+1
214      DO 110 J=2,INDEX
215      TEND=UMID+(UMID-BCOF(J-1))/(CONST1-ONE)
216      BCOF(J-1)=UMID
217      UMID=TEND
218      CONST1=FOUR*CONST1
219110   CONTINUE
220      BCOF(INDEX)=TEND
221      XPLUS=CONST1
222C
223C     CALCULATION OF (I+1)-TH ROW IN U-TABLE FINISHED
224C
225C     PRINT INTERMEDIATE RESULTS IF WANTED
226C
227      IF(JOP.EQ.0) GOTO 120
228C
229      ICHECK=0
230      ASSIGN 120 TO JUMP
231      GOTO 360
232C
233C     TEST IF REQUIRED ACCURACY IS OBTAINED
234C
235120   EPSOUT=ONE
236      IOUT=1
237      DO 140 J=1,INDEX
238      CONST1=HALF*(ACOF(J)+BCOF(J))
239      CONST2=HALF*ABS((ACOF(J)-BCOF(J))/CONST1)
240      IF(CONST2.GT.EPSOUT) GOTO 130
241      EPSOUT=CONST2
242      IOUT=J
243130   ACOF(J)=CONST1
244140   CONTINUE
245C
246C     TESTING ON ACCURACY FINISHED
247C
248      IF(IOUT.EQ.INDEX) IOUT=IOUT+1
249      ACOF(INDEX+1)=ACOF(INDEX)-(ACOF(INDEX)-BCOF(INDEX))/(XPLUS-ONE)
250C
251      IF(EPSOUT.GT.EPSIN) GOTO 340
252C
253C     CALCULATION FOR MODIFIED ROMBERG ALGORITHM FINISHED
254C
255150   N=2*N
256C
257C     PRINT INTERMEDIATE RESULTS IF WANTED
258C
259      IF(JOP.EQ.0) GOTO 170
260C
261      ICHECK=1
262      INDEX=INDEX+1
263      ASSIGN 160 TO JUMP
264      GOTO 360
265C
266160   INDEX=INDEX-1
267C
268170   N=N+1
269      J=IOUT
270      IF((J-1).LT.INDEX) GOTO 180
271      J=INDEX
272180   TEND=ALF*(TWO*ACOF(J)-BCOF(J))
273      UMID=ALF*BCOF(J)
274      GPINDP=ALF*ACOF(IOUT)
275C
276      GOTO 310
277C
278C     START CALCULATION FOR MODIFIED CLENSHAW-CURTIS ALGORITHM
279C
280190   BCOF(1)=ZERO
281      DO 200 J=1,NHALF
282      BCOF(1)=BCOF(1)+CCOF(J)
283200   CONTINUE
284      BCOF(1)=HALF*HNSTEP*BCOF(1)
285C
286C     CALCULATION OF FIRST B-COEFFICIENT FINISHED.COMPUTE THE HIGHER
287C     COEFFICIENTS IF NHALF GREATER THAN ONE
288C
289      IF(NHALF.EQ.1) GOTO 230
290C
291      CONST1=ONE
292      CONST2=ZERO
293      NCOF=NHALF-1
294      KSIGN=-1
295      DO 220 K=1,NCOF
296C
297C     COMPUTE TRIGONOMETRIC SUM FOR B-COEFFICIENT
298C
299      ETANK=GAMMAN*CONST1-DELTAN*CONST2
300      KSINK=GAMMAN*CONST2+DELTAN*CONST1
301      COF=TWO*(TWO*ETANK**2-ONE)
302      A2=ZERO
303      A1=ZERO
304      A0=CCOF(NHALF)
305      DO 210 J=1,NCOF
306      A2=A1
307      A1=A0
308      INDEX=NHALF-J
309      A0=CCOF(INDEX)+COF*A1-A2
310210   CONTINUE
311C
312      BCOF(K+1)=HNSTEP*(A0-A1)*ETANK
313      IF(KSIGN.EQ.-1) BCOF(K+1)=-BCOF(K+1)
314      KSIGN=-KSIGN
315C
316      CONST1=ETANK
317      CONST2=KSINK
318C
319220   CONTINUE
320C
321C     CALCULATION OF B-COEFFICIENTS FINISHED
322C
323C     COMPUTE NEW MODIFIED MID-POINT APPROXIMATION WHEN THE INTERVAL
324C     OF INTEGRATION IS DIVIDED IN N EQUAL SUB INTERVALS
325C
326230   UMID=ZERO
327      RK=RN
328      NN=NHALF+1
329      DO 240 K=1,NN
330      INDEX=NN+1-K
331      UMID=UMID+BCOF(INDEX)/(RK**2-ONE)
332      RK=RK-TWO
333240   CONTINUE
334      UMID=-TWO*UMID
335C
336C     COMPUTE NEW C-COEFFICIENTS FOR END-POINT APPROXIMATION
337C
338      NN=N+2
339      DO 250 J=1,NHALF
340      INDEX=NN-J
341      CCOF(J)=HALF*(ACOF(J)+BCOF(J))
342      CCOF(INDEX)=HALF*(ACOF(J)-BCOF(J))
343250   CONTINUE
344      INDEX=NHALF+1
345      CCOF(INDEX)=ACOF(INDEX)
346C
347C     CALCULATION OF NEW COEFFICIENTS FINISHED
348C
349C     COMPUTE NEW END-POINT APPROXIMATION WHEN THE INTERVAL OF INTEGRA-
350C     TION IS DIVIDED IN 2N EQUAL SUB INTERVALS
351C
352      WMEAN=HALF*(TEND+UMID)
353      BOUND=HALF*(TEND-UMID)
354C
355      DELN=ZERO
356      RK=TWO*RN
357      DO 260 J=1,NHALF
358      INDEX=N+2-J
359      DELN=DELN+CCOF(INDEX)/(RK**2-ONE)
360      RK=RK-TWO
361260   CONTINUE
362      DELN=-TWO*DELN
363C
364C     PRINT INTERMEDIATE RESULTS IF WANTED
365C
366      IF(JOP.EQ.0) GOTO 270
367C
368      GOTO 400
369C
370C     PRINTING OF INTERMEDIATE RESULTS FINISHED
371C
372270   TNEW=WMEAN+DELN
373      EPSOUT=ABS(BOUND/TNEW)
374C
375      IF(EPSOUT.GT.EPSIN) GOTO 320
376C
377C     REQUIRED ACCURACY OBTAINED
378C
379280   N=2*N+1
380C
381C*UL 290   TEND=ALF*(TEND+DELN)
382      TEND=ALF*(TEND+DELN)
383      UMID=ALF*(UMID+DELN)
384C
385C*UL 300   GPINDP=ALF*TNEW
386      GPINDP=ALF*TNEW
387C
388310   IF(KOP.EQ.0) GOTO 315
389c      CALL TIMEX ( T)
390      T=1000.*T
391C
392 315  RETURN
393C
394320   DO 330 J=1,N
395      ACOF(J)=CCOF(J)
396330   CONTINUE
397      ACOF(N+1)=CCOF(N+1)
398      BCOF(N+1)=CCOF(N+1)
399      TEND=TNEW
400C
401340   NHALF=N
402      N=2*N
403      RN=TWO*RN
404      HNSTEP=HALF*HNSTEP
405      IF(IOP.GT.1) TRIARG=HALF*TRIARG
406C
407      GOTO 41
408350   CONTINUE
409C
410C     REQUIRED ACCURACY OF INTEGRAL NOT OBTAINED
411C
412      N=NHALF
413      RN=HALF*RN
414C
415      IF(IOP.LT.3) GOTO 150
416C
417      TEND=TWO*(TNEW-DELN)-UMID
418C
419      GOTO 280
420C     PRINT INTERMEDIATE RESULTS FOR THE MODIFIED ROMBERG ALGORITHM
421C
422360   IF((N.NE.2).AND.(N.NE.256)) GOTO 370
423      IF(N.EQ.256) WRITE(6,460)
424      WRITE(6,420)
425370   DO 390 J=1,INDEX
426      CONST1=ALF*ACOF(J)
427      IF(ICHECK.EQ.1) GOTO 380
428      CONST2=ALF*BCOF(J)
429      IF(J.EQ.1) WRITE(6,430) N,J,CONST1,CONST2
430      IF(J.GT.1) WRITE(6,440) J,CONST1,CONST2
431      GOTO 390
432C
433380   IF(J.EQ.1) WRITE(6,430) N,J,CONST1
434      IF(J.GT.1) WRITE(6,440) J,CONST1
435390   CONTINUE
436      GOTO JUMP,(120,160)
437C
438C     PRINTING FINISHED FOR THE MODIFIED ROMBERG ALGORITHM
439C
440C     PRINT INTERMEDIATE RESULTS FOR THE MODIFIED CLENSHAW-CURTIS AL-
441C     GORITHM
442C
443400   A0=ALF*TEND
444      A1=ALF*WMEAN
445      A2=ALF*UMID
446      CONST1=ALF*BOUND
447      CONST2=ALF*DELN
448C
449      IF(N.GT.2) GOTO 410
450C
451      WRITE(6,470)
452410   WRITE(6,480) N,A0
453      WRITE(6,490) A1,CONST2,CONST1
454      WRITE(6,490) A2
455      GOTO 270
456C
457C     PRINTING FINISHED FOR THE MODIFIED CLENSHAW-CURTIS ALGORITHM
458C
459420   FORMAT(/,8X,'N',3X,'J',19X,'TEND(J)',34X,'UMID(J)',/)
460430   FORMAT(5X,I4,2X,I2,4X,D36.29,5X,D36.29)
461440   FORMAT(11X,I2,4X,D36.29,5X,D36.29)
462450   FORMAT(/)
463460   FORMAT('1'////)
464470   FORMAT(6X,'N',17X,'TEND  ',/,20X,'(TEND+UMID)/2',28X,'DELN',34X,
465     1 '(TEND-UMID)/2'/24X,'UMID')
466480   FORMAT(/,4X,I3,2X,D36.29)
467490   FORMAT(9X,D36.29,3X,D36.29,3X,D36.29)
468      END
469c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
Note: See TracBrowser for help on using the repository browser.