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

Go to the source code of this file.

Functions/Subroutines

subroutine gen3dconnect (kon, ipkon, lakon, ne, iponoel, inoel, iponoelmax, rig, iponor, xnor, knor, ipompc, nodempc, coefmpc, nmpc, nmpc_, mpcfree, ikmpc, ilmpc, labmpc)
 

Function/Subroutine Documentation

◆ gen3dconnect()

subroutine gen3dconnect ( integer, dimension(*)  kon,
integer, dimension(*)  ipkon,
character*8, dimension(*)  lakon,
integer  ne,
integer, dimension(*)  iponoel,
integer, dimension(3,*)  inoel,
integer  iponoelmax,
integer, dimension(*)  rig,
integer, dimension(2,*)  iponor,
real*8, dimension(*)  xnor,
integer, dimension(*)  knor,
integer, dimension(*)  ipompc,
integer, dimension(3,*)  nodempc,
real*8, dimension(*)  coefmpc,
integer  nmpc,
integer  nmpc_,
integer  mpcfree,
integer, dimension(*)  ikmpc,
integer, dimension(*)  ilmpc,
character*20, dimension(*)  labmpc 
)
22 !
23 ! connects expanded 1-D and 2-D elements with genuine 3D elements
24 ! or spring elements or mass elements
25 !
26  implicit none
27 !
28  character*8 lakon(*)
29  character*20 labmpc(*)
30 !
31  integer kon(*),ipkon(*),ne,iponoel(*),inoel(3,*),iponoelmax,
32  & rig(*),iponor(2,*),knor(*),ipompc(*),nodempc(3,*),nmpc,nmpc_,
33  & mpcfree,ikmpc(*),ilmpc(*),i,indexes,nope,l,node,index2,ielem,
34  & indexe,j,indexk,newnode,idir,idof,id,mpcfreenew,k
35 !
36  real*8 xnor(*),coefmpc(*)
37 !
38 ! generating MPC's to connect shells and beams with solid
39 ! elements or spring elements or mass elements
40 !
41  do i=1,ne
42  indexes=ipkon(i)
43  if(indexes.lt.0) cycle
44 !
45 ! looking for solid elements or spring elements or
46 ! mass elements only
47 !
48  if((lakon(i)(7:7).ne.' ').and.(lakon(i)(1:1).ne.'E')) cycle
49 !
50 ! determining the number of nodes belonging to the element
51 !
52  if(lakon(i)(4:4).eq.'4') then
53  nope=4
54  elseif(lakon(i)(4:4).eq.'6') then
55  nope=6
56  elseif(lakon(i)(4:4).eq.'8') then
57  nope=8
58  elseif(lakon(i)(4:5).eq.'10') then
59  nope=10
60  elseif(lakon(i)(4:5).eq.'15') then
61  nope=15
62  elseif(lakon(i)(4:4).eq.'2') then
63  nope=20
64  elseif(lakon(i)(1:1).eq.'E') then
65  read(lakon(i)(8:8),'(i1)') nope
66  nope=nope+1
67  elseif(lakon(i)(1:4).eq.'MASS') then
68  nope=1
69  else
70  cycle
71  endif
72 !
73  do l=1,nope
74  node=kon(indexes+l)
75  if(node.le.iponoelmax) then
76  if(rig(node).eq.0) then
77  index2=iponoel(node)
78  if(index2.eq.0) cycle
79  ielem=inoel(1,index2)
80  indexe=ipkon(ielem)
81  j=inoel(2,index2)
82  indexk=iponor(2,indexe+j)
83 !
84 ! 2d shell element: the exterior expanded nodes
85 ! are connected to the non-expanded node
86 !
87  if(lakon(ielem)(7:7).eq.'L') then
88  newnode=knor(indexk+1)
89  do idir=0,3
90  idof=8*(newnode-1)+idir
91  call nident(ikmpc,idof,nmpc,id)
92  if((id.le.0).or.(ikmpc(id).ne.idof)) then
93  nmpc=nmpc+1
94  if(nmpc.gt.nmpc_) then
95  write(*,*)
96  & '*ERROR in gen3dconnect: increase nmpc_'
97  call exit(201)
98  endif
99  labmpc(nmpc)=' '
100  ipompc(nmpc)=mpcfree
101  do j=nmpc,id+2,-1
102  ikmpc(j)=ikmpc(j-1)
103  ilmpc(j)=ilmpc(j-1)
104  enddo
105  ikmpc(id+1)=idof
106  ilmpc(id+1)=nmpc
107  nodempc(1,mpcfree)=newnode
108  nodempc(2,mpcfree)=idir
109  coefmpc(mpcfree)=1.d0
110  mpcfree=nodempc(3,mpcfree)
111  if(mpcfree.eq.0) then
112  write(*,*)
113  & '*ERROR in gen3dconnect: increase memmpc_'
114  call exit(201)
115  endif
116  nodempc(1,mpcfree)=knor(indexk+3)
117  nodempc(2,mpcfree)=idir
118  coefmpc(mpcfree)=1.d0
119  mpcfree=nodempc(3,mpcfree)
120  if(mpcfree.eq.0) then
121  write(*,*)
122  & '*ERROR in gen3dconnect: increase memmpc_'
123  call exit(201)
124  endif
125  nodempc(1,mpcfree)=node
126  nodempc(2,mpcfree)=idir
127  coefmpc(mpcfree)=-2.d0
128  mpcfreenew=nodempc(3,mpcfree)
129  if(mpcfreenew.eq.0) then
130  write(*,*)
131  & '*ERROR in gen3dconnect: increase memmpc_'
132  call exit(201)
133  endif
134  nodempc(3,mpcfree)=0
135  mpcfree=mpcfreenew
136  endif
137  enddo
138  elseif(lakon(ielem)(7:7).eq.'B') then
139 !
140 ! 1d beam element: corner nodes are connected to
141 ! the not-expanded node
142 !
143  newnode=knor(indexk+1)
144  do idir=0,3
145  idof=8*(newnode-1)+idir
146  call nident(ikmpc,idof,nmpc,id)
147  if((id.le.0).or.(ikmpc(id).ne.idof)) then
148  nmpc=nmpc+1
149  if(nmpc.gt.nmpc_) then
150  write(*,*)
151  & '*ERROR in gen3dconnect: increase nmpc_'
152  call exit(201)
153  endif
154  labmpc(nmpc)=' '
155  ipompc(nmpc)=mpcfree
156  do j=nmpc,id+2,-1
157  ikmpc(j)=ikmpc(j-1)
158  ilmpc(j)=ilmpc(j-1)
159  enddo
160  ikmpc(id+1)=idof
161  ilmpc(id+1)=nmpc
162  nodempc(1,mpcfree)=newnode
163  nodempc(2,mpcfree)=idir
164  coefmpc(mpcfree)=1.d0
165  mpcfree=nodempc(3,mpcfree)
166  if(mpcfree.eq.0) then
167  write(*,*)
168  & '*ERROR in gen3dconnect: increase memmpc_'
169  call exit(201)
170  endif
171  do k=2,4
172  nodempc(1,mpcfree)=knor(indexk+k)
173  nodempc(2,mpcfree)=idir
174  coefmpc(mpcfree)=1.d0
175  mpcfree=nodempc(3,mpcfree)
176  if(mpcfree.eq.0) then
177  write(*,*)
178  & '*ERROR in gen3dconnect: increase memmpc_'
179  call exit(201)
180  endif
181  enddo
182  nodempc(1,mpcfree)=node
183  nodempc(2,mpcfree)=idir
184  coefmpc(mpcfree)=-4.d0
185  mpcfreenew=nodempc(3,mpcfree)
186  if(mpcfreenew.eq.0) then
187  write(*,*)
188  & '*ERROR in gen3dconnect: increase memmpc_'
189  call exit(201)
190  endif
191  nodempc(3,mpcfree)=0
192  mpcfree=mpcfreenew
193  endif
194  enddo
195  else
196 !
197 ! 2d plane stress, plane strain or axisymmetric
198 ! element: the expanded middle node (this is the
199 ! "governing" node for these elements) is connected to
200 ! the non-expanded node
201 !
202  newnode=knor(indexk+2)
203  do idir=0,2
204  idof=8*(newnode-1)+idir
205  call nident(ikmpc,idof,nmpc,id)
206  if((id.le.0).or.(ikmpc(id).ne.idof)) then
207  nmpc=nmpc+1
208  if(nmpc.gt.nmpc_) then
209  write(*,*)
210  & '*ERROR in gen3dconnect: increase nmpc_'
211  call exit(201)
212  endif
213  labmpc(nmpc)=' '
214  ipompc(nmpc)=mpcfree
215  do j=nmpc,id+2,-1
216  ikmpc(j)=ikmpc(j-1)
217  ilmpc(j)=ilmpc(j-1)
218  enddo
219  ikmpc(id+1)=idof
220  ilmpc(id+1)=nmpc
221  nodempc(1,mpcfree)=newnode
222  nodempc(2,mpcfree)=idir
223  coefmpc(mpcfree)=1.d0
224  mpcfree=nodempc(3,mpcfree)
225  if(mpcfree.eq.0) then
226  write(*,*)
227  & '*ERROR in gen3dconnect: increase memmpc_'
228  call exit(201)
229  endif
230  nodempc(1,mpcfree)=node
231  nodempc(2,mpcfree)=idir
232  coefmpc(mpcfree)=-1.d0
233  mpcfreenew=nodempc(3,mpcfree)
234  if(mpcfreenew.eq.0) then
235  write(*,*)
236  & '*ERROR in gen3dconnect: increase memmpc_'
237  call exit(201)
238  endif
239  nodempc(3,mpcfree)=0
240  mpcfree=mpcfreenew
241  endif
242  enddo
243  endif
244  endif
245  endif
246  enddo
247  enddo
248 !
249  return
subroutine nident(x, px, n, id)
Definition: nident.f:26
Hosted by OpenAircraft.com, (Michigan UAV, LLC)