29 logical invert,oldactive,altered,border
31 integer nvertex,nopes,ipe(*),ime(4,*),iactiveline(3,*),
32 & nactiveline,ifreeintersec,itri,nelemm,i,ii,j,k,nnodelem,id,
33 & nodem(*),ncvertex,node1,node2,
modf,node,indexl,ithree,
36 real*8 pvertex(3,*),xn(3),xl2sp(3,*),pa(3),pb(3),xinters(3),
37 & xcp(3),diff,dd,xl2mp(3,*),c_pvertex(3,13),t,cedge(3),xtest(3),
38 &
eplane,area,areax,areay,areaz,p1(3),p2(3),areaface
51 pvertex(k,nvertex)=xl2sp(k,j)
56 p1(1)=pvertex(1,k+1)-pvertex(1,1)
57 p1(2)=pvertex(2,k+1)-pvertex(2,1)
58 p1(3)=pvertex(3,k+1)-pvertex(3,1)
59 p2(1)=pvertex(1,k+2)-pvertex(1,1)
60 p2(2)=pvertex(2,k+2)-pvertex(2,1)
61 p2(3)=pvertex(3,k+2)-pvertex(3,1)
62 areax=((p1(2)*p2(3))-(p2(2)*p1(3)))**2
63 areay=(-(p1(1)*p2(3))+(p2(1)*p1(3)))**2
64 areaz=((p1(1)*p2(2))-(p2(1)*p1(2)))**2
65 areaface=areaface+dsqrt(areax+areay+areaz)/2.
76 node1=nodem(
modf(nnodelem,i))
77 node2=nodem(
modf(nnodelem,i+1))
79 if(node2.lt.node1)
then 87 if(ime(1,indexl).eq.node2)
exit 91 &
'*ERROR in SH:line was not properly catalogued' 92 write(*,*)
'itri',itri,
'node1',node1,
'node2',node2
97 cedge(k)=xl2mp(k,
modf(nnodelem,i+1))
98 & -xl2mp(k,
modf(nnodelem,i))
100 xcp(1)=xn(2)*cedge(3)-xn(3)*cedge(2)
101 xcp(2)=xn(3)*cedge(1)-xn(1)*cedge(3)
102 xcp(3)=xn(1)*cedge(2)-xn(2)*cedge(1)
103 dd=dsqrt(xcp(1)**2+xcp(2)**2+xcp(3)**2)
107 t=-
eplane(xl2mp(1:3,
modf(nnodelem,i)),xcp,0.d0)
112 xtest(k)=xl2mp(k,
modf(nnodelem,i+2))
114 if (
eplane(xtest,xcp,t).gt.0)
then 121 call nidentk(iactiveline,indexl, nactiveline,id,ithree)
122 if(id.gt.0.and.iactiveline(1,id).eq.indexl)
then 126 nactiveline=nactiveline-1
129 iactiveline(k,ii)=iactiveline(k,ii+1)
134 if(nvertex.lt.3) cycle
140 pa(k)=pvertex(k,
modf(nvertex,j))
141 pb(k)=pvertex(k,
modf(nvertex,j+1))
143 if(
eplane(pa,xcp,t).le.1.0d-12)
then 144 if(
eplane(pb,xcp,t).le.1.0d-12)
then 147 c_pvertex(k,ncvertex)=pb(k)
150 if(abs(
eplane(pa,xcp,t)).gt.1.0d-10)
then 152 diff=(xinters(1)-pa(1))**2+(xinters(2)-pa(2))**2+
153 & (xinters(3)-pa(3))**2
155 if(diff.gt.1.d-11)
then 158 c_pvertex(k,ncvertex)=xinters(k)
163 if((.not.oldactive).and.(.not.altered))
then 165 nactiveline=nactiveline+1
166 ifreeintersec=ifreeintersec+1
167 do ii=nactiveline,id+2,-1
169 iactiveline(k,ii)=iactiveline(k,ii-1)
172 iactiveline(1,id+1)=indexl
173 iactiveline(2,id+1)=nelemm
174 iactiveline(3,id+1)=ifreeintersec
176 insertl(ninsertl)=indexl
180 if(
eplane(pb,xcp,t).le.1.0d-12)
then 181 if(abs(
eplane(pb,xcp,t)).lt.1.0d-10)
then 187 c_pvertex(k,ncvertex)=pb(k)
193 c_pvertex(k,ncvertex-1)=xinters(k)
194 c_pvertex(k,ncvertex)=pb(k)
197 if((.not.oldactive).and.(.not.altered))
then 198 if(
eplane(pb,xcp,t).lt.0.d0.and.nvertex.gt.2)
then 200 nactiveline=nactiveline+1
201 ifreeintersec=ifreeintersec+1
202 do ii=nactiveline,id+2,-1
204 iactiveline(k,ii)=iactiveline(k,ii-1)
207 iactiveline(1,id+1)=indexl
208 iactiveline(2,id+1)=nelemm
209 iactiveline(3,id+1)=ifreeintersec
211 insertl(ninsertl)=indexl
215 if((.not.oldactive).and.(.not.altered))
then 217 nactiveline=nactiveline+1
218 ifreeintersec=ifreeintersec+1
219 do ii=nactiveline,id+2,-1
221 iactiveline(k,ii)=iactiveline(k,ii-1)
224 iactiveline(1,id+1)=indexl
225 iactiveline(2,id+1)=nelemm
226 iactiveline(3,id+1)=ifreeintersec
228 insertl(ninsertl)=indexl
238 pvertex(k,j)=c_pvertex(k,j)
252 p1(1)=pvertex(1,k+1)-pvertex(1,1)
253 p1(2)=pvertex(2,k+1)-pvertex(2,1)
254 p1(3)=pvertex(3,k+1)-pvertex(3,1)
255 p2(1)=pvertex(1,k+2)-pvertex(1,1)
256 p2(2)=pvertex(2,k+2)-pvertex(2,1)
257 p2(3)=pvertex(3,k+2)-pvertex(3,1)
258 areax=((p1(2)*p2(3))-(p2(2)*p1(3)))**2
259 areay=(-(p1(1)*p2(3))+(p2(1)*p1(3)))**2
260 areaz=((p1(1)*p2(2))-(p2(1)*p1(2)))**2
261 area=area+dsqrt(areax+areay+areaz)/2.
263 if(border)
write(20,*)
'border reached' 265 if(nvertex.lt.3.or.border)
then 269 call nidentk(iactiveline,indexl, nactiveline,id,ithree)
271 if(iactiveline(1,id).eq.indexl) oldactive=.true.
275 nactiveline=nactiveline-1
278 iactiveline(k,ii)=iactiveline(k,ii+1)
subroutine intersectionpoint(pa, pb, xcp, t, xinters)
Definition: intersectionpoint.f:20
real *8 function eplane(x, n, t)
Definition: eplane.f:20
subroutine nidentk(x, px, n, id, k)
Definition: nidentk.f:27
integer function modf(m, ix)
Definition: modf.f:20