40
41
42
43
46
47
48
49#include "implicit_f.inc"
50#include "comlock.inc"
51
52
53
54#include "mvsiz_p.inc"
55
56
57
58 INTEGER, INTENT(IN) :: S_STFM, S_STFE,IFQ
59 INTEGER IRECT(4,*),CAND_M(*), CAND_S(*),
60 . I_STOK, NIN,IGAP ,ITASK, COUNT_REMSLVE(*),
61 . IEDGE, , IGAP0, LEDGE(NLEDGE,*), MVOISIN(4,*), NSV(*),
62 . IFPEN(*)
63 my_real ,
INTENT(IN) :: dgapload ,drad
65 . x(3,*),gape(*),v(3,*),stf(s_stfm),gap_e_l(*), stfe(s_stfe),
66 . cand_fx(*),cand_fy(*),cand_fz(*)
67
68
69
70#include "task_c.inc"
71#include "com01_c.inc"
72#include "param_c.inc"
73#include "parit_c.inc"
74#include "i25edge_c.inc"
75#include "assert.inc"
76
77
78
79 INTEGER I , L, E, IE, JE, NN1, NN2, IL, JL, I1, I2, SOL_EDGE, SH_EDGE, SHFT_EDGE
81 . xi,x1,x2,x3,x4,yi,y1,y2,y3,y4,zi,z1,z2,z3,z4,
82 . xmins,xmaxs,ymins,ymaxs,zmins,zmaxs,
83 . xminm,xmaxm,yminm,ymaxm,zminm,zmaxm,
84 . v12,v22,v32,v42,vv,gapvd
85 INTEGER MSEG,CT
87 . gapv(mvsiz),dtti(mvsiz),s
88 INTEGER LIST(MVSIZ), LISTI(MVSIZ)
89 INTEGER IS,JS,LS,NLS,NLT,NSEG,NLF,II,NLS2
90 INTEGER N1,N2,M1,M2
91 INTEGER SG, , LAST,COUNT_CAND
92
93
94 INTEGER EID
95
96
97 sol_edge=iedge/10
98 sh_edge =iedge-10*sol_edge
99
100 count_cand = 0
101 ct = 0
102 mseg = nvsiz
103 first = 1 + i_stok*itask / nthread
104 last = i_stok*(itask+1) / nthread
105
106 js = first-1
107 DO sg = first,last,mseg
108 nseg =
min(mseg,last-js)
109 nls=0
110 IF(nspmd>1) THEN
111
112
113
114 nls = 0
115 nls2 = nseg+1
116 DO is = 1, nseg
117
118 i=js+is
119
120 IF(sh_edge==1.AND.ledge(3,cand_m(i))/=0) cycle
121
122 IF(cand_s(i)<=nedge)THEN
123
124 IF(sh_edge==1.AND.ledge(3,cand_s(i))/=0) cycle
125
126 IF(sh_edge==3 .AND.
127 . ledge(3,cand_m(i))/=0 .AND.
128 . ledge(3,cand_s(i))/=0) cycle
129
130 debug_e2e(ledge(8,cand_m(i)) == d_em .AND. ledge(8,cand_s(i)) == d_es,stfe(cand_s(i)))
131 debug_e2e(ledge(8,cand_m(i)) == d_em .AND. ledge(8,cand_s(i)) == d_es,cand_s(i))
132
133 nls=nls+1
134 listi(nls)=is
135 ELSE
136
137 IF(sh_edge==1.AND.
ledge_fie(nin)%P(e_right_seg,cand_s(i)-nedge)/=0) cycle
138
139
140 IF(sh_edge==3 .AND.
141 . ledge(3,cand_m(i))/=0 .AND.
142 .
ledge_fie(nin)%P(e_right_seg,cand_s(i)-nedge)/=0) cycle
143 debug_e2e(ledge(8,cand_m(i))==d_em.AND.
ledge_fie(nin)%P(1,cand_s(i)-nedge)==d_es,
stifie(nin)%P(cand_s(i)-nedge))
144
145 nls2=nls2-1
146 assert(is <= mvsiz)
147 assert(is > 0)
148 listi(nls2) = is
149 ENDIF
150 ENDDO
151
152 DO ls = 1, nls
153 is = listi(ls)
154 i=js+is
155
156 ie=cand_m(i)
157 je=cand_s(i)
158
159 IF(igap0 == 0) THEN
160 gapv(is)=two*gape(ie)+gape(je)
161 ELSE
162 gapv(is)=two*(gape(ie)+gape(je))
163 END IF
164
165 IF(igap==3)
166 . gapv(is)=
min(gapv(is),gap_e_l(ie)+gap_e_l(je))
167
168 ENDDO
169
170 ELSE
171 nls = 0
172 DO is=1,nseg
173
174 i=js+is
175
176
177 IF(sh_edge==1.AND.ledge(3,cand_m(i))/=0) cycle
178
179 IF(sh_edge==1.AND.ledge(3,cand_s(i))/=0) cycle
180
181 IF(sh_edge==3 .AND.
182 . ledge(3,cand_m(i))/=0 .AND.
183 . ledge(3,cand_s(i))/=0) cycle
184
185 eid = ledge(8,cand_s(i))
186 debug_e2e(ledge(8,cand_m(i)) == d_em .AND.ledge(8,cand_s(i))==d_es,stfe(cand_s(i)))
187 debug_e2e(ledge(8,cand_m(i)) == d_em .AND. ledge(8,cand_s(i)) == d_es,cand_s(i))
188
189 nls=nls+1
190 listi(nls)=is
191 ENDDO
192
193 DO ls = 1, nls
194 is = listi(ls)
195 i=js+is
196
197 ie=cand_m(i)
198 je=cand_s(i)
199
200 IF(igap0 == 0) THEN
201 gapv(is)=two*gape(ie)+gape(je)
202 ELSE
203 gapv(is)=two*(gape(ie)+gape(je))
204 END IF
205
206 IF(igap==3)
207 . gapv(is)=
min(gapv(is),gap_e_l(ie)+gap_e_l(je))
208 ENDDO
209 ENDIF
210
211
212 nlf = 1
213 nlt = nls
214 nls=0
215 DO ls = nlf, nlt
216 is = listi(ls)
217 i=js+is
218 l = ledge(1,cand_s(i))
219 s = zero
220 IF( l > 0 ) THEN
221 s = stfe(cand_s(i))
222 ELSE IF(l < 0) THEN
223 s = one
224 ENDIF
225 IF (s/=zero) THEN
226 n1= ledge(5,cand_s(i))
227 z1=x(3,n1)
228 n2= ledge(6,cand_s(i))
229 z2=x(3,n2)
230 l = ledge(1,cand_m(i))
231 s = zero
232 IF( l > 0 ) THEN
233 s = stf(l)
234 ELSEIF(l < 0) THEN
235 s = zero
236 ENDIF
237 IF (s/=zero) THEN
238 m1= ledge(5,cand_m(i))
239 z3=x(3,m1)
240 m2= ledge(6,cand_m(i))
241 z4=x(3,m2)
242 gapvd =
max(gapv(is),drad)
243 zmins =
min(z1,z2)-gapvd
244
245 zminm =
min(z3,z4)-gapvd
246 zmaxm =
max(z3,z4)+gapvd
247 IF (zmaxs>=zminm.AND.zmaxm>=zmins) THEN
248 nls=nls+1
249 list(nls)=is
250 ENDIF
251 ENDIF
252 ENDIF
253 ENDDO
254
255 nlt=nls
256 nls=0
257 DO ls=nlf,nlt
258 is=list(ls)
259 i=js+is
260 n1= ledge(5,cand_s(i))
261 y1=x(2,n1)
262 n2= ledge(6,cand_s(i))
263 y2=x(2,n2)
264 m1= ledge(5,cand_m(i))
265 y3=x(2,m1)
266 m2= ledge(6,cand_m(i))
267 y4=x(2,m2)
268 gapvd =
max(gapv(is),drad)
269 ymins =
min(y1,y2)-gapvd
270 ymaxs =
max(y1,y2)+gapvd
271 yminm =
min(y3,y4)-gapvd
272 ymaxm =
max(y3,y4)+gapvd
273 IF (ymaxs>=yminm.AND.ymaxm>=ymins) THEN
274 nls=nls+1
275 list(nls)=is
276 ENDIF
277 ENDDO
278
279 DO ls=nlf,nls
280 is=list(ls)
281 i=js+is
282 n1= ledge(5,cand_s(i))
283 x1=x(1,n1)
284 n2= ledge(6,cand_s(i))
285 x2=x(1,n2)
286 m1= ledge(5,cand_m(i))
287 x3=x(1,m1)
288 m2= ledge(6,cand_m(i))
289 x4=x(1,m2)
290 gapvd =
max(gapv(is)+dgapload,drad)
291 xmins =
min(x1,x2)-gapvd
292 xmaxs =
max(x1,x2)+gapvd
293 xminm =
min(x3,x4)-gapvd
294 xmaxm =
max(x3,x4)+gapvd
295 IF (xmaxs>=xminm.AND.xmaxm>=xmins) THEN
296 cand_s(i) = -cand_s(i)
297 count_cand = count_cand+1
298 ENDIF
299 ENDDO
300
301 IF(nspmd>1)THEN
302
303 nlf = nls2
304 nlt = nseg
305 DO ls = nlf, nlt
306 is = listi(ls)
307 i=js+is
308 ie=cand_m(i)
309 IF(igap0 == 0) THEN
310 gapv(is)=two*gape(ie)+
gapfie(nin)%P(cand_s(i)-nedge)
311 ELSE
312 gapv(is)=two*(gape(ie)+
gapfie(nin)%P(cand_s(i)-nedge))
313 END IF
314
315 IF(igap==3)
316 . gapv(is)=
min(gapv(is),
gape_l_fie(nin)%P(cand_s(i)-nedge)+gap_e_l(ie))
317
318 ENDDO
319
320 nls=0
321 DO ls = nlf, nlt
322
323 is = listi(ls)
324 i=js+is
325 ii = cand_s(i)-nedge
326 assert(ii > 0)
327 assert(is > 0)
328 assert(is <= mvsiz)
329
330
331 IF (
stifie(nin)%P(ii)/=zero)
THEN
332 nn1 = 2*(ii-1)+1
333 nn2 = 2*ii
334 z1=
xfie(nin)%P(3,nn1)
335 z2=
xfie(nin)%P(3,nn2)
336 l = ledge(1,cand_m(i))
337 s = zero
338 IF( l > 0) THEN
339 s = stf(l)
340 ELSE IF( l < 0) THEN
341 s = zero
342 ENDIF
343 IF (s/=zero) THEN
344 m1= ledge(5,cand_m(i))
345 z3=x(3,m1)
346 m2= ledge(6,cand_m(i))
347 z4=x(3,m2)
348 gapvd =
max(gapv(is)+dgapload,drad)
349 zmins =
min(z1,z2)-gapvd
350 zmaxs =
max(z1,z2)+gapvd
351 zminm =
min(z3,z4)-gapvd
352 zmaxm =
max(z3,z4)+gapvd
353 IF (zmaxs>=zminm.AND.zmaxm>=zmins) THEN
354 nls=nls+1
355 list(nls)=is
356 ENDIF
357 ENDIF
358 ENDIF
359 ENDDO
360
361 nlf=1
362 nlt=nls
363 nls=0
364 DO ls=nlf,nlt
365 is=list(ls)
366 i=js+is
367 ii = cand_s(i)-nedge
368 nn1 = 2*(ii-1)+1
369 nn2 = 2*ii
370 y1=
xfie(nin)%P(2,nn1)
371 y2=
xfie(nin)%P(2,nn2)
372 m1= ledge(5,cand_m(i))
373 y3=x(2,m1)
374 m2= ledge(6,cand_m(i))
375 y4=x(2,m2)
376 gapvd =
max(gapv(is)+dgapload,drad)
377 ymins =
min(y1,y2)-gapvd
378 ymaxs =
max(y1,y2)+gapvd
379 yminm =
min(y3,y4)-gapvd
380 ymaxm =
max(y3,y4)+gapvd
381 IF (ymaxs>=yminm.AND.ymaxm>=ymins) THEN
382 nls=nls+1
383 list(nls)=is
384 ENDIF
385 ENDDO
386
387 DO ls=nlf,nls
388 is=list(ls)
389 i=js+is
390 ii = cand_s(i)-nedge
391 nn1 = 2*(ii-1)+1
392 nn2 = 2*ii
393 x1=
xfie(nin)%P(1,nn1)
394 x2=
xfie(nin)%P(1,nn2)
395 m1= ledge(5,cand_m(i))
396 x3=x(1,m1)
397 m2= ledge(6,cand_m(i))
398 x4=x(1,m2)
399 gapvd =
max(gapv(is)+dgapload,drad)
400 xmins =
min(x1,x2)-gapvd
401 xmaxs =
max(x1,x2)+gapvd
402 xminm =
min(x3,x4)-gapvd
403 xmaxm =
max(x3,x4)+gapvd
404 IF (xmaxs>=xminm.AND.xmaxm>=xmins) THEN
405 cand_s(i) = -cand_s(i)
406 count_cand = count_cand+1
407 ct = ct+1
408 ENDIF
409 ENDDO
411 END IF
412 js = js + nseg
413 ENDDO
414 IF (ifq > 0) THEN
415 DO i=first,last
416 IF (ifpen(i) == 0 ) THEN
417 cand_fx(i) = zero
418 cand_fy(i) = zero
419 cand_fz(i) = zero
420 ENDIF
421 ifpen(i) = 0
422 ENDDO
423 ENDIF
424
425#include "lockon.inc"
426 lskyi_count=lskyi_count+count_cand*5
427 count_remslve(nin)=count_remslve(nin)+ct
428#include "lockoff.inc"
429
430
431 RETURN
type(real_pointer), dimension(:), allocatable gape_l_fie
type(int_pointer2), dimension(:), allocatable ledge_fie
type(real_pointer), dimension(:), allocatable gapfie
type(real_pointer2), dimension(:), allocatable xfie
type(real_pointer), dimension(:), allocatable stifie