Está en la página 1de 23

IEG 3110 — Elementos Finitos Lineales

Clase 05

Tomás Zegard

30 de junio de 2020
Cuadratura de Gauss: Vector de fuerza
Gracias a la cuadratura de Gauss, podemos integrar funciones evaluando puntos
especı́ficos y multiplicando por sus respectivos pesos:
Z Nq
X
x̂ ξq? , ηq? , ζq? , ŷ ξq? , ηq? , ζq? , ẑ ξq? , ηq? , ζq? |det J|
   
f (x, y , z) dΩ = wq f
Ω q

El vector de fuerza f tiene contribuciones de: (a) fuerza de cuerpo b; (b) tracción en
la frontera t; y (c) desplazamientos impuestos g. Cada contribución es claramente
identificable en la derivación del mismo:
Z Z
fe = NTe (x) b dΩe + NT
e (x) t dS − ke g
Ωe ∂Ωte
Z Z
= N̂T
e (ξ) b |det J| dΩ̂e + N̂T
e (ξ) t |det J| dŜ − ke g
Ω̂e ∂ Ω̂te

El término asociado a la fuerza de cuerpo (1er término) se integra utilizando la


caudratura de Gauss convencional. Es decir:

Z Nq
X
NT wq N̂T

e (x) b dΩe = e ξq b |det J|
Ωe q

2 de 23
Cuadratura de Gauss: Vector de fuerza

El segundo término es una integral sobre la frontera del elemento. Esto es distinto a
todo lo que hemos hecho hasta ahora. Se debe utilizar una regla de n − 1 dimensiones,
donde n es la dimension del elemento.
1 En 1D, las cuadraturas de Gauss son de n puntos.
La frontera son puntos aislados: no es necesario integrar

2 En 2D, las cuadraturas de Gauss son de n × n puntos.


La frontera es un borde (1D) y requiere reglas de n puntos.

3 En 3D, las cuadraturas de Gauss son de n × n × n puntos.


La frontera es una cara/facet (2D) y requiere reglas de n × n puntos.

Es necesario integrar las fronteras del elemento por separado. Es decir, para un
elemento con Nf fronteras, la integral de fuerzas externas sobre el elemento es:
Z Nf Z
X
NT(x) t dΩe = NT(x) t dSα
∂Ωe α=1 Sα ∈∂Ωe

3 de 23
Cuadratura de Gauss: Vector de fuerza

Anteriormente, cuando tenı́amos dx dy al cambiar el intervalo de integración


obtenı́amos det J dξ dη.

El problema es que el diferencial de integración es ahora un


diferencial de arco dS, que está asociado a una “integral de
lı́nea”: p
dS = dx 2 + dy 2

El mapeo de coordenadas es:


X
x (ξ, η) = Ni (ξ, η) x i
i
X
y (ξ, η) = Ni (ξ, η) y i
i

, de donde sabemos que:

∂x X ∂Ni ∂x X ∂Ni
= x = x
∂ξ i
∂ξ i ∂η i
∂η i
∂y X ∂Ni ∂y X ∂Ni
= y = y
∂ξ i
∂ξ i ∂η i
∂η i

4 de 23
Cuadratura de Gauss: Vector de fuerza
Usando la regla de la cadena para múltiples variables, se tiene que:
∂x ∂x
dx = dξ + dη
∂ξ ∂η
∂y ∂y
dy = dξ + dη
∂ξ ∂η
Es decir:
" # " #
X ∂Ni X ∂Ni
dx = x dξ + x dη
i
∂ξ i i
∂η i
| {z } | {z }
J11 J21
" # "
#
X ∂Ni X ∂Ni
dy = y dξ + y dη
i
∂ξ i i
∂η i
| {z } | {z }
J12 J22

Lo que puede ser escrito de forma compacta:


   T  
dx J J12 dξ
= 11
dy J21 J22 dη

Finalmente, el diferencial de arco en coordenadas estándar es:


p q
dS = dx 2 + dy 2 = (J11 dξ + J21 dη)2 + (J12 dξ + J22 dη)2

5 de 23
Cuadratura de Gauss: Vector de fuerza
El diferencial de arco en coordenadas estándar es:
p q
dS = dx 2 + dy 2 = (J11 dξ + J21 dη)2 + (J12 dξ + J22 dη)2

Nota
Esto parece complicado de integrar. No obstante, en la frontera se tiene que dξ = 0, o
bien dη = 0. Esto nos permite factorizar dξ o dη fuera de la raı́z para finalmente
obtener una integral de lı́nea.

Por ejemplo, en el caso de un Q4, los bordes 1 (entre nodos 1–2) y el borde 3 (entre
nodos 3–4) tienen dη = 0. Es decir, para esos casos se tiene:
q
dS1 = dS3 = J11 2 + J 2 dξ
22

Análogamente, para los bordes 1 (entre nodos 1–2) y el borde 3 (entre nodos 3–4) se
dξ = 0. Con ello: q
dS2 = dS4 = J21 2 + J 2 dη
22

Nota
En el caso de elementos 3D, la integral en la frontera es una integral de superficie. La
derivación es similar, pero el número de términos aumenta bastante.

6 de 23
Cuadratura de Gauss: Vector de fuerza — Ejemplo 1
Veamos por ejemplo un Q4 que tiene una fuerza distribuida en la dirección x constante
e igual a (qx = σ t) en su borde α = 2 (segmento entre nodos 2–3). Las fuerzas
nodales a las que deberı́amos llegar son intuitivas, pero veamos cómo se llega a ellas.

Las funciones de forma del elemento Q4 son bilineales y están dadas por:
1 1
N̂1 = (1 − ξ) (1 − η) N̂2 = (1 + ξ) (1 − η)
4 4
1 1
N̂3 = (1 + ξ) (1 + η) N̂4 = (1 − ξ) (1 + η)
4 4
En el borde α = 2 del Q4 se tiene que ξ = 1. Es decir:
1
N̂1S2 = 0 N̂2S2 = (1 − η)
2
1
N̂3S2 = (1 + η) N̂4S2 = 0
2

7 de 23
Cuadratura de Gauss: Vector de fuerza — Ejemplo 1
Debido a que sólo hay una fuerza en el borde α = 2, la sumatoria no es necesaria. Con
ello, el vector de fuerzas si hay una carga distribuida constante qx en el borde α = 2 es:
Z Z
NT(x) t dΩe = NT(x) t dS2
∂Ωe S2
Z η=1 q
= NT(ξ = 1, η) qx 2 dη 2 + J 2 dη 2
J21 22
η=−1
, donde se utilizó el hecho que dξ = 0 en este borde.
Factorizando dη fuera de la integral, y usando la cuadratura de Gauss:
Z Z η=1 q
NT(x) t dΩe = NT(ξ = 1, η) qx J212 + J 2 dη
22
∂Ωe η=−1
Nq q
X
wq N T α 2 + J2

= e ξq qx J21 22
q

Usando las funciones del Q4, y una integración completa (exacta) se obtiene el
resultado esperado:
  

 r 0 
  0 

2

   
 
 
q L 
 q2x (x 2 − x 3 )2 + y − y
  
Z   
  x 2 
2 3 2
NT(x) t dΩe = r  =
2   q x L 2 
∂Ωe  qx 2
 2 (x 2 − x 3 ) + y 2 − y 3 


  
  2  
   

   0 

0

8 de 23
Cuadratura de Gauss: Vector de fuerza — Ejemplo 2
Repitamos el ejemplo anterior, pero esta vez con una carga en x que varı́a linealmente
entre los nodos 2–3.

En este caso, utilizamos las mismas funciones de forma para interpolar la carga en el
borde:  

 0 
 
qx2

t (η) = N(ξ = 1, η)

 qx3 
 
0

Con ello, el vector de fuerzas nodales es:
t(η)
z }|  {
 0 
η=1
Z Z  

qx2 
 q
NT(x) t dΩe = NT(ξ = 1, η) 

N(ξ = 1, η)  J 2 + J 2 dη
q 21 22
∂Ωe η=−1
 
 x3 


0
 

9 de 23
Cuadratura de Gauss: Vector de fuerza — Ejemplo 2

t(η)
z }|  {
Z η=1 
 0 
Z  
qx2 
 q
NT(x) t dΩe = NT(ξ = 1, η) 

N(ξ = 1, η)  J 2 + J 2 dη
q 21 22
∂Ωe η=−1
 
 x3 
 
0

  
Nq 
 0 
 
qx2 
X  q
T α 

 J2 + J2

= wq Ne ξq N(ξ = 1, η) 21 22
 qx3 
q  

0

Usando las funciones del Q4, y una integración completa (exacta) se obtiene como
resultado:
 

 0 
  
0
r
2

   

2 q x2 +qx3 2
− −
   
Z 
 6
(x 2 x 3 ) + y 2
y 3

 
 L
(2 qx2 + qx3 ) 6 2


NT(x) t dΩe = r = L2
 2 (q + 2 qx3 ) 6 
∂Ωe  qx2 +2 qx3 (x 2 − x 3 )2 + y − y  x2

 
 
 
 


 6 2 3 

 0
0
 

10 de 23
Cuadratura de Gauss: Vector de fuerza — Resumen Ejemplos
Análisis de resultados
En el caso de una carga constante en x entre los nodos 2–3, obtuvimos:
 

 0  
 
 qx L2 
Z 
 

T 2
N (x) t dΩe =
q L
x 2
∂Ωe 
 2 
 

 

0
 

En el caso de una carga variable en x entre los nodos 2–3, obtuvimos:


 

 0 

 
(2 qx2 + qx3 ) L2 
Z 
 

T 6
N (x) t dΩe =
∂Ωe  (q + 2 qx3 ) L62 
 x2

 

 

0
 

Intuitivamente estos resultados eran esperables. No obstante, es importante tener en


cuenta lo siguiente:
1 Esto sólo fue para 1 borde, en 1 dirección. Por ejemplo, en el caso 2D cada borde

puede tener fuerzas en x e y .


2 Elementos de mayor orden (e.g. Q8, Q9, T6, y otros) no tienen resultados

intuitivos.

11 de 23
Cuadratura de Gauss: Vector de fuerza — Elementos de orden superior
Para los elementos de orden superior que cumplen con:
1 Los nodos intermedios se ubiquen equidistantes de las esquinas

2 La fuerza distribuida es constante

se puede pre-calcular el vector de fuerzas. . .

Sugerido: Precalcular las fuerzas nodales para una fuerza que varı́a lineal en un Q8.

12 de 23
Matrices full y sparse

¿Qué es sparse?
Normalmente, almacenar y operar con una matriz de m × n requiere manipular m · n
datos. La memoria en los computadores es lineal; aún cuando en ciertos casos se nos
presenta (al usuario) como si tuviera 2, 3 o más dimensiones. Es ası́ como la matriz:
 
7 0 0 1
A=  3 2 0 0
0 0 0 4

Se almacena de forma interna en MATLAB ® de la siguiente forma:


DATA = [7, 3, 0, 0, 2, 0, 0, 0, 0, 1, 0, 4] SIZE = [3, 4]

A esto se le llama almacenaje full.


®
MATLAB y Fortran son lenguajes column-major. Es decir, las matrices se ordenan
en columnas.como en el ejemplo anterior.

13 de 23
Matrices full y sparse

Lenguajes row-major como C++, C#, Java, y otros; almacenarı́an la misma matriz de
la siguiente forma:

DATA = [7, 0, 0, 1, 3, 2, 0, 0, 0, 0, 0, 4] SIZE = [3, 4]

Cuando las matrices tienen muchos ceros, entonces hace sentido almacenar sólo los
valores distintos de cero: matrices sparse. La misma matriz A en formato COO
(coordinate list), donde sólo se indica la posición y valor de las entradas distintas de
cero:

SIZE = [3, 4]
ROW = [1, 2, 2, 1, 3]
COL = [1, 1, 2, 4, 4]
VAL = [7, 3, 2, 1, 4]

Las técnicas de almacenaje CSR o CSC son derivadas del COO, y ocupan menos datos
para representar la misma información. Todas estas son técnicas sparse; independiente
del almacenaje especı́fico que se use.

Si sumamos 2 matrices sparse sólo tenemos que operar sobre aquellos números que
comparten los mismos ı́ndices, y no sobre los m × n números.

14 de 23
Matrices full y sparse

¿Qué es mejor? ¿full o sparse?


Cuando las matrices tienen muchos ceros, el almacenaje sparse utilizará menos
memoria. Una regla sencilla es que si los fills (valores distintos de cero) son menos del
10 % de la matriz; entonces conviene usar sparse. Las matrices de rigidez en general
cumplen con ese requisito, a excepción de los “problemas de juguete” que se usan
educativamente en los libros; e.g. marco de 2 pisos, retı́culados de 5 barras, etc.

La figura del costado muestra dónde se encuen-


tran los fills de una matriz de rigidez de FEM
en 2D. El número de fills es 1024935, y la ma-
triz K tiene tamaño 57438 × 57438. Es decir, el
porcentaje de fills es:
1024935
S= = 0,00031 = 0,031 %
574382
Este problema ni siquiera es de tamaño conside-
rable y la notación sparse se está ahorrando de
almacenar el 99,97 % de los números.

Importante: el ahorro no es sólo almacenaje, sino también en la operación con estas


matrices.
15 de 23
Ensamblaje
Existen varios métodos para ensamblar las matrices de rigidez y los vectores de fuerza
de los elementos al dominio completo (o global). Algunos métodos de ensablaje
populares son:
i Expansión de ke a coordenadas globales y luego sumar todos los elementos.
ii Uso de matrices de colocación y conectividad.
iii Ensamblaje directo usando vectores indiciales.
iv Ensamblaje directo usando sparse1 .
El orden es relativamente proporcional a su eficiencia computacional.

A continuación se describe el método de vectores indiciales:


1 Determinar el número de grados de libertad global ndof .
2 Crear una matriz global de ceros en formato sparse: K = sparse(Ndof,Ndof);
3 Crear un vector de fuerzas globales asociado: f = zeros(Ndof,1);
4 Para cada elemento. . .
a Determinar un vector con sus grados-de-libertad llamado edof
b Calcular su matriz de rigidez local ke
c Sumar ke a las posiciones edof de K global: K(edof,edof) = K(edof,edof) + ke;
d Calcular la matriz de fuerzas del elemento fe
e Sumar fe a las filas edof de f global: f(edof) = f(edof) + fe;
1
Se hace una “reducción” de los ı́ndices y fills directamente en el formato CSR o CSC. Esto es muy eficiente
desde el punto de vista numérico.

16 de 23
Solución del sistema K u = f

Nota
En el pseudo-código anterior, se creó el vector de fuerzas globales usando full en vez
de sparse. La ventaja de uno u otro no es tan clara, y dependerá del problema
especı́fico: e.g. carga puntual vs peso propio.

En el sistema global tenemos grados-de-libertad que tienen desplazamientos


impuestos: apoyos2 o bien desplazamientos forzados.
Usando notación indicial se tiene un vector f con los ı́ndices de los GDL libres; y r con
los ı́ndices de los GDL de desplazamiento impuesto. Asociado a r debe existir un
vector u de desplazamientos especificados3 . Podemos entonces sub-dividir el sistema
lineal de la siguiente forma:
    
Kff Kfr uf f
= f
Krf Krr u r

Aquı́ r son las reacciones o fuerzas externas requeridas para producir los
desplazamientos u, segun corresponda.

2
Un apoyo o restricción es un desplazamiento impuesto igual a cero.
3
En el caso de una estructura que sólo tiene apoyos u = 0.

17 de 23
Solución del sistema K u = f
A partir de la sub-división se separan 2 ecuaciones matriciales. La primera nos permite
obtener los desplazamientos de los GDL libres:

Kff uf = ff − Kfr u

¡Felicitaciones! Ha sido un largo camino para llegar aquı́. Espero haya valido la pena. . .

Nota
Es bastante usual que las estructuras sólo tengan apoyos; es decir u = 0. Aquellos que
no comprenden bien el término del lado derecho esto dicen “basta con sacar las filas y
columnas asociadas a los apoyos y listo!”. El problema es que cuando u 6= 0, esas
mismas personas no saben qué hacer.

No es necesario invertir la matriz Kff : nunca invierta una matriz.


Supongamos que el sistema tiene Ndof GDLs, y que tenemos un vector FIX con los
GDL de desplazamiento impuesto, y un vector u_FIX con los valores de dichos
desplazamientos. El sistema se resuelve de la siguiente forma en MATLAB : ®
FREE = setdiff(1:Ndof,FIX);
u = zeros(Ndof,1);
u(FREE) = K(FREE,FREE) \ (f(FREE) - K(FREE,FIX)*u_FIX);
u(FIX) = u_FIX;

18 de 23
Solución del sistema K u = f

Ahora resta encontrar las reacciones r, lo que se obtiene con la segunda ecuación de la
sub-división anteriomente hecha:

Krf uf + Krr u = r

Esta expresión es equivalente a:


Kr: u = r
, donde “:” se usa en este caso para indicar “todas las columnas”.

Finalmente, se podrı́a querer ordenar el vector u por nodos. Es decir, como una matriz
D de tamaño Nn × dim. Esto hace más sencillo interpretar y/o graficar los resultados.
En MATLAB esto se hace en 1 sola lı́nea:
D = reshape(u,dim,numel(u)/dim)’;
Con esto es sencillo obtener la posición deformada de nuestra estructura:
DNODE = NODE + amp * D;
, donde amp es un factor de amplificación para los desplazamientos.

19 de 23
Matriz de masa

La matriz de masa M no permitirá analizar problemas dinámicos. Esta matriz se


obtiene de una forma similar a K, pero es más sencilla en su formulación.

Z Z
Me = ρ (x) NT(x) N(x) dΩ = ρ (ξ) N̂T(ξ) N̂(ξ) |det J| dΩ̂
Ωe Ω̂e

Esto se debe hacer para cada dirección. Es decir, en el caso 2D la matriz N que se
utiliza para calcular M es:
 
N1 0 N2 0 ...
N=
0 N1 0 N2 . . .

20 de 23
Matriz de masa — Ejemplo

Se tiene un Q4 definido (en sentido antihorario) como:


 
−2 −1
 5 0   
NODE =   4
 ELEM = 1 2 3 4
3 
−1 4

Las propiedades del material son:

ρ = 2500 y t=1

Para la integración se utiliza la regla de 2 × 2, donde ?


ξ1,2 = ± √1 y w = 1.
3
 
1 1
El primer punto de Gauss es ξ?1 = − √3 , − √3 con w1 = 1.

Las funciones de forma N̂e en este punto de Gauss son:

N̂e1 = 0,6220 0,1667 0,0447 0,1667


 

21 de 23
Matriz de masa — Ejemplo
Es necesario reordenar estos valores N̂em :
 
0,622 0. 0,1667 0. 0,0447 0. 0,1667 0.
N̂e1 =
0. 0,622 0. 0,1667 0. 0,0447 0. 0,1667

En MATLAB ® puede armar N con facilidad para 2D:


Naux = zeros(2,8);
N(1,1:2:end) = Naux;
N(2,2:2:end) = Naux;
El determinante del Jacobiano esta dado por det J1 = 7,44338 como fue visto en el
ejemplo pasado. Parecı́a que para determinar M se necesita sólo N. En realidad se
necesitan las derivadas también para calcular el Jacobiano.
La contribución del primer punto de Gauss a la matriz Me del elemento es:
 
m 1 = w1 ρ N T 1 N1 t det J1

7200. 0. 1929. 0. 517. 0. 1929. 0.


 
 0. 7200. 0. 1929. 0. 517. 0. 1929.
1929. 0. 517. 0. 139. 0. 517. 0. 
 
 0. 1929. 0. 517. 0. 139. 0. 517. 
m1 =  517. 0. 139. 0. 37. 0. 139. 0. 
 
 0. 517. 0. 139. 0. 37. 0. 139. 
1929. 0. 517. 0. 139. 0. 517. 0.
 
0. 1929. 0. 517. 0. 139. 0. 517.

22 de 23
Ejemplo: cálculo de m para un Q4

Continuando con los puntos de Gauss restantes se obtiene la siguiente matriz de masa
para el elemento:

Me = m1 + m2 + m3 + m4
8056. 0. 3611. 0. 1667. 0. 3750. 0.
 
 0. 8056. 0. 3611. 0. 1667. 0. 3750.
3611. 0. 6389. 0. 2917. 0. 1667. 0. 
 
 0. 3611. 0. 6389. 0. 2917. 0. 1667.
Me = 1667. 0. 2917. 0. 5278. 0. 3056. 0. 
 
 0. 1667. 0. 2917. 0. 5278. 0. 3056.
3750. 0. 1667. 0. 3056. 0. 6944. 0.
 
0. 3750. 0. 1667. 0. 3056. 0. 6944.

Esta es la matriz de masa consistente. En análisis estructural y dinámico es frecuente


utilizar una matriz derivada de ésta llamada la matriz de masa lumped, que concentra
la masa en la diagonal.
En MATLAB ® se puede obtener la matriz lumped con facilidad:
M_lump = diag(sum(M,2));

23 de 23

También podría gustarte