Skip to content

Instantly share code, notes, and snippets.

@nicoguaro
Last active September 29, 2023 01:57
Show Gist options
  • Save nicoguaro/f5031acb5ae1efb6b0b96a511db0cf5f to your computer and use it in GitHub Desktop.
Save nicoguaro/f5031acb5ae1efb6b0b96a511db0cf5f to your computer and use it in GitHub Desktop.
Notebooks con implementaciones sencillas del método de elementos finitos para la ecuación de Poisson y de Helmholtz.
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Elementos finitos en 2D"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Queremos resolver la ecuación de Poisson\n",
"\n",
"$$\\nabla^2 u = -f(\\mathbf{x})\\quad \\forall \\mathbf{x}\\in \\Omega \\, ,$$\n",
"\n",
"con\n",
"\n",
"$$u(\\mathbf{x}) = 0\\quad \\forall \\mathbf{x} \\in \\partial\\Omega\\, .$$\n",
"\n",
"\n",
"Vamos a usar una solución aproximada de la forma\n",
"\n",
"$$u(\\mathbf{x}) = \\sum_{n=0}^{N} u_n \\phi_n(\\mathbf{x})\\, .$$\n",
"\n",
"Si usamos el método de Galerkin, la ecuación diferencial es equivalente\n",
"al siguiente problema variacional\n",
"\n",
"$$-\\int\\limits_\\Omega (\\nabla u) \\cdot (\\nabla \\phi_n) d\\Omega\n",
"= -\\int\\limits_\\Omega \\phi_n f d\\Omega\\, \\quad \\forall \\phi_n\\, .$$\n",
"\n",
"Si remplazamos $u(x)$ en este sistema obtenemos\n",
"\n",
"$$-\\sum_{j=0}^N \\left[\\int\\limits_\\Omega (\\nabla \\phi_i) \\cdot (\\nabla \\phi_j) d\\Omega\\right] u_j\n",
"= -\\int\\limits_\\Omega \\phi_j f d\\Omega\\, \\quad \\forall \\phi_j\\, .$$\n",
"\n",
"Esto lleva al siguiente sistema de ecuaciones\n",
"\n",
"$$[K]\\{\\mathbf{u}\\} = \\{\\mathbf{b}\\}$$\n",
"\n",
"Usando triángulos lineales, las matrices de rigidez son\n",
"\n",
"$$K_\\text{local} = \\frac{|J|}{2} (J^{-1}D)^T (J^{-1}D)\\, ,$$\n",
"\n",
"y\n",
"\n",
"$$b_\\text{local} = \\frac{|J| f(\\mathbf{x}_m)}{6} \n",
"\\begin{bmatrix}1\\\\ 1\\\\ 1 \\end{bmatrix}\\, ,$$\n",
"\n",
"donde $|J|$ es el determinante jacobiano de la transformación y\n",
"$\\mathbf{x}_m$ es el centroide del triángulo. Acá asumismos que\n",
"el término fuente era constante en el elemento.\n",
"\n",
"<div class=\"alert alert-warning\">\n",
"\n",
"Acá estamos dejando por fuera muchos detalles del ensamblaje de la\n",
"matriz y del mapeo del ordenamiento local al global.\n",
"</div>"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib widget"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from mpl_toolkits.mplot3d import Axes3D\n",
"import meshio"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"plt.rcParams[\"mathtext.fontset\"] = \"cm\""
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def assem(coords, elems, source):\n",
" \"\"\"\n",
" Ensambla la matriz de rigidez y el vector de cargas\n",
" \n",
" Parámetros\n",
" ----------\n",
" coords : ndarray, float\n",
" Coordenadas de los nodos.\n",
" elems : ndarray, int\n",
" Conectividad de los elementos.\n",
" source : ndarray, float\n",
" Término fuente evaluado en los nodos de la malla.\n",
" \n",
" Retorna\n",
" -------\n",
" stiff : ndarray, float\n",
" Matriz de rigidez del problema.\n",
" rhs : ndarray, float\n",
" Vector de cargas del problema.\n",
" \"\"\"\n",
" ncoords = coords.shape[0]\n",
" stiff = np.zeros((ncoords, ncoords))\n",
" rhs = np.zeros((ncoords))\n",
" for el_cont, elem in enumerate(elems):\n",
" stiff_loc, det = local_stiff(coords[elem])\n",
" rhs[elem] += det*np.mean(source[elem])/6\n",
" for row in range(3):\n",
" for col in range(3):\n",
" row_glob, col_glob = elem[row], elem[col]\n",
" stiff[row_glob, col_glob] += stiff_loc[row, col]\n",
" return stiff, rhs"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"def local_stiff(coords):\n",
" \"\"\"Calcula la matriz de rigidez local\n",
" \n",
" Parámetros\n",
" ----------\n",
" coords : ndarray, float\n",
" Coordenadas de los nodos del elemento.\n",
" \n",
" Retorna\n",
" -------\n",
" stiff : ndarray, float\n",
" Matriz de rigidez local.\n",
" det : float\n",
" Determinante del jacobian.\n",
" \"\"\"\n",
" dNdr = np.array([\n",
" [-1, 1, 0],\n",
" [-1, 0, 1]])\n",
" jaco = dNdr @ coords\n",
" det = np.linalg.det(jaco)\n",
" jaco_inv = np.linalg.inv(jaco)\n",
" dNdx = jaco_inv @ dNdr\n",
" stiff = 0.5 * det * (dNdx.T @ dNdx)\n",
" return stiff, det"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"def pts_restringidos(coords, malla, lineas_rest):\n",
" \"\"\"\n",
" Identifica los nodos restringidos y libres\n",
" para la malla.\n",
" \n",
" Parámetros\n",
" ----------\n",
" coords : ndarray, float\n",
" Coordenadas de los nodos del elemento.\n",
" malla : Meshio mesh\n",
" Objeto de malla de Meshio.\n",
" lineas_rest : list\n",
" Lista con los números para las líneas\n",
" restringidas.\n",
" \n",
" Retorna\n",
" -------\n",
" pts_rest : list\n",
" Lista de puntos restringidos.\n",
" pts_libres : list\n",
" Lista de puntos libres.\n",
" \"\"\"\n",
" lineas = [malla.cells[k].data for k in lineas_rest]\n",
" pts_rest = []\n",
" for linea in lineas:\n",
" pts_rest += set(linea.flatten())\n",
" pts_libres = list(set(range(coords.shape[0])) - set(pts_rest))\n",
" return pts_rest, pts_libres"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Ejemplo"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Vamos a resolver el problema en una malla de 6 triángulos que forman un\n",
"hexágono regular para ilustrar el uso de las funciones."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"sq3 = np.sqrt(3)\n",
"coords = np.array([\n",
" [sq3, -1],\n",
" [0, 0],\n",
" [2*sq3, 0],\n",
" [0, 2],\n",
" [2*sq3, 2],\n",
" [sq3, 3],\n",
" [sq3, 1]])\n",
"elems = np.array([\n",
" [1, 0, 6],\n",
" [0, 2, 6],\n",
" [2, 4, 6],\n",
" [4, 5, 6],\n",
" [5, 3, 6],\n",
" [3, 1, 6]])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A continuación visualizamos la malla."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c1610abb4ec44053aeb69ed9c2f4327a",
"version_major": 2,
"version_minor": 0
},
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABy7UlEQVR4nO3dd1yVdeP/8ddhgyKoyJKpKMs0xYV7D5SydWdDW3dlmVZmmVmalrfVbVvN6m6Z7cwSxa3gwr2ZogiIDCfgYp7fH3bz+3rnDjjAeT8fj/N43OfiuuCNd5zzPtd1fT4fg9FoNCIiIiIiZsPC1AFEREREpHqpAIqIiIiYGRVAERERETOjAigiIiJiZlQARURERMyMCqCIiIiImVEBFBERETEzKoAiIiIiZkYFUERERMTMqACKiIiImBkVQBEREREzowIoIiIiYmZUAEVERETMjAqgiIiIiJlRARQRERExMyqAIiIiImZGBVBERETEzKgAioiIiJgZFUARERERM6MCKCIiImJmVABFREREzIwKoIiIiIiZUQEUERERMTMqgCIiIiJmRgVQRERExMyoAIqIiIiYGRVAERERETOjAigiIiJiZlQARURERMyMCqCIiIiImVEBFBERETEzKoAiIiIiZkYFUERERMTMqACKiIiImBkVQBEREREzowIoIiIiYmZUAEVERETMjAqgiIiIiJlRARQRERExMyqAIiIiImZGBVBERETEzKgAioiIiJgZFUARERERM6MCKCIiImJmVABFREREzIwKoIiIiIiZUQEUERERMTMqgCIiIiJmRgVQRERExMyoAIqIiIiYGRVAERERETOjAigiIiJiZlQARURERMyMCqCIiIiImVEBFBERETEzKoAiIiIiZsbK1AFErqS8vJyjR4/i6OiIwWAwdRwRkWpjNBopLCzE09MTCwudq5HKpwIoNdbRo0fx9vY2dQwREZPJzMzEy8vL1DGkDlIBlBrL0dERuPgC2KBBAxOnERGpPgUFBXh7e1e8DopUNhVAqbH+e9m3QYMGKoAiYpZ0+4tUFd1YICIiImJmVABFREREzIwKoIiIiIiZUQEUERERMTMqgCIiIiJmRgVQRERExMyoAIqIiIiYGRVAERERETOjAigiIiJiZlQA5Zo++eQTWrduXbEiR3h4OEuXLr3qMbGxsYSFhWFnZ0ezZs2YO3du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
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment