37
38
39
40#include "implicit_f.inc"
41
42
43
44 INTEGER NRTM,NRTS, NUMNOD,IGAP, NREMNODE
45 INTEGER IRECTM(2,*),IRECTS(2,*),KREMNODE(*),REMNODE(*),I_START,I_MEM_REM
46 INTEGER INOD2LIN(NUMNOD+1),TAGSECND(NUMNOD),NOD2LIN(2*NRTM)
48 . x(3,*),gap_s(*),gap_m(*),gap,drad,gapmin
49 my_real ,
INTENT(IN) :: dgapload
50 my_real ,
INTENT(IN) :: gap_s_l(nrts), gap_m_l(nrtm)
51
52
53
54 INTEGER ,J,K,LIN,ILIN,LEVEL,CPT,NBLIN,LIN1,L,CPT1,N,NBLIN_MAX,CPT_TOTAL
55 INTEGER, dimension(:),ALLOCATABLE :: ITAG,,LISTLINTMP,LISTLINTOTAL
56 INTEGER :: IM1,IM2
57 INTEGER, DIMENSION(:),ALLOCATABLE ::
58 . KNOD2LIN,TAGNOD,ORIGIN
60 . dmax,new_dist,pene,i11pene_lin,xl,gapv
61 my_real,
DIMENSION(:),
ALLOCATABLE ::
62 . dist1
63
64
65
66 ALLOCATE(itag(nrtm))
67 ALLOCATE(listlin(nrtm))
68 ALLOCATE(listlintmp(nrtm))
69 ALLOCATE(listlintotal(nrtm))
70
71 cpt = 0
72 IF (i_start ==1) THEN
73
74 ALLOCATE(knod2lin(numnod+1))
75
76 kremnode(1) = 1
77 nod2lin(1:2*nrtm) = 0
78 knod2lin(1:numnod+1) = 0
79 inod2lin(1:numnod+1) = 0
80 tagsecnd(1:numnod) = 0
81
82 DO i=1,nrts
83 tagsecnd(irects(1,i)) = 1
84 tagsecnd(irects(2,i)) = 1
85 ENDDO
86
87 DO i=1,nrtm
88 DO j=1,2
89 IF( tagsecnd(irectm(j,i)) == 1 ) cpt = cpt + 1
90 ENDDO
91 ENDDO
92
93 IF (cpt == 0) THEN
94
95 DO i=1,nrtm
96 kremnode(i+1) = 0
97 ENDDO
98
99 ELSE
100
101
102
103
104 DO i=1,nrtm
105 cpt = 0
106 DO k=1,2
107 IF(tagsecnd(irectm(k,i)) == 1) cpt = cpt + 1
108 END DO
109 IF (cpt /= 0 ) THEN
110 DO k=1,2
111 n = irectm(k,i)
112 knod2lin(n) = knod2lin(n) + 1
113 END DO
114 ENDIF
115 END DO
116
117 inod2lin(1) = 1
118 DO i=1,numnod
119 inod2lin(i+1) = inod2lin(i) + knod2lin(i)
120 END DO
121 knod2lin(1:numnod+1) = inod2lin(1:numnod+1)
122
123 DO i=1,nrtm
124 cpt = 0
125 DO k=1,2
126 IF(tagsecnd(irectm(k,i)) == 1) cpt = cpt + 1
127 END DO
128 IF (cpt /= 0) THEN
129 DO k=1,2
130 n = irectm(k,i)
131 nod2lin(knod2lin(n)) = i
132 knod2lin(n) = knod2lin(n) + 1
133 END DO
134 ENDIF
135 END DO
136
137 DEALLOCATE(knod2lin)
138
139 ENDIF
140
141 ENDIF
142
143 IF (((i_start==1).AND.(cpt > 0)).OR.(i_start>1)) THEN
144
145
146
147
148
152 dist1(1:numnod) = ep30
153 itag(1:nrtm) = 0
154 listlin(1:nrtm) = 0
155 listlintmp(1:nrtm)=0
156 listlintotal(1:nrtm) = 0
157 cpt_total = 0
158
159 dmax = sqrt(two) *
max(gap+dgapload,drad)
160
161 DO i=i_start,nrtm
162
163 level = 1
164 lin = i
165
166 itag(lin) = level
167 listlin(1)=lin
168 nblin=1
169 nblin_max=1
170 cpt = 0
171 cpt_total = 0
172 xl = (x(1,irectm(1,i))-x(1,irectm(2,i)))**2+(x(2,irectm(1,i))-x(2,irectm(2,i)))**2+(x(3,irectm(1,i))-x(3,irectm(2,i)))**2
173 xl = sqrt(xl)
174
175 DO j=1,2
177 dist1(irectm(j,lin)) = zero
178 ENDDO
179
180 DO WHILE (nblin/=0)
181
182 level = level+1
183 cpt = 0
184 DO ilin=1,nblin
185 lin=listlin(ilin)
187
188
189
190
191
192 pene = zero
193 IF ((dist1(irectm(1,lin)) > dmax).AND.(dist1(irectm(2,lin)) > dmax).AND.(level>2)) THEN
194 pene = i11pene_lin(x,irectm(1,lin),irectm(2,lin),irectm(1,i),irectm(2,i),dmax)
195 ENDIF
196
197 IF ((level <= 2).OR.(dist1(irectm(1,lin)) <= dmax).OR.(dist1(irectm(2,lin)) <= dmax).OR.(pene > zero)) THEN
198 DO j=1,2
199 DO k=inod2lin(irectm(j,lin)),inod2lin(irectm(j,lin)+1)-1
200 lin1 = nod2lin(k)
201 IF( (itag(lin1) == 0 .OR. itag(lin1) == level)) THEN
202 IF(itag(lin1) == 0)THEN
203 cpt = cpt + 1
204 listlintmp(cpt)=lin1
205 ENDIF
206 itag(lin1)=level
207 DO l=1,2
208
209 IF ((tagsecnd(irectm(l,lin1))== 1).AND.(
origin(irectm(l,lin1)) /= irectm(j,lin))
210 . .AND.((irectm(l,lin1)) /= irectm(j,lin)).AND.(
tagnod(irectm(l,lin1)) /= 2))
THEN
211
212 new_dist=dist1(irectm(j,lin))+
213 . sqrt((x(1,irectm(l,lin1))-x(1,irectm(j,lin)))**2 +
214 . (x(2,irectm(l,lin1)) - x(2,irectm(j,lin)))**2 +
215 . (x(3,irectm(l,lin1)) - x(3,irectm(j,lin)))**2 )
216
217 IF (new_dist < dist1(irectm(l,lin1))) THEN
218 dist1(irectm(l,lin1)) = new_dist
219 ENDIF
220
221 IF(
tagnod(irectm(l,lin1))==0)
THEN
222 tagnod(irectm(l,lin1)) = 1
223 ENDIF
224
225 ENDIF
226 ENDDO
227 ENDIF
228 ENDDO
229 ENDDO
230 ENDIF
231
233 ENDDO
234
235 nblin = cpt
236
237 nblin_max =
max(nblin_max,nblin)
238 IF(nblin ==0)EXIT
239 DO j=1,cpt
240 listlin(j)=listlintmp(j)
241 listlintmp(j) = 0
242 listlintotal(j+cpt_total) = listlin(j)
243 ENDDO
244 cpt_total = cpt_total + cpt
245
246
247 ENDDO
248
249
250
251
252
253 i_start = i
254 IF (kremnode(i)+cpt_total > nremnode) THEN
255
256 i_mem_rem = 1
257 EXIT
258 ENDIF
259
260 cpt1 = 0
261 im1 = irectm(1,i)
262 im2 = irectm(2,i)
263
264 IF (igap == 0) THEN
265 DO l=1,cpt_total
266 lin = listlintotal(l)
267 IF ((im1 /= irectm(1,lin)).AND.(im1 /= irectm(2,lin))
268 . .AND.(im2 /= irectm(1,lin)).AND.(im2 /= irectm(2,lin))) THEN
269
270 IF ((dist1(irectm(1,lin)) <= dmax).OR.(dist1(irectm(2,lin)) <= dmax)) THEN
271 remnode(kremnode(i)+cpt1) = lin
272 cpt1 = cpt1 + 1
273 ELSE
274 pene = i11pene_lin(x,irectm(1,lin),irectm(2,lin),irectm(1,i),irectm(2,i),sqrt(two)*
max(gap+dgapload,drad))
275 IF (pene > 0) THEN
276 remnode(kremnode(i)+cpt1) = lin
277 cpt1 = cpt1 + 1
278 ENDIF
279 ENDIF
280 ENDIF
281 ENDDO
282 kremnode(i+1) = kremnode(i) + cpt1
283 ELSE
284 DO l=1,cpt_total
285 lin = listlintotal(l)
286 IF ((im1 /= irectm(1,lin)).AND.(im1 /= irectm(2,lin))
287 . .AND.(im2 /= irectm(1,lin)).AND.(im2 /= irectm(2,lin))) THEN
288
289 gapv = gap_s(lin)+gap_m(i)
290 IF(igap == 3) gapv=
min(gap_s_l(lin)+gap_m_l(i),gapv)
291 gapv = sqrt(two)*
max(drad,gapmin,gapv+dgapload)
292 IF ((dist1(irectm(1,lin)) <= gapv).OR.(dist1(irectm(2,lin)) <= gapv)) THEN
293 remnode(kremnode(i)+cpt1) = lin
294 cpt1 = cpt1 + 1
295 ELSE
296 pene = i11pene_lin(x,irectm(1,lin),irectm(2,lin),irectm(1,i),irectm(2,i),gapv)
297 IF (pene > 0) THEN
298 remnode(kremnode(i)+cpt1) = lin
299 cpt1 = cpt1 + 1
300 ENDIF
301 ENDIF
302 ENDIF
303 ENDDO
304 kremnode(i+1) = kremnode(i) + cpt1
305 ENDIF
306
307
308
309
310
311 dist1(irectm(1,i)) = ep30
312 dist1(irectm(2,i)) = ep30
317 itag(i) = 0
318
319 DO l=1,cpt_total
320 lin = listlintotal(l)
321 itag(lin) = 0
322 listlintotal(l) = 0
325 dist1(irectm(1,lin)) = ep30
326 dist1(irectm(2,lin)) = ep30
329 ENDDO
330 listlintmp(1:nblin_max)=0
331 listlin(1:nblin_max)=0
332
333 ENDDO
334
336
337 ELSE
338 i_start = nrtm
339 ENDIF
340
341 DEALLOCATE(itag)
342 DEALLOCATE(listlin)
343 DEALLOCATE(listlintmp)
344 DEALLOCATE(listlintotal)
345
346 RETURN
integer function origin(nn, ixc, ipartc, ipart)
subroutine tagnod(ix, nix, nix1, nix2, numel, iparte, tagbuf, npart)