38
39
40
42
43
44
45#include "implicit_f.inc"
46#include "comlock.inc"
47
48
49
50#include "mvsiz_p.inc"
51
52
53
54 INTEGER IRECTS(2,*),IRECTM(2,*), CAND_M(*), CAND_S(*),
55 . I_STOK, NIN,IGAP ,ITASK, NRTS,COUNT_REMSLV(*),
56 . IFPEN(*),IFORM
58 . x(3,*),gap,gap_s(*),gap_m(*),v(3,*),stfs(*), stfm(*),
59 . gap_s_l(*),gap_m_l(*),cand_fx(*),cand_fy(*),cand_fz(*)
60 my_real ,
INTENT(IN) :: dgapload,drad
61 INTEGER,INTENT(INOUT) :: LSKYI_SMS_NEW
62
63
64
65#include "task_c.inc"
66# "com01_c.inc"
67#include "param_c.inc"
68#include "parit_c.inc"
69
70
71
72 INTEGER I , L, NN1, NN2
74 . xi,x1,x2,x3,x4,yi,y1,y2,y3,y4,zi,z1,z2,z3,z4,
75 . xmins,xmaxs,ymins,ymaxs,zmins,zmaxs,
76 . xminm,xmaxm,yminm,ymaxm,zminm,zmaxm,
77 . v12,v22,v32,v42,vv,gapvd
78 INTEGER MSEG,CT
80 . gapv(mvsiz),dtti(mvsiz)
81 INTEGER LIST(MVSIZ), LISTI(MVSIZ)
82 INTEGER IS,JS,LS,NLS,NLT,NSEG,NLF,II,NLS2
83 INTEGER N1(MVSIZ),N2(MVSIZ),M1(MVSIZ),M2(MVSIZ)
84 INTEGER SG, FIRST, LAST,COUNT_CAND
85
86 count_cand = 0
87 ct = 0
88 mseg = nvsiz
89 first = 1 + i_stok*itask / nthread
90 last = i_stok*(itask+1) / nthread
91 js = first-1
92 DO sg = first,last,mseg
93 nseg =
min(mseg,last-js)
94 nls=0
95 IF(nspmd>1) THEN
96
97
98
99 nls = 0
100 nls2 = nseg+1
101 DO is = 1, nseg
102 i=js+is
103 IF(cand_s(i)<=nrts)THEN
104 nls=nls+1
105 listi(nls)=is
106 ELSE
107 nls2=nls2-1
108 listi(nls2) = is
109 ENDIF
110 ENDDO
111 IF(igap==0)THEN
112 DO ls = 1, nls
113 is = listi(ls)
114 gapv(is)=gap
115 ENDDO
116 ELSE
117 DO ls = 1, nls
118 is = listi(ls)
119 i=js+is
120 gapv(is)=gap_s(cand_s(i))+gap_m(cand_m
121 IF(igap==3)
122 . gapv(is)=
min(gapv(is),
123 . gap_s_l(cand_s(i))+gap_m_l
124 gapv(is)=
max(gapv(is),gap)
125 ENDDO
126 ENDIF
127 ELSE
128 nls = nseg
129 IF(igap==0)THEN
130 DO is=1,nseg
131 gapv(is)=gap
132 listi(is)=is
133 ENDDO
134 ELSE
135 DO is=1,nseg
136 i=js+is
137 gapv(is)=gap_s(cand_s(i))+gap_m(cand_m(i))
138 IF(igap==3)
139 . gapv(is)=
min(gapv(is),
140 . gap_s_l(cand_s(i))+gap_m_l(cand_m(i)))
141 gapv(is)=
max(gapv(is),gap)
142 listi(is)=is
143 ENDDO
144 ENDIF
145 ENDIF
146
147 nlf = 1
148 nlt = nls
149 nls=0
150 DO ls = nlf, nlt
151 is = listi(ls)
152 i=js+is
153 l = cand_s(i)
154 IF (stfs(l)/=zero) THEN
155 n1(is)=irects(1,l)
156 z1=x(3,n1(is))
157 n2(is)=irects(2,l)
158 z2=x(3,n2(is))
159 l = cand_m(i)
160 IF (stfm(l)/=zero) THEN
161
162 m1(is)=irectm(1,l)
163 z3=x(3,m1(is))
164 m2(is)=irectm(2,l)
165 z4=x(3,m2(is))
166 gapvd =
max(gapv(is)+dgapload,drad)
167 zmins =
min(z1,z2)-gapvd
168 zmaxs =
max(z1,z2)+gapvd
169 zminm =
min(z3,z4)-gapvd
170 zmaxm =
max(z3,z4)+gapvd
171 IF (zmaxs>=zminm.AND.zmaxm>=zmins) THEN
172 nls=nls+1
173 list(nls)=is
174 ENDIF
175 ENDIF
176 ENDIF
177 ENDDO
178
179 nlt=nls
180 nls=0
181 DO ls=nlf,nlt
182 is=list(ls)
183 i=js+is
184 l = cand_s(i)
185 n1(is)=irects(1,l)
186 y1=x(2,n1(is))
187 n2(is)=irects(2,l)
188 y2=x(2,n2(is))
189 l = cand_m(i)
190 m1(is)=irectm(1,l)
191 y3=x(2,m1(is))
192 m2(is)=irectm(2,l)
193 y4=x(2,m2(is))
194 gapvd =
max(gapv(is)+dgapload,drad)
195 ymins =
min(y1,y2)-gapvd
196 ymaxs =
max(y1,y2)+gapvd
197 yminm =
min(y3,y4)-gapvd
198 ymaxm =
max(y3,y4)+gapvd
199 IF (ymaxs>=yminm.AND.ymaxm>=ymins) THEN
200 nls=nls+1
201 list(nls)=is
202 ENDIF
203 ENDDO
204
205 DO ls=nlf,nls
206 is=list(ls)
207 i=js+is
208 l = cand_s(i)
209 n1(is)=irects(1,l)
210 x1=x(1,n1(is))
211 n2(is)=irects(2,l)
212 x2=x(1,n2(is))
213 l = cand_m(i)
214 m1(is)=irectm(1,l)
215 x3=x(1,m1(is))
216 m2(is)=irectm(2,l)
217 x4=x(1,m2(is))
218 gapvd =
max(gapv(is)+dgapload,drad)
219 xmins =
min(x1,x2)-gapvd
220 xmaxs =
max(x1,x2)+gapvd
221 xminm =
min(x3,x4)-gapvd
222 xmaxm =
max(x3,x4)+gapvd
223 IF (xmaxs>=xminm.AND.xmaxm>=xmins) THEN
224 cand_s(i) = -cand_s(i)
225 count_cand = count_cand+1
226 ENDIF
227 ENDDO
228
229 IF(nspmd>1)THEN
230 nlf = nls2
231 nlt = nseg
232 IF(igap==0)THEN
233 DO ls=nlf, nlt
234 is = listi(ls)
235 gapv(is)=gap
236 ENDDO
237 ELSE
238 DO ls = nlf, nlt
239 is = listi(ls)
240 i=js+is
241 gapv(is)=
gapfi(nin)%P(cand_s(i)-nrts)+gap_m(cand_m(i))
242 IF(igap==3)
243 . gapv(is)=
min(gapv(is),
244 .
gap_lfi(nin)%P(cand_s(i)-nrts)+
245 .
max(gap_m(cand_m(i)),gap_m_l(cand_m(i))))
246 gapv(is)=
max(gapv(is),gap)
247 ENDDO
248 ENDIF
249
250 nls=0
251 DO ls = nlf, nlt
252
253 is = listi(ls)
254 i=js+is
255 ii = cand_s(i)-nrts
256 IF (
stifi(nin)%P(ii)/=zero)
THEN
257 nn1 = 2*(ii-1)+1
258 nn2 = 2*ii
261 l = cand_m(i)
262 IF (stfm(l)/=zero) THEN
263 m1(is)=irectm(1,l)
264 z3=x(3,m1(is))
265 m2(is)=irectm(2,l)
266 z4=x(3,m2(is))
267 gapvd =
max(gapv(is)+dgapload,drad)
268 zmins =
min(z1,z2)-gapvd
269 zmaxs =
max(z1,z2)+gapvd
270 zminm =
min(z3,z4)-gapvd
271 zmaxm =
max(z3,z4)+gapvd
272 IF (zmaxs>=zminm.AND.zmaxm>=zmins) THEN
273 nls=nls+1
274 list(nls)=is
275 ENDIF
276 ENDIF
277 ENDIF
278 ENDDO
279
280 nlf=1
281 nlt=nls
282 nls=0
283 DO ls=nlf,nlt
284 is=list(ls)
285 i=js+is
286 ii = cand_s(i)-nrts
287 nn1 = 2*(ii-1)+1
288 nn2 = 2*ii
291 l = cand_m(i)
292 m1(is)=irectm(1,l)
293 y3=x(2,m1(is))
294 m2(is)=irectm(2,l)
295 y4=x(2,m2(is))
296 gapvd =
max(gapv(is)+dgapload,drad)
297 ymins =
min(y1,y2)-gapvd
298 ymaxs =
max(y1,y2)+gapvd
299 yminm =
min(y3,y4)-gapvd
300 ymaxm =
max(y3,y4)+gapvd
301 IF (ymaxs>=yminm.AND.ymaxm>=ymins) THEN
302 nls=nls+1
303 list(nls)=is
304 ENDIF
305 ENDDO
306
307 DO ls=nlf,nls
308 is=list(ls)
309 i=js+is
310 ii = cand_s(i)-nrts
311 nn1 = 2*(ii-1)+1
312 nn2 = 2*ii
315 l = cand_m(i)
316 m1(is)=irectm(1,l)
317 x3=x(1,m1(is))
318 m2(is)=irectm(2,l)
319 x4=x(1,m2(is))
320 gapvd =
max(gapv(is)+dgapload,drad)
321 xmins =
min(x1,x2)-gapvd
322 xmaxs =
max(x1,x2)+gapvd
323 xminm =
min(x3,x4)-gapvd
324 xmaxm =
max(x3,x4)+gapvd
325 IF (xmaxs>=xminm.AND.xmaxm>=xmins) THEN
326 cand_s(i) = -cand_s(i)
327 count_cand = count_cand+1
328 ct = ct+1
329 ENDIF
330 ENDDO
332 END IF
333 js = js + nseg
334 ENDDO
335 IF (itask == 0 .AND. iform == 2) THEN
336 DO i=1,i_stok
337 IF (ifpen(i) == 0 ) THEN
338 cand_fx(i) = zero
339 cand_fy(i) = zero
340 cand_fz(i) = zero
341 ENDIF
342 ifpen(i) = 0
343 ENDDO
344 ENDIF
345
346#include "lockon.inc"
347 lskyi_count=lskyi_count+count_cand*5
348 count_remslv(nin)=count_remslv(nin)+ct
349 lskyi_sms_new = lskyi_sms_new + count_cand
350#include "lockoff.inc"
351
352
353 RETURN
type(real_pointer), dimension(:), allocatable stifi
type(real_pointer), dimension(:), allocatable gap_lfi
type(real_pointer), dimension(:), allocatable gapfi
type(real_pointer2), dimension(:), allocatable xfi