Travatura reticolare
La particolarità di questo esempio sta nel fatto che i nodi devono trasmettere solamente forze e non momenti, quindi la rotazione dei nodi stessi e la deformabilità flessionale delle travi non devono essere presi in considerazione.
> restart: read "beam2D_FEMpack.m";
Definiamo i nodi secondo la numerazione in figura
> node := table ([ seq( c = [ 0.8*(c-1) , 0] , c=1..4), seq( 10+c = [ 0.8*(c-1)-0.4 , 1.0] , c=1..5) ]);
Proprietà della sezione
>
mu:=1; massa
lineare
>
EJ:=0;
la rigidezza flessionale deve essere
nulla
> EA:=1e4;
rigidezza assiale
Seguendo la figura, definisco gli elementi
>
beam := table([
seq( [ c , c+1 , mu,EA,EJ], c=1..3),
1° riga
seq( [ c+10, c+11, mu,EA,EJ], c=1..4),
2° riga
seq( [ c , c+10, mu,EA,EJ], c=1..4),
elementi diagonali verso destra
seq( [ c , c+11, mu,EA,EJ], c=1..4)
]);
elementi diagonali verso sinistra
Definisco le cerniere in corrispondenza dei nodi 11 e 15.
Dopodiché annullo tutte le rotazioni in quanto esse non rappresentano gradi di libertà significativi.E' essenziale che questa operazione è lecita solo perché ho annullato la rigidezza flessionale
>
impl_constraint := [
x11,z11,
cerniera di sinistra
x15,z15,
cerniera di destra
seq(phi||i,i=1..4), seq(phi||i,i=11..15)
];
blocco le rotazioni
4. Assemblaggio della struttura
> built_structure(node,beam,impl_constraint):
Warning, global variables 'NN','nix','coords' were been defined
Sono stati definiti 9 nodi:
n = [ X [m] Z [m] ]
--------------------------
1 = [ +0.000 +0.000 ]
2 = [ +0.800 +0.000 ]
3 = [ +1.600 +0.000 ]
4 = [ +2.400 +0.000 ]
11 = [ -0.400 +1.000 ]
12 = [ +0.400 +1.000 ]
13 = [ +1.200 +1.000 ]
14 = [ +2.000 +1.000 ]
15 = [ +2.800 +1.000 ]
--------------------------
Warning, global variables 'NE','bix' were been defined
Sono stati definiti 15 elementi di tipo trave:
m , ( i, j) = mu[kg/m] EA[N] EJ[Nm2] l[m] theta[rad]
--------------------------------------------------------------------
1 , ( 1 , 2) = 1.0 1.00e+04 0.00e-01 0.800 +0.000
2 , ( 2 , 3) = 1.0 1.00e+04 0.00e-01 0.800 +0.000
3 , ( 3 , 4) = 1.0 1.00e+04 0.00e-01 0.800 +0.000
4 , (11 ,12) = 1.0 1.00e+04 0.00e-01 0.800 +0.000
5 , (12 ,13) = 1.0 1.00e+04 0.00e-01 0.800 +0.000
6 , (13 ,14) = 1.0 1.00e+04 0.00e-01 0.800 +0.000
7 , (14 ,15) = 1.0 1.00e+04 0.00e-01 0.800 +0.000
8 , ( 1 ,11) = 1.0 1.00e+04 0.00e-01 1.077 +1.951
9 , ( 2 ,12) = 1.0 1.00e+04 0.00e-01 1.077 +1.951
10 , ( 3 ,13) = 1.0 1.00e+04 0.00e-01 1.077 +1.951
11 , ( 4 ,14) = 1.0 1.00e+04 0.00e-01 1.077 +1.951
12 , ( 1 ,12) = 1.0 1.00e+04 0.00e-01 1.077 +1.190
13 , ( 2 ,13) = 1.0 1.00e+04 0.00e-01 1.077 +1.190
14 , ( 3 ,14) = 1.0 1.00e+04 0.00e-01 1.077 +1.190
15 , ( 4 ,15) = 1.0 1.00e+04 0.00e-01 1.077 +1.190
--------------------------------------------------------------------
Warning, global variables 'constraint','NC','dip','indip','NDOF' were been defined
La struttura possiede 14 gradi di libertà.
Posso verificare il computo dei gradi di libertà con un conteggio manuale:
+ 15 (deformazione assiale
di ciascuna asta)
+ 3 (posizione
e orientamento della struttura nel piano)
- 2x2 (gradi di libertà
impediti dalla presenza delle cerniere)
= 14 (gradi di libertà della struttura)
Verifico che la struttura corrisponda a quella assegnata:
>
blue :=COLOUR(RGB,0,0,1): red:=COLOUR(RGB,1,0,0):
black:=COLOUR(RGB,0,0,0):
>
nlab := node_label(-0.05,-0.05):
>
P_undeformed := draw_beams(beam,0,0,2,red):
> PLOT(P_undeformed,nlab,SCALING(CONSTRAINED),AXESSTYLE(NONE),THICKNESS(2));
Definisco le forze esterne verticali applicate in corrispondenza del traverso superiore.
> force := table([ seq(i=[ 0 , 1e3 , 0.0 ],i=1..4) ]) ;
Effettuo l'analisi e grafico i risultati
>
static_analysis(beam,force,static_disp);
>
scd:=0.50:
> npt:=2: numero
di punti di rappresentazione per ciascun elemento
>
P_stat_def := draw_beams(beam,static_disp,scd,npt,blue):
>
scf:=0.001:
scala delle forze
>
scm:=0.0005:
scala dei momenti
>
PP_force := draw_forces(force,scf,scm,static_disp,scd,black,THICKNESS(2)):
diagramma delle forze
> PLOT(P_undeformed, P_stat_def,PP_force,node_label(0.05,0.05),SCALING(CONSTRAINED),AXESSTYLE(NONE),THICKNESS(1));
NOTA: è importante disegnare la struttura
utilizzando solamente le posizioni dei nodi (npt=2), in caso contrario otterremo
un risultato che si discosta dalla realtà avendo fittiziamente posto a zero le
rotazioni dei nodi.
Infatti:
> npt:=8:
> P_stat_def := draw_beams(beam,static_disp,scd,npt,blue):
ecco il risultato:
>
PLOT(P_undeformed,P_stat_def,PP_force,node_label(0.05,0.05),SCALING(CONSTRAINED),AXESSTYLE(NONE),THICKNESS(1));
6. Calcolo dei modi di vibrare
>
modal_analysis(beam, myomega, mymode, NDOF):
Warning, pre-load conditions are not take into account in modal analysis
frequenze proprie
omega( 1) = 211.2217 rad/s = 33.617 Hz
omega( 2) = 207.0047 rad/s = 32.9458 Hz
omega( 3) = 22.0025 rad/s = 3.5018 Hz
omega( 4) = 34.771 rad/s = 5.534 Hz
omega( 5) = 51.2497 rad/s = 8.1566 Hz
omega( 6) = 171.3757 rad/s = 27.2753 Hz
omega( 7) = 165.9241 rad/s = 26.4076 Hz
omega( 8) = 161.373 rad/s = 25.6833 Hz
omega( 9) = 152.0314 rad/s = 24.1965 Hz
omega(10) = 139.056 rad/s = 22.1315 Hz
omega(11) = 120.0586 rad/s = 19.1079 Hz
omega(12) = 84.2508 rad/s = 13.4089 Hz
omega(13) = 89.6474 rad/s = 14.2678 Hz
omega(14) = 88.4515 rad/s = 14.0775 Hz
rappresentazione grafica
>
scd := 0.5:
scale factor
>
nn := NDOF-1:
seleziono il modo
>
nn:=3: nn;myomega[nn];
>
P_mode := draw_beams(beam,mymode[nn],scd,2,blue):
> PLOT(P_undeformed,P_mode,node_label(0,0),SCALING(CONSTRAINED),AXESSTYLE(NONE),THICKNESS(1));
animazione
>
nn := 3;
seleziono il modo
>
myomega[nn];
>
scd := 0.5:
scale factor
>
P_undeformed := draw_beams(beam,0,0,2,red,LINESTYLE(4)):
>
nfr := 12: frame:='frame':
>
for i from 1 to nfr do frame[i]:= draw_beams(beam,mymode[nn],evalf(scd*cos(2*Pi*(i-1)/nfr)),2,blue):
od:
> PLOT(ANIMATE(seq([frame[i],P_undeformed],i=1..nfr)),AXESSTYLE(NONE),SCALING(CONSTRAINED));
modo di vibrare con pulsazione w = 34.7 rad/s
|
modo di vibrare con pulsazione w = 51.3 rad/s
|
modo di vibrare con pulsazione w = 139 rad/s
|
modo di vibrare con pulsazione w = 171 rad/s
|