34
35
36
37
39
40
41
42#include "implicit_f.inc"
43
44
45
46#include "mvsiz_p.inc"
47
48
49
50 INTEGER JLT, NRTS,IGAP
51 INTEGER IRECTS(2,*), IRECTM(2,*),CAND_S(*),(*)
53 . gapmin,marge
55 . x(3,*), pene(mvsiz),
56 . gap_s(*), gap_m(*), gap_s_l(*), gap_m_l(*)
57 my_real ,
INTENT(IN) :: dgapload,drad
58
59
60
61 INTEGER I, IG,N1,N2,M1,M2,NI,L,J
63 . xs12,ys12,zs12,xm12,ym12,zm12,xa,xb,
64 . xs2,xm2,xsm,xs2m2,ys2,ym2,ysm,ys2m2,zs2,zm2,zsm,zs2m2,
65 . xx,yy,zz,als,alm,det,
66 . gap2, x11, x12, x13, x21, x22, x23,
67 . xmax1,ymax1,zmax1,xmax2,ymax2,zmax2,
68 . xmin1,ymin1,zmin1,xmin2,ymin2,zmin2,dd,gapv(mvsiz)
70
71 IF(igap==0)THEN
72 DO i=1,jlt
73 gapv(i)=
max(drad,gapmin+dgapload)+marge
74 ENDDO
75 ELSE
76 DO i=1,jlt
77 l = cand_s(i)
78 IF( l <= nrts) THEN
79 gapv(i)=gap_s(l)+gap_m(cand_m(i))
80 IF(igap == 3)
81 . gapv(i)=
min(gap_s_l(l)+gap_m_l(cand_m(i)),gapv(i))
82 gapv(i)=
max(drad,
max(gapmin,gapv(i))+dgapload)+marge
83 ELSE
84 gapv(i)=xrem(16,l-nrts )+gap_m(cand_m(i))
85 IF(igap == 3)
86 . gapv(i)=
min(xrem(17,l-nrts)+gap_m_l(cand_m(i)),gapv(i))
87 gapv(i)=
max(drad,
max(gapmin,gapv(i))+dgapload)+marge
88 ENDIF
89 ENDDO
90 ENDIF
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 DO i=1,jlt
128 l = cand_s(i)
129 IF(l<=nrts) THEN
130 ni=0
131 n1=irects(1,cand_s(i))
132 n2=irects(2,cand_s(i))
133 x11 = x(1,n1)
134 x12 = x(2,n1)
135 x13 = x(3,n1)
136 x21 = x(1,n2)
137 x22 = x(2,n2)
138 x23 = x(3,n2)
139 ELSE
140 ni = l - nrts
141 x11 = xrem(1,ni)
142 x12 = xrem(2,ni)
143 x13 = xrem(3,ni)
144 x21 = xrem(8,ni)
145 x22 = xrem(9,ni)
146 x23 = xrem(10,ni)
147 END IF
148 m1=irectm(1,cand_m(i))
149 m2=irectm(2,cand_m(i))
150
151
152
153
157 xmax2 =
max(x(1,m1),x(1,m2))
158 ymax2 =
max(x(2,m1),x(2,m2))
159 zmax2 =
max(x(3,m1),x(3,m2))
163 xmin2 =
min(x(1,m1),x(1,m2))
164 ymin2 =
min(x(2,m1),x(2,m2))
165 zmin2 =
min(x(3,m1),x(3,m2))
166 dd =
max(xmin1-xmax2,ymin1-ymax2,zmin1-zmax2,
167 . xmin2-xmax1,ymin2-ymax1,zmin2-zmax1)
168 IF(dd > gapv(i))THEN
169 pene(i) = zero
170 cycle
171 ENDIF
172
173
174
175 xs12 = x21-x11
176 ys12 = x22-x12
177 zs12 = x23-x13
178 xs2m2 = x(1,m2)-x21
179 ys2m2 = x(2,m2)-x22
180 zs2m2 = x(3,m2)-x23
181 xs2 = xs12*xs12 + ys12*ys12 + zs12*zs12
182 xm12 = x(1,m2)-x(1,m1)
183 ym12 = x(2,m2)-x(2,m1)
184 zm12 = x(3,m2)-x(3,m1)
185 xm2 = xm12*xm12 + ym12*ym12 + zm12*zm12
186 xsm = - (xs12*xm12 + ys12*ym12 + zs12*zm12)
187 xa = xs12*xs2m2 + ys12*ys2m2 + zs12*zs2m2
188 xb = -xm12*xs2m2 - ym12*ys2m2 - zm12*zs2m2
189 det = xm2*xs2 - xsm*xsm
191
192 alm = (xa*xsm-xb*xs2) / det
195 alm=
min(one,
max(zero,alm))
196 als = -(xa + alm*xsm) / xs2
197 als=
min(one,
max(zero,als))
198 alm = -(xb + als*xsm) / xm2
199 alm=
min(one,
max(zero,alm))
200
201
202
203 xx = als*x11 + (one-als)*x21
204 . - alm*x(1,m1) - (one-alm)*x(1,m2)
205 yy = als*x12 + (one-als)*x22
206 . - alm*x(2,m1) - (one-alm)*x(2,m2)
207 zz = als*x13 + (one-als)*x23
208 . - alm*x(3,m1) - (one-alm)*x(3,m2)
209 gap2=gapv(i)*gapv(i)
210 pene(i) = gap2- xx*xx - yy*yy - zz*zz
211
212 END DO
213
214
215
216 RETURN