37
38
39
41
42
43
44#include "implicit_f.inc"
45#include "comlock.inc"
46
47
48
49#include "mvsiz_p.inc"
50
51
52
53#include "com01_c.inc"
54#include "param_c.inc"
55#include "task_c.inc"
56#include "parit_c.inc"
57
58
59
60 INTEGER IRECT(4,*), NSV(*), CAND_E(*), CAND_N(*), IFPEN(*),
61 . I_STOK,NIN,IGAP ,ITASK, NSN, IFQ,ICURV,COUNT_REMSLV(*)
63 . xa(3,*),gap,gap_s(*),gap_m(*),stfa(*),stf(*),
64 . cand_fx(*),cand_fy(*),cand_fz(*),
65 . gapmax
66
67
68
69 INTEGER I,L,IS,JS,LS,NLS,NLT,NSEG,NLS2,SG,FIRST,LAST,MSEG,NLF,II
70 INTEGER LIST(MVSIZ),IG(MVSIZ),IX1(MVSIZ),IX2(MVSIZ),IX3(MVSIZ),
71 . IX4(MVSIZ), LISTI(MVSIZ),IL(MVSIZ),COUNT_CAND,CT
73 . xi,x1,x2,x3,x4,yi,y1,y2,y3,y4,zi,z1,z2,z3,z4,
74 . xmin,xmax,ymin,
ymax,zmin,zmax,v12,v22,v32,v42
76 . gapv(mvsiz)
78 . x0,y0,z0,xxx,yyy,zzz,curv_max
79
80 ct = 0
81 count_cand=0
82 mseg = nvsiz
83 first = 1 + i_stok*itask / nthread
84 last = i_stok*(itask+1) / nthread
85 js = first-1
86 DO sg = first,last,mseg
87 nseg =
min(mseg,last-js)
88 nls=0
89 IF(nspmd>1) THEN
90
91
92
93 nls = 0
94 nls2 = nseg+1
95 DO is = 1, nseg
96 i=js+is
97 IF(cand_n(i)<=nsn)THEN
98 nls=nls+1
99 listi(nls)=is
100 ELSE
101 nls2=nls2-1
102 listi(nls2) = is
103 ENDIF
104 ENDDO
105 IF(igap==0)THEN
106 DO ls = 1, nls
107 is = listi(ls)
108 gapv(is)=gap
109 ENDDO
110 ELSE
111 DO ls = 1, nls
112 is = listi(ls)
113 i=js+is
114 gapv(is)=gap_s(cand_n(i))+gap_m(cand_e(i))
115 IF(gapmax/=zero)gapv(is)=
min(gapv(is),gapmax)
116 gapv(is)=
max(gapv(is),gap)
117 ENDDO
118 ENDIF
119 ELSE
120 nls = nseg
121 IF(igap==0)THEN
122 DO is=1,nseg
123 gapv(is)=gap
124 listi(is)=is
125 ENDDO
126 ELSE
127 DO is=1,nseg
128 i=js+is
129 gapv(is)=gap_s(cand_n(i))+gap_m(cand_e(i))
130 IF(gapmax/=zero)gapv(is)=
min(gapv(is),gapmax)
131 gapv(is)=
max(gapv(is),gap)
132 listi(is)=is
133 ENDDO
134 ENDIF
135 ENDIF
136
137 nlf = 1
138 nlt = nls
139 nls=0
140 IF(icurv/=0)THEN
141#include "vectorize.inc"
142 DO ls = nlf, nlt
143 is = listi(ls)
144 i=js+is
145 l = cand_e(i)
146 IF(stf(l)/=zero.AND.stfa(nsv(cand_n(i)))/=zero) THEN
147
148
149
150
151
152 il(is) = nsv(cand_n(i))
153 xi = xa(1,il(is))
154 yi = xa(2,il(is))
155 zi = xa(3,il(is))
156
157 ix1(is)=irect(1,l)
158 ix2(is)=irect(2,l)
159 ix3(is)=irect(3,l)
160 ix4(is)=irect(4,l)
161 x1=xa(1,ix1(is))
162 x2=xa(1,ix2(is))
163 x3=xa(1,ix3(is))
164 x4=xa(1,ix4(is))
165 y1=xa(2,ix1(is))
166 y2=xa(2,ix2(is))
167 y3=xa(2,ix3(is))
168 y4=xa(2,ix4(is))
169 z1=xa(3,ix1(is))
170 z2=xa(3,ix2(is))
171 z3=xa(3,ix3(is))
172 z4=xa(3,ix4(is))
173 x0 = fourth*(x1+x2+x3+x4)
174 y0 = fourth*(y1+y2+y3+y4)
175 z0 = fourth*(z1+z2+z3+z4)
176 xxx=
max(x1,x2,x3,x4)-
min(x1,x2,x3,x4)
177 yyy=
max(y1,y2,y3,y4)-
min(y1,y2,y3,y4)
178 zzz=
max(z1,z2,z3,z4)-
min(z1,z2,z3,z4)
179 curv_max = half *
max(xxx,yyy,zzz)
180 xmin = x0-curv_max-gapv(is)
181 ymin = y0-curv_max-gapv(is)
182 zmin = z0-curv_max-gapv(is)
183 xmax = x0+curv_max+gapv(is)
184 ymax = y0+curv_max+gapv(is)
185 zmax = z0+curv_max+gapv(is)
186 IF (xmin <= xi.AND.xmax >= xi.AND.
187 . ymin <= yi.AND.
ymax >= yi.AND.
188 . zmin <= zi.AND.zmax >= zi) cand_n(i) = -cand_n(i)
189 ENDIF
190 ENDDO
191 ELSE
192 DO ls = nlf, nlt
193
194 is = listi(ls)
195 i=js+is
196 l = cand_e(i)
197 IF(stf(l)/=zero.AND.stfa(nsv(cand_n(i)))/=zero) THEN
198 il(is) = nsv(cand_n(i))
199 zi = xa(3,il(is))
200
201 ix1(is)=irect(1,l)
202 z1=xa(3,ix1(is))
203 ix2(is)=irect(2,l)
204 z2=xa(3,ix2(is))
205 ix3(is)=irect(3,l)
206 z3=xa(3,ix3(is))
207 ix4(is)=irect(4,l)
208 z4=xa(3,ix4(is))
209 zmin =
min(z1,z2,z3,z4)-gapv(is)
210 zmax =
max(z1,z2,z3,z4)+gapv(is)
211 IF (zmin<=zi.AND.zmax>=zi) THEN
212 nls=nls+1
213 list(nls)=is
214 ENDIF
215 ENDIF
216 ENDDO
217
218 nlt=nls
219 nls=0
220 DO ls=nlf,nlt
221 is=list(ls)
222
223 yi=xa(2,il(is))
224
225 y1=xa(2,ix1(is))
226 y2=xa(2,ix2(is))
227 y3=xa(2,ix3(is))
228 y4=xa(2,ix4(is))
229 ymin =
min(y1,y2,y3,y4)-gapv(is)
230 ymax =
max(y1,y2,y3,y4)+gapv(is)
231 IF (ymin<=yi.AND.
ymax>=yi)
THEN
232 nls=nls+1
233 list(nls)=is
234 ENDIF
235 ENDDO
236
237 DO ls=nlf,nls
238 is=list(ls)
239
240 xi=xa(1,il(is))
241
242 x1=xa(1,ix1(is))
243 x2=xa(1,ix2(is))
244 x3=xa(1,ix3(is))
245 x4=xa(1,ix4(is))
246 xmin =
min(x1,x2,x3,x4)-gapv(is)
247 xmax =
max(x1,x2,x3,x4)+gapv(is)
248 IF (xmin<=xi.AND.xmax>=xi) THEN
249 i=js+is
250 cand_n(i) = -cand_n(i)
251 count_cand = count_cand+1
252 ENDIF
253 ENDDO
254 ENDIF
255 IF(nspmd>1)THEN
256 nlf = nls2
257 nlt = nseg
258 IF(igap==0)THEN
259 DO ls = nlf, nlt
260 is = listi(ls)
261 gapv(is)=gap
262 ENDDO
263 ELSE
264 IF(gapmax/=zero)THEN
265 DO ls = nlf, nlt
266 is = listi(ls)
267 i=js+is
268 gapv(is)=
gapfi(nin)%P(cand_n(i)-nsn)+gap_m(cand_e(i))
269 gapv(is)=
min(gapv(is),gapmax)
270 gapv(is)=
max(gapv(is),gap)
271 ENDDO
272 ELSE
273 DO ls = nlf, nlt
274 is = listi(ls)
275 i=js+is
276 gapv(is)=
gapfi(nin)%P(cand_n(i)-nsn)+gap_m(cand_e(i))
277 gapv(is)=
max(gapv(is),gap)
278 ENDDO
279 ENDIF
280 ENDIF
281 IF(icurv/=0)THEN
282 DO ls = nlf, nlt
283 is = listi(ls)
284 i=js+is
285 ii = cand_n(i)-nsn
286 l = cand_e(i)
287 IF(stf(l)/=zero.AND.
stifi(nin)%P(ii)/=zero)
THEN
288 xi =
xfi(nin)%P(1,ii)
289 yi =
xfi(nin)%P(2,ii)
290 zi =
xfi(nin)%P(3,ii)
291 ix1(is)=irect(1,l)
292 ix2(is)=irect(2,l)
293 ix3(is)=irect(3,l)
294 ix4(is)=irect(4,l)
295 x1=xa(1,ix1(is))
296 x2=xa(1,ix2(is))
297 x3=xa(1,ix3(is))
298 x4=xa(1,ix4(is))
299 y1=xa(2,ix1(is))
300 y2=xa(2,ix2(is))
301 y3=xa(2,ix3(is))
302 y4=xa(2,ix4(is))
303 z1=xa(3,ix1(is))
304 z2=xa(3,ix2(is))
305 z3=xa(3,ix3(is))
306 z4=xa(3,ix4(is))
307 x0 = fourth*(x1+x2+x3+x4)
308 y0 = fourth*(y1+y2+y3+y4)
309 z0 = fourth*(z1+z2+z3+z4)
310 xxx=
max(x1,x2,x3,x4)-
min(x1,x2,x3,x4)
311 yyy=
max(y1,y2,y3,y4)-
min(y1,y2,y3,y4)
312 zzz=
max(z1,z2,z3,z4)-
min(z1,z2,z3,z4)
313 curv_max = half *
max(xxx,yyy,zzz)
314 xmin = x0-curv_max-gapv(is)
315 ymin = y0-curv_max-gapv(is)
316 zmin = z0-curv_max-gapv(is)
317 xmax = x0+curv_max+gapv(is)
318 ymax = y0+curv_max+gapv(is)
319 zmax = z0+curv_max+gapv(is)
320 IF (xmin <= xi.AND.xmax >= xi.AND.
321 . ymin <= yi.AND.
ymax >= yi.AND.
322 . zmin <= zi.AND.zmax >= zi) THEN
323 cand_n(i) = -cand_n(i)
324 count_cand = count_cand+1
325 ct = ct + 1
326 ENDIF
327 END IF
328 END DO
329 ELSE
330
331 nls=0
332 DO ls = nlf, nlt
333 is = listi(ls)
334 i=js+is
335 ii = cand_n(i)-nsn
336 l = cand_e(i)
337 IF(stf(l)/=zero.AND.
stifi(nin)%P(ii)/=zero)
THEN
338 zi =
xfi(nin)%P(3,ii)
339 ix1(is)=irect(1,l)
340 z1=xa(3,ix1(is))
341 ix2(is)=irect(2,l)
342 z2=xa(3,ix2(is))
343 ix3(is)=irect(3,l)
344 z3=xa(3,ix3(is))
345 ix4(is)=irect(4,l)
346 z4=xa(3,ix4(is))
347 zmin =
min(z1,z2,z3,z4)-gapv(is)
348 zmax =
max(z1,z2,z3,z4)+gapv(is)
349 IF (zmin<=zi.AND.zmax>=zi) THEN
350 nls=nls+1
351 list(nls)=is
352 ENDIF
353 ENDIF
354 ENDDO
355
356 nlf=1
357 nlt=nls
358 nls=0
359 DO ls=nlf,nlt
360 is=list(ls)
361 i=js+is
362 ii=cand_n(i)-nsn
364 y1=xa(2,ix1(is))
365 y2=xa(2,ix2(is))
366 y3=xa(2,ix3(is))
367 y4=xa(2,ix4(is))
368 ymin =
min(y1,y2,y3,y4)-gapv(is)
369 ymax =
max(y1,y2,y3,y4)+gapv(is)
370 IF (ymin<=yi.AND.
ymax>=yi)
THEN
371 nls=nls+1
372 list(nls)=is
373 ENDIF
374 ENDDO
375
376 DO ls=nlf,nls
377 is=list(ls)
378 i=js+is
379 ii = cand_n(i)-nsn
380 xi =
xfi(nin)%P(1,ii)
381 x1=xa(1,ix1(is))
382 x2=xa(1,ix2(is))
383 x3=xa(1,ix3(is))
384 x4=xa(1,ix4(is))
385 xmin =
min(x1,x2,x3,x4)-gapv(is)
386 xmax =
max(x1,x2,x3,x4)+gapv(is)
387 IF (xmin<=xi.AND.xmax>=xi) THEN
388 cand_n(i) = -cand_n(i)
389 count_cand = count_cand+1
390 ct = ct + 1
391 ENDIF
392 ENDDO
393 END IF
394 ELSE
396 ENDIF
397 js = js + nseg
398 ENDDO
399 IF (itask == 0 .AND. ifq > 0) THEN
400 DO i=1,i_stok
401 IF (ifpen(i) == 0) THEN
402 cand_fx(i) = zero
403 cand_fy(i) = zero
404 cand_fz(i) = zero
405 ENDIF
406 ifpen(i) = 0
407 ENDDO
408 ENDIF
409
410#include "lockon.inc"
411 lskyi_count=lskyi_count+count_cand*5
412 count_remslv(nin) = count_remslv(nin)+ct
413#include "lockoff.inc"
414
415 RETURN
subroutine ymax(idn, fac, npc, pld, stiffmin, stiffmax, stiffini, stiffavg)
type(real_pointer), dimension(:), allocatable stifi
type(real_pointer), dimension(:), allocatable gapfi
type(real_pointer2), dimension(:), allocatable xfi