Last active
September 29, 2023 01:57
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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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 |
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