Pliki do wykorzystania w poniższym ćwiczeniu można pobrać za pomocą poniższych linków:
Niniejszą instrukcją rozpoczynamy cykl laboratoriów, z których każde kolejne będzie rozwinięciem poprzedniego i wnioski z poprzedniego będą stanowiły motywację do zastosowania kolejnych metod. Tym samym należy zadbać o to, aby zadania z każdego laboratorium były wykonywane do końca czy to na zajęciach, czy w domu. Dziś zaznajomimy się ze sformułowaniem metody elementów skończonych dla jednego elementu czworokątnego. Dla uproszczenia nie będziemy stosować transformacji geometrycznych występujących w rzeczywistym sformułowaniu metody elementów skończonych, więc faktycznie będziemy operować zawsze na jednostkowych elementach kwadratowych.
Zagadnienie wytrzymałości konstrukcji dla jednego elementu skończonego ma następujące sformułowanie algebraiczne: Elementowi skończonemu przypisana jest tzw. macierz sztywności \(\mathbf{K}\) reprezentująca jego sztywność na poszczególne rodzaje odkształceń (przesunięcia jego wierzchołków), wektor przesunięć \(\mathbf{d}\), jakim ulegną poszczególne wierzchołki elementu pod obciążeniem oraz wektor sił węzłowych \(\mathbf{f}\) reprezentujący odpowiednio przeliczone siły (bądź obciążenia ciągłe) przyłożone do węzłów elementu. \[ \mathbf{K} \mathbf{d} = \mathbf{f} \] Wektor przesunięć (ang. displacement) zawiera odpowiednio przesunięcia względem osi \(x\) oraz \(y\) kolejnych węzłów elementu (numeracja węzłów pokazana jest na Rys. 1). Wektor sił węzłowych \(\mathbf{f}\) ma analogiczną postać. Poniżej przedstawiona jest również macierz sztywności \(\mathbf{K}\). \[ \mathbf{d} = \left[ \begin{array}{c} x_0 \\ y_0 \\ x_1 \\ y_1 \\ x_2 \\ y_2 \\ x_3 \\ y_3 \\ \end{array} \right] \quad \quad \quad \mathbf{f} = \left[ \begin{array}{c} f_{x_0} \\ f_{y_0} \\ f_{x_1} \\ f_{y_1} \\ f_{x_2} \\ f_{y_2} \\ f_{x_3} \\ f_{y_3} \\ \end{array} \right] \] \[ \mathbf{K} = \frac{E}{1-\nu^2} \left[ \begin{array}{c c c c c c c c} \frac{1}{2} - \frac{\nu}{6} & \frac{1}{8} + \frac{\nu}{8} & -\frac{1}{4} - \frac{\nu}{12} & -\frac{1}{8} + \frac{3}{8}\nu & -\frac{1}{4} + \frac{\nu}{12} & -\frac{1}{8} - \frac{\nu}{8} & \frac{\nu}{6} & \frac{1}{8} - \frac{3}{8}\nu \\ \frac{1}{8} + \frac{\nu}{8} & \frac{1}{2} - \frac{\nu}{6} & \frac{1}{8} - \frac{3}{8}\nu & \frac{\nu}{6} & -\frac{1}{8} - \frac{\nu}{8} & -\frac{1}{4} + \frac{\nu}{12} & -\frac{1}{8} + \frac{3}{8}\nu & -\frac{1}{4} - \frac{\nu}{12} \\ -\frac{1}{4} - \frac{\nu}{12} & \frac{1}{8} - \frac{3}{8}\nu & \frac{1}{2} - \frac{\nu}{6} & -\frac{1}{8} - \frac{\nu}{8} & \frac{\nu}{6} & -\frac{1}{8} + \frac{3}{8}\nu & -\frac{1}{4} + \frac{\nu}{12} & \frac{1}{8} + \frac{\nu}{8} \\ -\frac{1}{8} + \frac{3}{8}\nu & \frac{\nu}{6} & -\frac{1}{8} - \frac{\nu}{8} & \frac{1}{2} - \frac{\nu}{6} & \frac{1}{8} - \frac{3}{8}\nu & -\frac{1}{4} - \frac{\nu}{12} & \frac{1}{8} + \frac{\nu}{8} & -\frac{1}{4} + \frac{\nu}{12} \\ -\frac{1}{4} + \frac{\nu}{12} & -\frac{1}{8} - \frac{\nu}{8} & \frac{\nu}{6} & \frac{1}{8} - \frac{3}{8}\nu & \frac{1}{2} - \frac{\nu}{6} & \frac{1}{8} + \frac{\nu}{8} & -\frac{1}{4} - \frac{\nu}{12} & -\frac{1}{8} + \frac{3}{8}\nu \\ -\frac{1}{8} - \frac{\nu}{8} & -\frac{1}{4} + \frac{\nu}{12} & -\frac{1}{8} + \frac{3}{8}\nu & -\frac{1}{4} - \frac{\nu}{12} & \frac{1}{8} + \frac{\nu}{8} & \frac{1}{2} - \frac{\nu}{6} & \frac{1}{8} - \frac{3}{8}\nu & \frac{\nu}{6} \\ \frac{\nu}{6} & -\frac{1}{8} + \frac{3}{8}\nu & -\frac{1}{4} + \frac{\nu}{12} & \frac{1}{8} + \frac{\nu}{8} & -\frac{1}{4} - \frac{\nu}{12} & \frac{1}{8} - \frac{3}{8}\nu & \frac{1}{2} - \frac{\nu}{6} & -\frac{1}{8} - \frac{\nu}{8} \\ \frac{1}{8} - \frac{3}{8}\nu & -\frac{1}{4} - \frac{\nu}{12} & \frac{1}{8} + \frac{\nu}{8} & -\frac{1}{4} + \frac{\nu}{12} & -\frac{1}{8} + \frac{3}{8}\nu & \frac{\nu}{6} & -\frac{1}{8} - \frac{\nu}{8} & \frac{1}{2} - \frac{\nu}{6} \\ \end{array} \right] \]
Macierz sztywności elementu \(\mathbf{K}\), dopóki nie zostaną na układ narzucone więzy unieruchamiające układ w przestrzeni jako ciało sztywne, jest osobliwa. Aby móc obliczyć przemieszczenia węzłów elementu pod działaniem określonych sił, nakładamy najpierw więzy. Załóżmy, że w naszym przypadku będą to więzy zamurowania lewego brzegu elementu, tzn. \(x_0 = y_0 = x_3 = y_3 = 0\). W postaci macierzowej powyższe cztery równania są równoznaczne z zastąpieniem wierszy o indeksach \(0\), \(1\), \(6\) i \(7\) jedynkami na głównej diagonali macierzy i przypisaniu zer na tych indeksach w wektorze prawej strony. Po narzuceniu więzów macierz nie jest już osobliwa i można rozwiązać układ choćby procedurą Gaussa.
meslib
),MX
i MY
oznaczają odpowiednio liczbę elementów w poziomie i w pionie w prostokątnej belce. Muszą to być zmienne globalne.draw
wymaga podania wskaźnika int *
do tablicy fix
o długości równej liczbie stopni swobody w siatce \(N = 2(MX+1)(MY+1)\). Jeśli na danej pozycji w tablicy stoi zero, przyjmujemy, że ten stopień swobody ulega przemieszczeniom. Wpisanie na danym miejscu wartości \(1\), oznacza, że stopień swobody o tym indeksie jest odebrany (tak układ zostanie narysowany przez procedurę rysującą draw
). Tablicę fix
należy także wykorzystać do narzucenia więzów na globalną macierz sztywności.meslib
w celu narysowania rozwiązanego układu.#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "meslib.h"
#include "winbgi2.h"
int MX = 1; // liczba elementow w poziomie
int MY = 1; // liczba elementow w pionie
int N = 2 * (MX + 1) * (MY + 1); // calkowita liczba stopni swobody
int main()
{// deklaracja wskaznika i alokacja tablicy wiezow
int *fix;
int*) calloc(N, sizeof(int));
fix = (if (fix == NULL) {
"main (fix)");
perror(1);
exit(
}
// pozostale deklaracje i alokacje pamieci
// uzupelnienie globalnej macierzy sztywnosci oraz wektorow wiezow i sil
// modyfikacja ukladu r-n ze wzgledu na wiezy
// rozwiazanie ukladu za pomoca funkcji gauss
// rysowanie rozwiazania
700, 700);
graphics(0, 0.5 * (MY - MX - 3), MX + 3, 0.5 * (MY + MX + 3));
scale("X", "Y", "MES");
title(
draw(d, f, fix);
wait();
// zwolnienie pamieci
free(fix);
return 0;
}
meslib
Biblioteka meslib
została stworzona na potrzeby laboratorium, aby uprościć i przyspieszyć implementację metody elementów skończonych. Zawiera szereg prostych i przydatnych funkcji oraz macierz sztywności i macierz masową pojedynczego elementu. Poniżej krótko opiszemy poszczególne funkcje:
int P(int id_x, int id_y, int dir)
- funkcja, która zwraca globalny indeks stopnia swobody przy założeniu, że id_x
to jego indeks w kierunku \(x\) (liczony od \(0\) na lewej krawędzi), id_y
to jego indeks w kierunku osi \(y\) (liczony od \(0\) na dolnej powierzchni belki), a dir
to \(0\) lub \(1\) zależnie od tego czy interesuje nas stopień swobody w kierunku poziomym, czy pionowym.int Q(int id_x, int id_y)
- funkcja zwracająca globalny indeks elementu przy założeniu, że jest to element o indeksie id_x
w kierunku poziomym i o indeksie id_y
w kierunku pionowym.int DOF(int elid_x, int elid_y, int locdofid)
- funkcja zwracająca globalny indeks stopnia swobody przy założeniu, że elid_x
oznacza indeks elementu w kierunku poziomym, elid_y
indeks elementu w kierunku pionowym, a locdofid
to liczba od \(0\) do \(7\) oznaczająca lokalny indeks danego stopnia swobody.K[8][8]
. Przy składaniu macierzy sztywności powinna być w programie przemnożona przez czynnik Md
zawierający wpływ modułu Younga oraz współczynnika Poissona oraz przez grubość elementu.M[8][8]
. Przy składaniu globalnej macierzy masowej powinna być w programie przemnożona przez czynnik Mm
zawierający wpływ gęstości materiału oraz dodatkowo należy ją przemnożyć przez grubość elementu.void gauss(int n, double **M, double *f, double *x)
- procedura eliminacji Gaussa rozwiązująca układ równań o macierzy zapisanej w dynamicznie zaalokowanej dwuwymiarowej tablicy M
o wymiarze n
, i wektorze prawej strony f
. Wynik zostanie wpisany do miejsc w pamięci wskazywanych przez wskaźnik *x
.void gauss_psp(int tabsize, double **A_ext, double *b_ext, double *x)
- procedura eliminacji Gaussa z wyborem częściowym elementu głównego (ang. partial scaled pivoting). Metoda zmniejsza propagację błądów numerycznych i pozwala odwracać większą klasę macierzy.void draw(double *p, double *f, int *fix)
- funkcja rysująca cały układ odkształconych elementów. `* pto wskaźnik na tablicę przesunięć poszczególnych stopni swobody,
* fto wskaźnik na tablicę sił węzłowych w tych stopniach swobody a
* fix` to wskaźnik na tablice więzów.