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

Go to the source code of this file.

Functions/Subroutines

subroutine gen3dfrom1d (i, kon, ipkon, lakon, ne, iponor, xnor, knor, thicke, ntrans, inotr, trab, nk, nk_, co, offset, mi)
 

Function/Subroutine Documentation

◆ gen3dfrom1d()

subroutine gen3dfrom1d ( integer  i,
integer, dimension(*)  kon,
integer, dimension(*)  ipkon,
character*8, dimension(*)  lakon,
integer  ne,
integer, dimension(2,*)  iponor,
real*8, dimension(*)  xnor,
integer, dimension(*)  knor,
real*8, dimension(mi(3),*)  thicke,
integer  ntrans,
integer, dimension(2,*)  inotr,
real*8, dimension(7,*)  trab,
integer  nk,
integer  nk_,
real*8, dimension(3,*)  co,
real*8, dimension(2,*)  offset,
integer, dimension(*)  mi 
)
21 !
22 ! expands 1d element i into a 3d element
23 !
24  implicit none
25 !
26  character*8 lakon(*)
27 !
28  integer mi(*),i,kon(*),ipkon(*),ne,iponor(2,*),knor(*),ntrans,
29  & inotr(2,*),nk,nk_,indexe,j,nodel(8),indexx,indexk,k,nodeb(8,3),
30  & nope,ishift
31 !
32  real*8 xnor(*),thicke(mi(3),*),trab(7,*),co(3,*),offset(2,*),
33  & thickb(2,3),xnorb(6,3),sc
34 !
35  indexe=ipkon(i)
36 !
37 ! check whether linear or quadratic
38 !
39  if((lakon(i)(3:3).eq.'1').or.(lakon(i)(4:4).eq.'2')) then
40  nope=2
41  if(lakon(i)(4:4).eq.'R') then
42  ishift=8
43  else
44  ishift=11
45  endif
46  elseif((lakon(i)(3:3).eq.'2').or.(lakon(i)(4:5).eq.'3')) then
47  nope=3
48  ishift=20
49  endif
50 !
51 ! localizing the nodes, thicknesses and normals for the
52 ! beam element
53 !
54 c do j=1,3
55  do j=1,nope
56  nodel(j)=kon(indexe+j)
57  kon(indexe+ishift+j)=nodel(j)
58  indexx=iponor(1,indexe+j)
59  indexk=iponor(2,indexe+j)
60  thickb(1,j)=thicke(1,indexe+j)
61  thickb(2,j)=thicke(2,indexe+j)
62  do k=1,6
63  xnorb(k,j)=xnor(indexx+k)
64  enddo
65  do k=1,8
66  nodeb(k,j)=knor(indexk+k)
67  enddo
68  if(ntrans.gt.0) then
69  do k=1,8
70  inotr(1,nodeb(k,j))=inotr(1,nodel(j))
71  enddo
72  endif
73  enddo
74 !
75 ! generating the 3-D element topology for beam elements
76 !
77 ! rectangular cross section (or parent section)
78 !
79  if(lakon(i)(8:8).ne.'C') then
80  kon(indexe+1)=nodeb(1,1)
81  do j=1,3
82  co(j,nodeb(1,1))=co(j,nodel(1))
83  & -thickb(1,1)*xnorb(j,1)*(.5d0+offset(1,i))
84  & +thickb(2,1)*xnorb(j+3,1)*(.5d0-offset(2,i))
85  enddo
86  kon(indexe+2)=nodeb(1,nope)
87  do j=1,3
88  co(j,nodeb(1,nope))=co(j,nodel(nope))
89  & -thickb(1,nope)*xnorb(j,nope)*(.5d0+offset(1,i))
90  & +thickb(2,nope)*xnorb(j+3,nope)*(.5d0-offset(2,i))
91  enddo
92  kon(indexe+3)=nodeb(2,nope)
93  do j=1,3
94  co(j,nodeb(2,nope))=co(j,nodel(nope))
95  & -thickb(1,nope)*xnorb(j,nope)*(.5d0+offset(1,i))
96  & -thickb(2,nope)*xnorb(j+3,nope)*(.5d0+offset(2,i))
97  enddo
98  kon(indexe+4)=nodeb(2,1)
99  do j=1,3
100  co(j,nodeb(2,1))=co(j,nodel(1))
101  & -thickb(1,1)*xnorb(j,1)*(.5d0+offset(1,i))
102  & -thickb(2,1)*xnorb(j+3,1)*(.5d0+offset(2,i))
103  enddo
104  kon(indexe+5)=nodeb(4,1)
105  do j=1,3
106  co(j,nodeb(4,1))=co(j,nodel(1))
107  & +thickb(1,1)*xnorb(j,1)*(.5d0-offset(1,i))
108  & +thickb(2,1)*xnorb(j+3,1)*(.5d0-offset(2,i))
109  enddo
110  kon(indexe+6)=nodeb(4,nope)
111  do j=1,3
112  co(j,nodeb(4,nope))=co(j,nodel(nope))
113  & +thickb(1,nope)*xnorb(j,nope)*(.5d0-offset(1,i))
114  & +thickb(2,nope)*xnorb(j+3,nope)*(.5d0-offset(2,i))
115  enddo
116  kon(indexe+7)=nodeb(3,nope)
117  do j=1,3
118  co(j,nodeb(3,nope))=co(j,nodel(nope))
119  & +thickb(1,nope)*xnorb(j,nope)*(.5d0-offset(1,i))
120  & -thickb(2,nope)*xnorb(j+3,nope)*(.5d0+offset(2,i))
121  enddo
122  kon(indexe+8)=nodeb(3,1)
123  do j=1,3
124  co(j,nodeb(3,1))=co(j,nodel(1))
125  & +thickb(1,1)*xnorb(j,1)*(.5d0-offset(1,i))
126  & -thickb(2,1)*xnorb(j+3,1)*(.5d0+offset(2,i))
127  enddo
128 !
129 ! middle nodes for quadratic elements
130 !
131  if(nope.eq.3) then
132  kon(indexe+9)=nodeb(1,2)
133  do j=1,3
134  co(j,nodeb(1,2))=co(j,nodel(2))
135  & -thickb(1,2)*xnorb(j,2)*(.5d0+offset(1,i))
136  & +thickb(2,2)*xnorb(j+3,2)*(.5d0-offset(2,i))
137  enddo
138  kon(indexe+10)=nodeb(5,3)
139  do j=1,3
140  co(j,nodeb(5,3))=co(j,nodel(3))
141  & -thickb(1,3)*xnorb(j,3)*(.5d0+offset(1,i))
142  & -thickb(2,3)*xnorb(j+3,3)*offset(2,i)
143  enddo
144  kon(indexe+11)=nodeb(2,2)
145  do j=1,3
146  co(j,nodeb(2,2))=co(j,nodel(2))
147  & -thickb(1,2)*xnorb(j,2)*(.5d0+offset(1,i))
148  & -thickb(2,2)*xnorb(j+3,2)*(.5d0+offset(2,i))
149  enddo
150  kon(indexe+12)=nodeb(5,1)
151  do j=1,3
152  co(j,nodeb(5,1))=co(j,nodel(1))
153  & -thickb(1,1)*xnorb(j,1)*(.5d0+offset(1,i))
154  & -thickb(2,1)*xnorb(j+3,1)*offset(2,i)
155  enddo
156  kon(indexe+13)=nodeb(4,2)
157  do j=1,3
158  co(j,nodeb(4,2))=co(j,nodel(2))
159  & +thickb(1,2)*xnorb(j,2)*(.5d0-offset(1,i))
160  & +thickb(2,2)*xnorb(j+3,2)*(.5d0-offset(2,i))
161  enddo
162  kon(indexe+14)=nodeb(7,3)
163  do j=1,3
164  co(j,nodeb(7,3))=co(j,nodel(3))
165  & +thickb(1,3)*xnorb(j,3)*(.5d0-offset(1,i))
166  & -thickb(2,3)*xnorb(j+3,3)*offset(2,i)
167  enddo
168  kon(indexe+15)=nodeb(3,2)
169  do j=1,3
170  co(j,nodeb(3,2))=co(j,nodel(2))
171  & +thickb(1,2)*xnorb(j,2)*(.5d0-offset(1,i))
172  & -thickb(2,2)*xnorb(j+3,2)*(.5d0+offset(2,i))
173  enddo
174  kon(indexe+16)=nodeb(7,1)
175  do j=1,3
176  co(j,nodeb(7,1))=co(j,nodel(1))
177  & +thickb(1,1)*xnorb(j,1)*(.5d0-offset(1,i))
178  & -thickb(2,1)*xnorb(j+3,1)*offset(2,i)
179  enddo
180  kon(indexe+17)=nodeb(8,1)
181  do j=1,3
182  co(j,nodeb(8,1))=co(j,nodel(1))
183  & -thickb(1,1)*xnorb(j,1)*offset(1,i)
184  & +thickb(2,1)*xnorb(j+3,1)*(.5d0-offset(2,i))
185  enddo
186  kon(indexe+18)=nodeb(8,3)
187  do j=1,3
188  co(j,nodeb(8,3))=co(j,nodel(3))
189  & -thickb(1,3)*xnorb(j,3)*offset(1,i)
190  & +thickb(2,3)*xnorb(j+3,3)*(.5d0-offset(2,i))
191  enddo
192  kon(indexe+19)=nodeb(6,3)
193  do j=1,3
194  co(j,nodeb(6,3))=co(j,nodel(3))
195  & -thickb(1,3)*xnorb(j,3)*offset(1,i)
196  & -thickb(2,3)*xnorb(j+3,3)*(.5d0+offset(2,i))
197  enddo
198  kon(indexe+20)=nodeb(6,1)
199  do j=1,3
200  co(j,nodeb(6,1))=co(j,nodel(1))
201  & -thickb(1,1)*xnorb(j,1)*offset(1,i)
202  & -thickb(2,1)*xnorb(j+3,1)*(.5d0+offset(2,i))
203  enddo
204 !
205 ! generating coordinates for the expanded nodes which
206 ! are not used by the C3D20(R) element (needed for the
207 ! determination of the knot dimension)
208 !
209  do j=1,3
210  co(j,nodeb(5,2))=co(j,nodel(2))
211  & -thickb(1,1)*xnorb(j,1)*(.5d0+offset(1,i))
212  & -thickb(2,1)*xnorb(j+3,1)*offset(2,i)
213  enddo
214  do j=1,3
215  co(j,nodeb(7,2))=co(j,nodel(2))
216  & +thickb(1,1)*xnorb(j,1)*(.5d0-offset(1,i))
217  & -thickb(2,1)*xnorb(j+3,1)*offset(2,i)
218  enddo
219  do j=1,3
220  co(j,nodeb(8,2))=co(j,nodel(2))
221  & -thickb(1,1)*xnorb(j,1)*offset(1,i)
222  & +thickb(2,1)*xnorb(j+3,1)*(.5d0-offset(2,i))
223  enddo
224  do j=1,3
225  co(j,nodeb(6,2))=co(j,nodel(2))
226  & -thickb(1,1)*xnorb(j,1)*offset(1,i)
227  & -thickb(2,1)*xnorb(j+3,1)*(.5d0+offset(2,i))
228  enddo
229  endif
230  else
231 !
232 ! circular cross section
233 !
234  if(nope.eq.2) then
235  write(*,*) '*ERROR in gen3dfrom1d: element ',i,
236  & 'is a linear beam element with circular cross section'
237  write(*,*) ' Please use quadratic elements for beams
238  &with circular cross section.'
239  call exit(201)
240  endif
241 !
242  sc=.5d0/dsqrt(2.d0)
243  kon(indexe+1)=nodeb(1,1)
244  do j=1,3
245  co(j,nodeb(1,1))=co(j,nodel(1))
246  & -thickb(1,1)*xnorb(j,1)*(sc+offset(1,i))
247  & +thickb(2,1)*xnorb(j+3,1)*(sc-offset(2,i))
248  enddo
249  kon(indexe+2)=nodeb(1,3)
250  do j=1,3
251  co(j,nodeb(1,3))=co(j,nodel(3))
252  & -thickb(1,3)*xnorb(j,3)*(sc+offset(1,i))
253  & +thickb(2,3)*xnorb(j+3,3)*(sc-offset(2,i))
254  enddo
255  kon(indexe+3)=nodeb(2,3)
256  do j=1,3
257  co(j,nodeb(2,3))=co(j,nodel(3))
258  & -thickb(1,3)*xnorb(j,3)*(sc+offset(1,i))
259  & -thickb(2,3)*xnorb(j+3,3)*(sc+offset(2,i))
260  enddo
261  kon(indexe+4)=nodeb(2,1)
262  do j=1,3
263  co(j,nodeb(2,1))=co(j,nodel(1))
264  & -thickb(1,1)*xnorb(j,1)*(sc+offset(1,i))
265  & -thickb(2,1)*xnorb(j+3,1)*(sc+offset(2,i))
266  enddo
267  kon(indexe+5)=nodeb(4,1)
268  do j=1,3
269  co(j,nodeb(4,1))=co(j,nodel(1))
270  & +thickb(1,1)*xnorb(j,1)*(sc-offset(1,i))
271  & +thickb(2,1)*xnorb(j+3,1)*(sc-offset(2,i))
272  enddo
273  kon(indexe+6)=nodeb(4,3)
274  do j=1,3
275  co(j,nodeb(4,3))=co(j,nodel(3))
276  & +thickb(1,3)*xnorb(j,3)*(sc-offset(1,i))
277  & +thickb(2,3)*xnorb(j+3,3)*(sc-offset(2,i))
278  enddo
279  kon(indexe+7)=nodeb(3,3)
280  do j=1,3
281  co(j,nodeb(3,3))=co(j,nodel(3))
282  & +thickb(1,3)*xnorb(j,3)*(sc-offset(1,i))
283  & -thickb(2,3)*xnorb(j+3,3)*(sc+offset(2,i))
284  enddo
285  kon(indexe+8)=nodeb(3,1)
286  do j=1,3
287  co(j,nodeb(3,1))=co(j,nodel(1))
288  & +thickb(1,1)*xnorb(j,1)*(sc-offset(1,i))
289  & -thickb(2,1)*xnorb(j+3,1)*(sc+offset(2,i))
290  enddo
291  kon(indexe+9)=nodeb(1,2)
292  do j=1,3
293  co(j,nodeb(1,2))=co(j,nodel(2))
294  & -thickb(1,2)*xnorb(j,2)*(sc+offset(1,i))
295  & +thickb(2,2)*xnorb(j+3,2)*(sc-offset(2,i))
296  enddo
297  kon(indexe+10)=nodeb(5,3)
298  do j=1,3
299  co(j,nodeb(5,3))=co(j,nodel(3))
300  & -thickb(1,3)*xnorb(j,3)*(.5d0+offset(1,i))
301  & -thickb(2,3)*xnorb(j+3,3)*offset(2,i)
302  enddo
303  kon(indexe+11)=nodeb(2,2)
304  do j=1,3
305  co(j,nodeb(2,2))=co(j,nodel(2))
306  & -thickb(1,2)*xnorb(j,2)*(sc+offset(1,i))
307  & -thickb(2,2)*xnorb(j+3,2)*(sc+offset(2,i))
308  enddo
309  kon(indexe+12)=nodeb(5,1)
310  do j=1,3
311  co(j,nodeb(5,1))=co(j,nodel(1))
312  & -thickb(1,1)*xnorb(j,1)*(.5d0+offset(1,i))
313  & -thickb(2,1)*xnorb(j+3,1)*offset(2,i)
314  enddo
315  kon(indexe+13)=nodeb(4,2)
316  do j=1,3
317  co(j,nodeb(4,2))=co(j,nodel(2))
318  & +thickb(1,2)*xnorb(j,2)*(sc-offset(1,i))
319  & +thickb(2,2)*xnorb(j+3,2)*(sc-offset(2,i))
320  enddo
321  kon(indexe+14)=nodeb(7,3)
322  do j=1,3
323  co(j,nodeb(7,3))=co(j,nodel(3))
324  & +thickb(1,3)*xnorb(j,3)*(.5d0-offset(1,i))
325  & -thickb(2,3)*xnorb(j+3,3)*offset(2,i)
326  enddo
327  kon(indexe+15)=nodeb(3,2)
328  do j=1,3
329  co(j,nodeb(3,2))=co(j,nodel(2))
330  & +thickb(1,2)*xnorb(j,2)*(sc-offset(1,i))
331  & -thickb(2,2)*xnorb(j+3,2)*(sc+offset(2,i))
332  enddo
333  kon(indexe+16)=nodeb(7,1)
334  do j=1,3
335  co(j,nodeb(7,1))=co(j,nodel(1))
336  & +thickb(1,1)*xnorb(j,1)*(.5d0-offset(1,i))
337  & -thickb(2,1)*xnorb(j+3,1)*offset(2,i)
338  enddo
339  kon(indexe+17)=nodeb(8,1)
340  do j=1,3
341  co(j,nodeb(8,1))=co(j,nodel(1))
342  & -thickb(1,1)*xnorb(j,1)*offset(1,i)
343  & +thickb(2,1)*xnorb(j+3,1)*(.5d0-offset(2,i))
344  enddo
345  kon(indexe+18)=nodeb(8,3)
346  do j=1,3
347  co(j,nodeb(8,3))=co(j,nodel(3))
348  & -thickb(1,3)*xnorb(j,3)*offset(1,i)
349  & +thickb(2,3)*xnorb(j+3,3)*(.5d0-offset(2,i))
350  enddo
351  kon(indexe+19)=nodeb(6,3)
352  do j=1,3
353  co(j,nodeb(6,3))=co(j,nodel(3))
354  & -thickb(1,3)*xnorb(j,3)*offset(1,i)
355  & -thickb(2,3)*xnorb(j+3,3)*(.5d0+offset(2,i))
356  enddo
357  kon(indexe+20)=nodeb(6,1)
358  do j=1,3
359  co(j,nodeb(6,1))=co(j,nodel(1))
360  & -thickb(1,1)*xnorb(j,1)*offset(1,i)
361  & -thickb(2,1)*xnorb(j+3,1)*(.5d0+offset(2,i))
362  enddo
363 !
364 ! generating coordinates for the expanded nodes which
365 ! are not used by the C3D20(R) element (needed for the
366 ! determination of the knot dimension)
367 !
368  do j=1,3
369  co(j,nodeb(5,2))=co(j,nodel(2))
370  & -thickb(1,1)*xnorb(j,1)*(.5d0+offset(1,i))
371  & -thickb(2,1)*xnorb(j+3,1)*offset(2,i)
372  enddo
373  do j=1,3
374  co(j,nodeb(7,2))=co(j,nodel(2))
375  & +thickb(1,1)*xnorb(j,1)*(.5d0-offset(1,i))
376  & -thickb(2,1)*xnorb(j+3,1)*offset(2,i)
377  enddo
378  do j=1,3
379  co(j,nodeb(8,2))=co(j,nodel(2))
380  & -thickb(1,1)*xnorb(j,1)*offset(1,i)
381  & +thickb(2,1)*xnorb(j+3,1)*(.5d0-offset(2,i))
382  enddo
383  do j=1,3
384  co(j,nodeb(6,2))=co(j,nodel(2))
385  & -thickb(1,1)*xnorb(j,1)*offset(1,i)
386  & -thickb(2,1)*xnorb(j+3,1)*(.5d0+offset(2,i))
387  enddo
388  endif
389 !
390  return
Hosted by OpenAircraft.com, (Michigan UAV, LLC)