Vous êtes sur la page 1sur 10

1 '------------------------------------------2

3 'DISTORTED RECTANGULAR QUADMESH GENERATOR


4 'DYNAMIC RELAXATION CODE - ARBITRARY MESHES
5
6 '------------------------------------------7
8 Option Explicit
9
10 Call main()
11 Sub main()
12
13
'add dummy layer
14
Rhino .AddLayer "Dummy" , RGB(0, 0, 0)
15
16
'----------------------------17
'1. DEFINE VARIABLES
18
'----------------------------19
20
Dim g,ax,ay,n,m,nnp,i,j,nel,ir,jr,r,c
21
22
'gravitational acceleration
23
g=300
24
'damping'
25
c=50
26
'scale factor x-axis
27
ax=20
28
'scale factor y-axis
29
ay=20
30
'divisions
31
n=9
32
m=8
33
'Number of Nodal Points
34
nnp=(n+1)*(m+1)
35
'Number of ELements
36
nel=2*m*n+n+m
37
'coordinate, velocity, acceleration, force, nodal restraints (0 if restrained), mass
38
Dim x(10000 ,3),v(10000 ,3),a(10000 ,3),F(10000 ,3),nrs(10000 ,3),mass(10000 )
39
'connectivity, initial length, stiffness
1

40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78

Dim ien(10000 ,2),l0(10000 ),EA(10000 )


'indexes of neighbouring frames for each node
Dim anchor (10000 ,4)
'----------------------------'2. BUILD INITIAL MESH
'----------------------------'2.1 Generate initial coordinates, masses and restraints
For i=0 To n
For j=0 To m
'relative i, goes from -1 to 1
ir=1-2*i/n
'relative j, goes from -1 to 1
jr=1-2*j/m
x((m+1)*i+j+1,1)=-ax*(1-0*ir^2)*(jr)/2
x((m+1)*i+j+1,2)=-ay*(1+0*jr^2)*ir/2
'x((m+1)*i+j+1,2)=-ay*(1+cos(6*jr)/15)*ir/2
'x((m+1)*i+j+1,3)=6.71*(1+0.1982*jr^2)*(-1+ir^2)
x((m+1)*i+j+1,3)=0
mass ((m+1)*i+j+1)=0.4'*(1-0.3*cos(3*pi*jr))
If (i=0 And j=m) Or (i=n And j=0) Then
nrs((m+1)*i+j+1,1)=0
nrs((m+1)*i+j+1,1)=0
nrs((m+1)*i+j+1,1)=0
Else
nrs((m+1)*i+j+1,1)=1
nrs((m+1)*i+j+1,1)=1
nrs((m+1)*i+j+1,1)=1
End If
Next
Next
'2.2 Build connectivity, initial length and stiffness arrays
'uniform stiffness
Dim stiff
stiff =2500
2

79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117

For i=0 To n-1


For j=0 To m-1
ien(2*(m*i+j)+1,1)=(m+1)*i+j+1
ien(2*(m*i+j)+1,2)=(m+1)*i+j+2
l0(2*(m*i+j)+1)=distance ((m+1)*i+j+1,(m+1)*i+j+2,x)
EA(2*(m*i+j)+1)=stiff
ien(2*(m*i+j)+2,1)=(m+1)*i+j+1
ien(2*(m*i+j)+2,2)=(m+1)*(i+1)+j+1
l0(2*(m*i+j)+2)=distance ((m+1)*i+j+1,(m+1)*(i+1)+j+1,x)
EA(2*(m*i+j)+2)=stiff
Next
Next
For i=0 To n-1
ien(2*m*n+i+1,1)=(m+1)*(i+1)
ien(2*m*n+i+1,2)=(m+1)*(i+2)
l0(2*m*n+i+1)=distance ((m+1)*(i+1),(m+1)*(i+2),x)
EA(2*m*n+i+1)=stiff
Next
For j=0 To m-1
ien(2*m*n+n+j+1,1)=n*(m+1)+j+1
ien(2*m*n+n+j+1,2)=n*(m+1)+j+2
l0(2*m*n+n+j+1)=distance (n*(m+1)+j+1,n*(m+1)+j+2,x)
EA(2*m*n+n+j+1)=stiff
Next
'2.3 Build anchor array containing indexes of frame elements anchored in a node
'(used to accelerate dynamic relaxation algorithm)
For i=1 to n-1
For j=1 To m-1
anchor ((m+1)*i+j+1,1)=2*(i*m+j)+1
anchor ((m+1)*i+j+1,2)=2*(i*m+j)+2
anchor ((m+1)*i+j+1,3)=2*((i-1)*m+j)+2
anchor ((m+1)*i+j+1,4)=2*(i*m+(j-1))+1
Next
Next
For j=1 To m-1
anchor (j+1,1)=2*j+1
3

118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156

anchor (j+1,2)=2*j+2
anchor (j+1,3)=2*(j-1)+1
anchor ((m+1)*n+j+1,1)=2*m*n+n+j
anchor ((m+1)*n+j+1,2)=2*m*n+n+j+1
anchor ((m+1)*n+j+1,3)=2*((n-1)*m+j)+2
Next
For i=1 To n-1
anchor (i*(m+1)+1,1)=2*(i*m)+1
anchor (i*(m+1)+1,2)=2*(i*m)+2
anchor (i*(m+1)+1,3)=2*((i-1)*m)+2
anchor (i*(m+1)+m+1,1)=2*(i*m+m-1)+1
anchor (i*(m+1)+m+1,2)=2*m*n+i
anchor (i*(m+1)+m+1,3)=2*m*n+i+1
Next
anchor (1,1)=1
anchor (1,2)=2
anchor (m+1,1)=2*(m-1)+1
anchor (m+1,2)=2*m*n+1
anchor ((m+1)*n+1,1)=2*((n-1)*m)+2
anchor ((m+1)*n+1,2)=2*m*n+n+1
anchor ((m+1)*(n+1),1)=2*m*n+n+m
anchor ((m+1)*(n+1),2)=2*m*n+n
'----------------------------'2. RUN DYNAMIC RELAXATION
'----------------------------'deletes layers with the results from the last run
redo_layers
'deletes and redefines layers containing initial mesh
Rhino .PurgeLayer "Joints0"
Rhino .PurgeLayer "Frames0"
Rhino .AddLayer "Joints0" , RGB(0, 0, 0)
Rhino .AddLayer "Frames0" , RGB(0, 0, 0)
'zero acceleration array
For i=1 To nnp
a(i,1)=0
4

157
a(i,2)=0
158
a(i,3)=0
159
Next
160
161
'sketch initial mesh in initial mesh layers
162
sketch0 nel,nnp,x,ien,nrs,l0,a,F
163
164
'run dynamic relaxation
165
relax g,c,nel,nnp,nrs,mass,x,v,F,a,ien,anchor ,l0,EA
166
167 End Sub
168
169 '----------------------------170 'FUNCTIONS AND PROCEDURES
171 '----------------------------172
173 'F0 Finite timestep dynamic relaxation
174
175 Sub relax (g,c,nel,nnp,nrs,mass,x,v,F,a,ien,anchor ,l0,EA)
176
'define current and previous kinetic energies
177
Dim Eccur ,Ecprev
178
Eccur =0
179
Ecprev =0
180
Dim j
181
For j=1 To 500
182
'redo_layers
183
update_dynamics F,a,g,c,nel,nnp,x,v,mass,ien,anchor ,l0,EA
184
update_kinematics 0.01,nnp,nrs,x,v,a
185
'update kinetic energies
186
Ecprev =Eccur
187
Eccur =Ec(nnp,v,mass)
188
'set velocities to 0 if kinetic energy decreases
189
If Eccur <Ecprev Then
190
vzero nnp,v
191
End If
192
'sketch nel,nnp,x,ien,nrs,l0,a,F
193
Next
194
sketch nel,nnp,x,ien,nrs,l0,a,F
195
draw nel,nnp,x,mass,ien
5

196 End Sub


197
198 'F1 Returns total kinetic energy
199
200 Function Ec(nnp,v,mass)
201
Dim e,i
202
e=0
203
For i=1 To nnp
204
e=e+mass(i)*(v(i,1)^2+v(i,2)^2+v(i,3)^2)/2
205
Next
206
Ec=e
207 End Function
208
209 'F2 Collects force and acceleration array for all members
210
211 Sub update_dynamics (F,a,g,c,nel,nnp,x,v,mass,ien,anchor ,l0,EA)
212
Dim i
213
For i=1 To nnp
214
F(i,1)=nodal_force (i,g,c,nel,nnp,x,v,mass,ien,anchor ,l0,EA)(1)
215
F(i,2)=nodal_force (i,g,c,nel,nnp,x,v,mass,ien,anchor ,l0,EA)(2)
216
F(i,3)=nodal_force (i,g,c,nel,nnp,x,v,mass,ien,anchor ,l0,EA)(3)
217
a(i,1)=F(i,1)/mass(i)
218
a(i,2)=F(i,2)/mass(i)
219
a(i,3)=F(i,3)/mass(i)
220
Next
221 End Sub
222
223 'F3 Returns total force for particular node
224
225 Function nodal_force (node,g,c,nel,nnp,x,v,mass,ien,anchor ,l0,EA)
226
Dim node1 ,force (3),i,e
227
force (1)=0
228
force (2)=0
229
force (3)=0
230
For i=1 To 4
231
If anchor (node,i)<>0 Then
232
e=anchor (node,i)
233
If ien(e,1)=node Then
234
node1 =ien(e,2)
6

235
236
237
238
239
240
241
242
243
244
245
246
247
248 End
249
250 'F4
251
252 Sub
253
254
255
256
257
258
259
260
261
262 End
263
264 'F5
265
266 Sub
267
268
269
270
271
272
273 End

Else
node1 =ien(e,1)
End If
force (1)=force (1)+EA(e)*(length (e,ien,x)-l0(e))*(x(node1 ,1)-x(node,1))/length (e,ien,x)^2
force (2)=force (2)+EA(e)*(length (e,ien,x)-l0(e))*(x(node1 ,2)-x(node,2))/length (e,ien,x)^2
force (3)=force (3)+EA(e)*(length (e,ien,x)-l0(e))*(x(node1 ,3)-x(node,3))/length (e,ien,x)^2
End If
Next
force (3)=force (3)-mass(node)*g
force (1)=force (1)-c*v(node,1)
force (2)=force (2)-c*v(node,2)
force (3)=force (3)-c*v(node,3)
nodal_force =force
Function
Update kinematics
update_kinematics (t,nnp,nrs,x,v,a)
Dim i
For i=1 To nnp
v(i,1)=v(i,1)+a(i,1)*t*nrs(i,1)
x(i,1)=x(i,1)+v(i,1)*t*nrs(i,1)
v(i,2)=v(i,2)+a(i,2)*t*nrs(i,1)
x(i,2)=x(i,2)+v(i,2)*t*nrs(i,1)
v(i,3)=v(i,3)+a(i,3)*t*nrs(i,1)
x(i,3)=x(i,3)+v(i,3)*t*nrs(i,1)
Next
Sub
Set velocities to zero
vzero (nnp,v)
Dim i
For i=1 To nnp
v(i,1)=0
v(i,2)=0
v(i,3)=0
Next
Sub
7

274
275 'F6 Return distance between two nodes
276
277 Function distance (node1 ,node2 ,x)
278
distance =((x(node2 ,1)-x(node1 ,1))^2+(x(node2 ,2)-x(node1 ,2))^2+(x(node2 ,3)-x(node1 ,3))^2)^0.5
279 End Function
280
281 'F7 Return current length of frame
282
283 Function length (e,ien,x)
284
length =distance (ien(e,1),ien(e,2),x)
285 End Function
286
287 'F8 Schematic draw - final form layers
288
289 Sub sketch (nel,nnp,x,ien,nrs,l0,a,F)
290
Dim i,point1 (2),point2 (2),point3 (2)
291
Rhino .CurrentLayer "Joints"
292
For i=1 To nnp
293
point1 (0)=x(i,1)
294
point1 (1)=x(i,2)
295
point1 (2)=-x(i,3)
296
Rhino .addpoint point1
297
'Rhino.AddText a(i,1),point1,0.6
298
Next
299
Rhino .CurrentLayer "Frames"
300
For i=1 To nel
301
point1 (0)=x(ien(i,1),1)
302
point1 (1)=x(ien(i,1),2)
303
point1 (2)=-x(ien(i,1),3)
304
point2 (0)=x(ien(i,2),1)
305
point2 (1)=x(ien(i,2),2)
306
point2 (2)=-x(ien(i,2),3)
307
point3 (0)=(point1 (0)+point2 (0))/2
308
point3 (1)=(point1 (1)+point2 (1))/2
309
point3 (2)=(point1 (2)+point2 (2))/2
310
Rhino .AddLine point1 ,point2
311
'Rhino.AddText l0(i,3),point3,0.6
312
Next
8

313
Rhino .CurrentLayer "Dummy"
314 End Sub
315
316 'F9 Schematic draw - initial form layers
317
318 Sub sketch0 (nel,nnp,x,ien,nrs,l0,a,F)
319
Dim i,point1 (2),point2 (2),point3 (2)
320
Rhino .CurrentLayer "Joints0"
321
For i=1 To nnp
322
point1 (0)=x(i,1)
323
point1 (1)=x(i,2)
324
point1 (2)=-x(i,3)
325
Rhino .addpoint point1
326
'Rhino.AddText a(i,1),point1,0.6
327
Next
328
Rhino .CurrentLayer "Frames0"
329
For i=1 To nel
330
point1 (0)=x(ien(i,1),1)
331
point1 (1)=x(ien(i,1),2)
332
point1 (2)=-x(ien(i,1),3)
333
point2 (0)=x(ien(i,2),1)
334
point2 (1)=x(ien(i,2),2)
335
point2 (2)=-x(ien(i,2),3)
336
point3 (0)=(point1 (0)+point2 (0))/2
337
point3 (1)=(point1 (1)+point2 (1))/2
338
point3 (2)=(point1 (2)+point2 (2))/2
339
Rhino .AddLine point1 ,point2
340
'Rhino.AddText l0(i,3),point3,0.6
341
Next
342
Rhino .CurrentLayer "Dummy"
343 End Sub
344
345 'F10 Detailed draw
346
347 Sub draw(nel,nnp,x,mass,ien)
348
Dim i,j,r
349
Rhino .CurrentLayer "Masses"
350
Dim point1 (2),point2 (2)
351
For i=1 To nnp
9

352
point1 (0)=x(i,1)
353
point1 (1)=x(i,2)
354
point1 (2)=-x(i,3)
355
r=0.1*mass(i)
356
Rhino .addsphere point1 ,r
357
Next
358
Rhino .CurrentLayer "Elements"
359
For i=1 To nel
360
point1 (0)=x(ien(i,1),1)
361
point1 (1)=x(ien(i,1),2)
362
point1 (2)=-x(ien(i,1),3)
363
point2 (0)=x(ien(i,2),1)
364
point2 (1)=x(ien(i,2),2)
365
point2 (2)=-x(ien(i,2),3)
366
'Rhino.AddLine a,b
367
Rhino .AddCylinder point1 ,point2 ,0.05
368
Next
369
Rhino .CurrentLayer "Dummy"
370 End Sub
371
372 'F11 Delete and redo layers
373
374 Sub redo_layers
375
Rhino .PurgeLayer "Masses"
376
Rhino .PurgeLayer "Elements"
377
Rhino .AddLayer "Masses" , RGB(0, 0, 0)
378
Rhino .AddLayer "Elements" , RGB(0, 0, 0)
379
Rhino .PurgeLayer "Joints"
380
Rhino .PurgeLayer "Frames"
381
Rhino .AddLayer "Joints" , RGB(0, 0, 0)
382
Rhino .AddLayer "Frames" , RGB(0, 0, 0)
383 End Sub

10

Vous aimerez peut-être aussi