CalculiX  2.13
A Free Software Three-Dimensional Structural Finite Element Program
angsum.f File Reference

Go to the source code of this file.

Functions/Subroutines

subroutine angsum (lakon, kon, ipkon, neigh, ipneigh, co, node, itypflag, angle)
 
real *8 function spaceangle (cotet)
 

Function/Subroutine Documentation

◆ angsum()

subroutine angsum ( character*8, dimension(*)  lakon,
integer, dimension(*)  kon,
integer, dimension(*)  ipkon,
integer, dimension(2,*)  neigh,
integer, dimension(*)  ipneigh,
real*8, dimension(3,*)  co,
integer  node,
integer  itypflag,
real*8  angle 
)
21 !
22 ! computes the sum of all spaceangles of the element edges
23 ! adjacent to a node
24 !
25 ! author: Sascha Merz
26 !
27  implicit none
28 !
29  integer kon(*),ipkon(*),ielem,j,k,lneigh4(3,4),indexe,nnr,
30  & neigh(2,*),ipneigh(*),index,m,lneigh8(3,8),nvertex,node,itypflag
31 !
32  real*8 co(3,*),angle,cotet(3,4),spaceangle
33 !
34  data lneigh4 /2,3,4,1,3,4,1,2,4,1,2,3/
35 !
36  data lneigh8 /2,4,5,1,3,6,2,4,7,1,3,8,
37  & 1,6,8,2,5,7,3,6,8,4,5,7/
38 !
39  character*8 lakon(*)
40 !
41  index=ipneigh(node)
42 !
43  angle=0.d0
44  do j=1,3
45  cotet(j,1)=co(j,node)
46  enddo
47  do
48  if(index.eq.0) exit
49  ielem=neigh(1,index)
50 !
51  if(lakon(ielem)(1:5).eq.'C3D20'.and.itypflag.eq.1) then
52  nvertex=8
53  elseif(lakon(ielem)(1:5).eq.'C3D10'.and.itypflag.eq.2) then
54  nvertex=4
55  elseif(lakon(ielem)(1:4).eq.'C3D8'.and.itypflag.eq.3) then
56  nvertex=8
57  else
58  index=neigh(2,index)
59  cycle
60  endif
61 !
62  indexe=ipkon(ielem)
63  do m=1,nvertex
64  if(kon(indexe+m).eq.node) exit
65  enddo
66  do j=1,3
67  if(nvertex.eq.4) then
68  nnr=kon(indexe+lneigh4(j,m))
69  elseif(nvertex.eq.8) then
70  nnr=kon(indexe+lneigh8(j,m))
71  endif
72  do k=1,3
73  cotet(k,j+1)=co(k,nnr)
74  enddo
75  enddo
76  angle=angle+spaceangle(cotet)
77  index=neigh(2,index)
78  enddo
79 !
80  return
real *8 function spaceangle(cotet)
Definition: angsum.f:84

◆ spaceangle()

real*8 function spaceangle ( real*8, dimension(3,4)  cotet)
84 !
85  implicit none
86 !
87  integer i,j
88  real*8 vector(3,3),ca,cb,cc,ca2,cb2,cc2,sa,sb,sc,cosa,sina,
89  & cotanb,cotanc,a,b,c,cotet(3,4),absval
90 ! calculate normal vectors
91  do i=1,3
92 ! i is vector 1, 2 and 3
93  do j=1,3
94 ! j is x,y,z
95  vector(j,i)=cotet(j,i+1)-cotet(j,1)
96  enddo
97  absval=dsqrt(vector(1,i)*vector(1,i)
98  & +vector(2,i)*vector(2,i)
99  & +vector(3,i)*vector(3,i))
100  do j=1,3
101  vector(j,i)=vector(j,i)/absval
102 ! write(*,*) 'vektor ij',i,j,' ist',vector(i,j)
103  enddo
104  enddo
105 !
106  ca=vector(1,1)*vector(1,2)+vector(2,1)*vector(2,2)+
107  & vector(3,1)*vector(3,2)
108  cb=vector(1,2)*vector(1,3)+vector(2,2)*vector(2,3)+
109  & vector(3,2)*vector(3,3)
110  cc=vector(1,1)*vector(1,3)+vector(2,1)*vector(2,3)+
111  & vector(3,1)*vector(3,3)
112 !
113  ca2=min(ca*ca,1.d0)
114  cb2=min(cb*cb,1.d0)
115  cc2=min(cc*cc,1.d0)
116 !
117  sa=dsqrt(1.d0-ca2)
118  sb=dsqrt(1.d0-cb2)
119  sc=dsqrt(1.d0-cc2)
120 !
121  if((dabs(sa).lt.1.d-8).or.(dabs(sb).lt.1.d-8).or.
122  & (dabs(sc).lt.1.d-8)) then
123  spaceangle=0.d0
124  return
125  endif
126 !
127 ! sa=dsqrt(1.d0-ca*ca)
128 ! sb=dsqrt(1.d0-cb*cb)
129 ! sc=dsqrt(1.d0-cc*cc)
130 !
131  cosa=(ca-cb*cc)/(sb*sc)
132  sina=dsqrt(1.d0-cosa*cosa)
133  cotanb=(sc*cb/sb-cosa*cc)/sina
134  cotanc=(sb*cc/sc-cosa*cb)/sina
135 !
136  a=dacos(cosa)
137  b=datan(1.d0/cotanb)
138  c=datan(1.d0/cotanc)
139 !
140  if(b.lt.0) b=b+3.141592653589793d0
141  if(c.lt.0) c=c+3.141592653589793d0
142 !
143  spaceangle=a+b+c-3.141592653589793d0
144 !
145  return
#define min(a, b)
Definition: cascade.c:31
real *8 function spaceangle(cotet)
Definition: angsum.f:84
Hosted by OpenAircraft.com, (Michigan UAV, LLC)