19 & (namesec, nparts, nelem, ndp, ikle, npoin, f, knogl)
35 USE bief, ONLY : chain_type,nbmaxnshare
39 CHARACTER(LEN=PATH_LEN),
INTENT(IN) :: NAMESEC
40 INTEGER,
INTENT(IN) :: NELEM, NDP
41 INTEGER,
INTENT(IN) :: IKLE(nelem,ndp)
42 INTEGER,
INTENT(IN) :: NPOIN
43 INTEGER,
INTENT(IN) :: NPARTS
44 DOUBLE PRECISION,
INTENT(IN) :: F(npoin,2)
50 type(chain_type),
ALLOCATABLE :: chain(:)
51 INTEGER,
PARAMETER :: NSEMAX=500
52 INTEGER,
ALLOCATABLE :: LISTE(:,:), ANPBEG(:),ANPEND(:)
53 INTEGER :: NSEC, IHOWSEC, ISEC, IELEM, IM(1), IN(1), NPBEG, NPEND
54 INTEGER :: PT, I1,I2,I3, ARR,DEP, ILPREC,ILBEST,ELBEST,IGBEST
55 DOUBLE PRECISION :: XA, YA, DISTB, DISTE, DMINB, DMINE
56 DOUBLE PRECISION :: DIST1, DIST2, DIST3, DIST
58 INTEGER :: I, IERR, ISEG, J, K, M, N
60 CHARACTER(LEN=11) :: EXTENS
63 CHARACTER(LEN=PATH_LEN) :: NAMEOUT
65 CALL get_free_id(nsct)
66 OPEN (nsct,file=trim(namesec),form=
'FORMATTED',status=
'OLD')
68 READ (nsct,*) nsec, ihowsec
69 IF (.NOT.
ALLOCATED(chain))
ALLOCATE (chain(nsec))
72 READ (nsct,*) chain(isec)%DESCR
73 READ (nsct,*) chain(isec)%NPAIR(:)
74 chain(isec)%XYBEG(1)=f(chain(isec)%NPAIR(1),1)
75 chain(isec)%XYBEG(2)=f(chain(isec)%NPAIR(1),2)
76 chain(isec)%XYEND(1)=f(chain(isec)%NPAIR(2),1)
77 chain(isec)%XYEND(2)=f(chain(isec)%NPAIR(2),2)
78 WRITE(
lu,*)
'SECTION ',chain(isec)%DESCR
79 WRITE(
lu,*)
'BEGINS AT X=',chain(isec)%XYBEG(1),
80 &
' Y=',chain(isec)%XYBEG(2)
81 WRITE(
lu,*)
'ENDS AT X=',chain(isec)%XYEND(1),
82 &
' Y=',chain(isec)%XYEND(2)
86 READ (nsct,*) chain(isec)%DESCR
88 & ( chain(isec)%XYBEG(i), i = 1,
SIZE(chain(isec)%XYBEG(:),1) ),
89 & ( chain(isec)%XYEND(i), i = 1,
SIZE(chain(isec)%XYEND(:),1) )
90 chain(isec)%NPAIR(:)=0
97 WRITE(
lu,*)
'NPOIN:',npoin
102 dminb = (chain(isec)%XYBEG(1)-xa)**2
103 & + (chain(isec)%XYBEG(2)-ya)**2
104 dmine = (chain(isec)%XYEND(1)-xa)**2
105 & + (chain(isec)%XYEND(2)-ya)**2
106 chain(isec)%NPAIR(1)=1
107 chain(isec)%NPAIR(2)=1
111 distb = (chain(isec)%XYBEG(1)-xa)**2
112 & + (chain(isec)%XYBEG(2)-ya)**2
113 diste = (chain(isec)%XYEND(1)-xa)**2
114 & + (chain(isec)%XYEND(2)-ya)**2
115 IF ( distb < dminb )
THEN 116 chain(isec)%NPAIR(1)=i
119 IF ( diste < dmine )
THEN 120 chain(isec)%NPAIR(2)=i
124 WRITE(
lu,
'(A,3(1X,I9))')
125 &
' -> SECTION, TERMINAL NODES: ',
126 & isec, chain(isec)%NPAIR(:)
130 WRITE(
lu,
'(A,1X,I9,4(1X,1PG13.6))')
131 &
' -> SECTION, TERMINAL COORDINATES: ', isec,
132 & chain(isec)%XYBEG, chain(isec)%XYEND
136 WRITE(
lu,*)
'NSEC,IHOWSEC: ',nsec,ihowsec
137 WRITE(
lu,*)
'ANTICIPATED SECTIONS SUMMARY:' 139 WRITE(
lu,*) chain(isec)%DESCR
140 WRITE(
lu,*) chain(isec)%XYBEG(:), chain(isec)%XYEND(:)
141 WRITE(
lu,*) chain(isec)%NPAIR(:)
147 ALLOCATE(liste(nsemax,2),stat=ierr)
148 CALL check_allocate(ierr,
'LISTE')
152 dep = chain(isec)%NPAIR(1)
153 arr = chain(isec)%NPAIR(2)
157 dist=(f(dep,1)-f(arr,1))**2+(f(dep,2)-f(arr,2))**2
165 IF (pt.EQ.i1.OR.pt.EQ.i2.OR.pt.EQ.i3)
THEN 166 dist1 = (f(i1,1)-f(arr,1))**2 + (f(i1,2)-f(arr,2))**2
167 dist2 = (f(i2,1)-f(arr,1))**2 + (f(i2,2)-f(arr,2))**2
168 dist3 = (f(i3,1)-f(arr,1))**2 + (f(i3,2)-f(arr,2))**2
169 IF (dist1.LT.dist)
THEN 174 IF(i1.EQ.pt) ilprec = 1
175 IF(i2.EQ.pt) ilprec = 2
176 IF(i3.EQ.pt) ilprec = 3
178 IF (dist2.LT.dist)
THEN 183 IF(i1.EQ.pt) ilprec = 1
184 IF(i2.EQ.pt) ilprec = 2
185 IF(i3.EQ.pt) ilprec = 3
187 IF(dist3.LT.dist)
THEN 192 IF(i1.EQ.pt) ilprec = 1
193 IF(i2.EQ.pt) ilprec = 2
194 IF(i3.EQ.pt) ilprec = 3
200 IF (igbest.EQ.pt)
THEN 201 WRITE(
lu,*)
'FLUSEC : ALGORITHM FAILED' 207 IF (iseg.GT.nsemax)
THEN 208 WRITE(
lu,*)
'TOO MANY SEGMENTS IN A ' 209 WRITE(
lu,*)
'SECTION. INCREASE NSEMAX' 213 liste(iseg,1) = ikle(elbest,ilprec)
214 liste(iseg,2) = ikle(elbest,ilbest)
215 IF (igbest.NE.arr)
GOTO 1010
217 chain(isec)%NSEG = iseg
218 ALLOCATE (chain(isec)%LISTE(chain(isec)%NSEG,3), stat=ierr)
219 CALL check_allocate(ierr,
'CHAIN(ISEC)%LISTE')
220 DO iseg=1,chain(isec)%NSEG
221 chain(isec)%LISTE(iseg,1)=liste(iseg,1)
222 chain(isec)%LISTE(iseg,2)=liste(iseg,2)
223 chain(isec)%LISTE(iseg,3)=-1
228 ALLOCATE (anpbeg(nbmaxnshare), stat=ierr)
229 CALL check_allocate(ierr,
'ANPBEG')
230 ALLOCATE (anpend(nbmaxnshare), stat=ierr)
231 CALL check_allocate(ierr,
'ANPEND')
234 DO iseg=1,chain(isec)%NSEG
250 IF (npbeg>nbmaxnshare .OR. npend>nbmaxnshare)
THEN 251 WRITE(
lu,*)
'NPBEG OR NPEND: ',npbeg,npend
252 WRITE(
lu,*)
'ARE LARGER THAN NBMAXNSHARE: ',nbmaxnshare
259 IF ( npbeg==1 .AND. npend==1)
THEN 282 IF (im(1)==in(1))
THEN 283 chain(isec)%LISTE(iseg,3)=im(1)
285 WRITE(
lu,*)
'IMPOSSIBLE CASE (1) BY SECTIONS' 292 IF (npbeg==1 .AND. npend>1)
THEN 304 & chain(isec)%LISTE(iseg,2),im(1))>0 )
THEN 305 chain(isec)%LISTE(iseg,3) = im(1)
307 WRITE(
lu,*)
'IMPOSSIBLE CASE (2) BY SECTIONS' 311 ELSE IF (npbeg>1 .AND. npend==1)
THEN 323 & chain(isec)%LISTE(iseg,1),in(1))>0 )
THEN 324 chain(isec)%LISTE(iseg,3) = in(1)
326 WRITE(
lu,*)
'IMPOSSIBLE CASE (3) BY SECTIONS' 336 & chain(isec)%LISTE(iseg,1),n)>0 )
THEN 341 IF (i/=npbeg)
WRITE(
lu,*)
'OH! I/=NPBEG' 345 & chain(isec)%LISTE(iseg,2),n)>0 )
THEN 350 IF (i/=npend)
WRITE(
lu,*)
'OH! I/=NPEND' 352 WRITE(
lu,*)
'ANPBEG: ',anpbeg
353 WRITE(
lu,*)
'ANPEND: ',anpend
358 IF (anpbeg(i)==anpend(j))
THEN 359 chain(isec)%LISTE(iseg,3) = anpbeg(i)
367 WRITE(
lu,*)
'BY SECTION WITH NODES: ',
368 & chain(isec)%LISTE(iseg,1),chain(isec)%LISTE(iseg,2)
369 WRITE(
lu,*)
'IMPOSSIBLE CASE (4) BY SECTIONS' 379 DEALLOCATE (anpbeg,anpend)
384 nameout=trim(namesec)//extens(nparts-1,n-1)
386 WRITE(
lu,*)
'WRITING: ', trim(nameout)
388 OPEN(nsct,file=trim(nameout),form=
'FORMATTED',status=
'UNKNOWN')
390 WRITE(nsct,*)
'# SECTIONS PARTITIONED FOR ',
391 & extens(nparts-1,n-1)
392 WRITE(nsct,*) nsec, 1
394 WRITE(nsct,*) trim(chain(isec)%DESCR)
395 i=count(chain(isec)%LISTE(:,3)==n)
397 DO iseg=1,chain(isec)%NSEG
398 IF (chain(isec)%LISTE(iseg,3)==n)
THEN subroutine handle_sections(NAMESEC, NPARTS, NELEM, NDP, IKLE, NPOIN, F, KNOGL)
integer function hash_table_get(HT, X, Y)