30
31
32
33#include "implicit_f.inc"
34
35 INTEGER ,INTENT(INOUT) :: NPT
36 INTEGER ,INTENT(IN) :: NTARGET
37 my_real ,
DIMENSION(NPT) ,
INTENT(INOUT) :: x,y
38
39
40
41 INTEGER :: I,I0,I1,I2,IDX,IMIN,IPREV,INEXT,ITER,NITER,IZERO
43 INTEGER ,DIMENSION(NPT) :: PREV,NEXT
45
46
47
48
49
50 niter = npt - ntarget
51 IF (niter < 1) RETURN
52
53 prev(1) = 0
54 next(1) = 2
55 area(1) = infinity / ten
56 prev(npt) = npt - 1
57 next(npt) = 10000000
58 area(npt) = infinity / ten
59
60 DO i = 2,npt-1
61 i1 = i-1
62 i2 = i+1
63 prev(i) = i1
64 next(i) = i2
65 IF (x(i) == zero .and. y(i) == zero) THEN
66 area(i) = infinity / ten
67 ELSE
68 area(i) = x(i1)*y(i) + x(i)*y(i2) + x(i2)*y(i1)
69 . - x(i1)*y(i2) - x(i)*y(i1) - x(i2)*y(i)
71 END IF
72 END DO
73
74
75
76 imin = 1
77 DO iter = 1,niter
78 amin = infinity
79 idx = 1
80 DO i=1,npt
81 IF (
area(i) < amin)
THEN
83 imin = i
84 ENDIF
85 END DO
86
87 iprev = prev(imin)
88 inext = next(imin)
89 next(iprev) = inext
90 prev(inext) = iprev
92
93
94 i0 = iprev
95 i1 = prev(iprev)
96 i2 = inext
97 IF (i1 > 0) THEN
98 aa = x(i0)*y(i0) + x(i0)*y(i2) + x(i2)*y(i1)
99 . - x(i0)*y(i2) - x(i0)*y(i1) - x(i2)*y(i0)
101 END IF
102
103
104 i0 = inext
105 i1 = iprev
106 i2 = next(inext)
107 IF (i2 < npt) THEN
108 aa = x(i0)*y(i0) + x(i0)*y(i2) + x(i2)*y(i1
109 . - x(i0)*y(i2) - x(i0)*y(i1) - x(i2)*y(i0)
111 END IF
112 END DO
113
114 idx = 0
115 DO i=1,npt
116 IF (
area(i) < infinity)
THEN
117 idx = idx + 1
118 x(idx) = x(i)
119 y(idx) = y(i)
120 END IF
121 END DO
122 npt = 0
123 izero = 0
124 DO i = 1,idx
125 s = x(i)
126 t = y(i)
127 IF (s < zero .and. t > zero .or.
128 . s > zero .and. t < zero .or.
129 . s == zero .and. t /= zero) THEN
130 IF (izero == 1) CONTINUE
131 s = zero
132 t = zero
133 izero = 1
134 ELSE IF (s < zero .and. t < zero .and.
135 . x(i+1) > zero .and. y(i+1) > zero) THEN
136
137
138 IF (izero == 1) CONTINUE
139 s = zero
140 t = zero
141 izero = 1
142 END IF
143 npt = npt + 1
144 x(npt) = s
145 y(npt) = t
146 END DO
147
148 RETURN
subroutine area(d1, x, x2, y, y2, eint, stif0)