32 1 X,NRTM,IRECTM,NRTS,IRECTS,
33 2 NUMNOD,GAP_S ,GAP_M, GAPMIN,IGAP,
34 3 KREMNODE,REMNODE,GAP,DRAD,NREMNODE,
35 4 I_START,I_MEM_REM,INOD2LIN,TAGSECND,NOD2LIN,
36 5 DGAPLOAD,GAP_S_L,GAP_M_L)
40#include "implicit_f.inc"
44 INTEGER NRTM,NRTS, NUMNOD,IGAP,
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)
54 INTEGER I,J,K,LIN,ILIN,LEVEL,,NBLIN,LIN1,L,CPT1,N,NBLIN_MAX,CPT_TOTAL
55 INTEGER,
dimension(:),
ALLOCATABLE :: ITAG,LISTLIN,LISTLINTMP,LISTLINTOTAL
57 INTEGER,
DIMENSION(:),
ALLOCATABLE ::
58 . KNOD2LIN,TAGNOD,ORIGIN
60 . dmax,new_dist,pene,i11pene_lin,xl,gapv
61 my_real,
DIMENSION(:),
ALLOCATABLE ::
67 ALLOCATE(listlin(nrtm))
68 ALLOCATE(listlintmp(nrtm))
69 ALLOCATE(listlintotal(nrtm))
74 ALLOCATE(knod2lin(numnod+1))
78 knod2lin(1:numnod+1) = 0
79 inod2lin(1:numnod+1) = 0
80 tagsecnd(1:numnod) = 0
83 tagsecnd(irects(1,i)) = 1
84 tagsecnd(irects(2,i)) = 1
89 IF( tagsecnd(irectm(j,i)) == 1 ) cpt = cpt + 1
107 IF(tagsecnd(irectm(k,i)) == 1) cpt = cpt + 1
112 knod2lin(n) = knod2lin(n) + 1
119 inod2lin(i+1) = inod2lin(i) + knod2lin(i)
121 knod2lin(1:numnod+1) = inod2lin(1:numnod+1)
126 IF(tagsecnd(irectm(k,i)) == 1) cpt = cpt + 1
131 nod2lin(knod2lin(n)) = i
132 knod2lin(n) = knod2lin(n) + 1
143 IF (((i_start==1).AND.(cpt > 0)).OR.(i_start>1))
THEN
149 ALLOCATE(tagnod(numnod),origin(numnod),dist1(numnod))
152 dist1(1:numnod) = ep30
156 listlintotal(1:nrtm) = 0
159 dmax = sqrt(two) *
max(gap+dgapload,drad)
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
176 tagnod(irectm(j,lin)) = 1
177 dist1(irectm(j,lin)) = zero
186 tagnod(irectm(1:2,lin))=2
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)
197 IF ((level <= 2).OR.(dist1(irectm(1,lin)) <= dmax).OR.(dist1(irectm(2,lin)) <= dmax).OR.(pene > zero))
THEN
199 DO k=inod2lin(irectm(j,lin)),inod2lin(irectm(j,lin)+1)-1
201 IF( (itag(lin1) == 0 .OR. itag(lin1) == level))
THEN
202 IF(itag(lin1) == 0)
THEN
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
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 )
217 IF (new_dist < dist1(irectm(l,lin1)))
THEN
218 dist1(irectm(l,lin1)) = new_dist
221 IF(tagnod(irectm(l,lin1))==0)
THEN
222 tagnod(irectm(l,lin1)) = 1
232 tagnod(irectm(1:2,lin))=1
237 nblin_max =
max(nblin_max,nblin)
240 listlin(j)=listlintmp(j)
242 listlintotal(j+cpt_total) = listlin(j)
244 cpt_total = cpt_total + cpt
254 IF (kremnode(i)+cpt_total > nremnode)
THEN
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
270 IF ((dist1(irectm(1,lin)) <= dmax).OR.(dist1(irectm(2,lin)) <= dmax))
THEN
271 remnode(kremnode(i)+cpt1) = lin
274 pene = i11pene_lin(x,irectm(1,lin),irectm(2,lin),irectm(1,i),irectm(2,i),sqrt(two)*
max(gap+dgapload,drad))
276 remnode(kremnode(i)+cpt1) = lin
282 kremnode(i+1) = kremnode(i) + cpt1
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
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
296 pene = i11pene_lin(x,irectm(1,lin),irectm(2,lin),irectm(1,i),irectm(2,i),gapv)
298 remnode(kremnode(i)+cpt1) = lin
304 kremnode(i+1) = kremnode(i) + cpt1
311 dist1(irectm(1,i)) = ep30
312 dist1(irectm(2,i)) = ep30
313 origin(irectm(1,i)) = 0
314 origin(irectm(2,i)) = 0
315 tagnod(irectm(1,i)) = 0
316 tagnod(irectm(2,i)) = 0
320 lin = listlintotal(l)
323 tagnod(irectm(1,lin)) = 0
324 tagnod(irectm(2,lin)) = 0
325 dist1(irectm(1,lin)) = ep30
326 dist1(irectm(2,lin)) = ep30
327 origin(irectm(1,lin)) = 0
328 origin(irectm(2,lin)) = 0
330 listlintmp(1:nblin_max)=0
331 listlin(1:nblin_max)=0
335 DEALLOCATE(dist1,tagnod,origin)
343 DEALLOCATE(listlintmp)
344 DEALLOCATE(listlintotal)