Me pregunto cómo se implementan efectivamente las condiciones de contorno de Dirichlet en matrices globales de elementos finitos dispersos. Por ejemplo, supongamos que nuestra matriz global de elementos finitos fue:
Luego, para aplicar una condición de Dirichlet en el primer nodo ( ), pondríamos a cero la primera fila, pondríamos un 1 en y restaríamos la primera columna del lado derecho. Por ejemplo, nuestro sistema se convertiría en:
En teoría, todo esto está muy bien, pero si nuestra matriz K se almacena en formato de fila comprimido (CRS), mover las columnas hacia el lado derecho se vuelve costoso para sistemas grandes (con muchos nodos siendo dirichlet). Una alternativa sería no mover las columnas correspondientes a una condición de Dirichlet al lado derecho, es decir, nuestro sistema se convertiría en:
Sin embargo, esto tiene un inconveniente importante en que el sistema ya no es simétrico y, por lo tanto, ya no podríamos usar gradiente conjugado preacondicionado (u otros solucionadores simétricos). Una solución interesante que encontré es el "Método de grandes números" que encontré en el libro "Programación de elementos finitos en Java" de Gennadiy Nikishkov. Este método utiliza el hecho de que la precisión doble solo contiene alrededor de 16 dígitos de precisión. En lugar de poner un 1 en la posición colocamos un número grande. Por ejemplo, nuestro sistema se convierte en:
Las ventajas de este método son que mantiene la simetría de la matriz y al mismo tiempo es muy eficiente para formatos de almacenamiento dispersos. Mis preguntas son las siguientes:
¿Cómo se implementan típicamente las condiciones de contorno de Dirichlet en códigos de elementos finitos para calor / fluidos? ¿Usan las personas el método de grandes números por lo general o hacen algo más? ¿Hay alguna desventaja en el método de grandes números que alguien puede ver? Supongo que probablemente hay algún método eficiente estándar utilizado en la mayoría de los códigos comerciales y no comerciales que resuelve este problema (obviamente, no espero que las personas conozcan todo el funcionamiento interno de cada solucionador de elementos finitos comerciales, pero este problema parece básico / fundamental suficiente como para que alguien haya trabajado en tales proyectos y pueda brindar orientación).
Respuestas:
En deal.II ( http://www.dealii.org - descargo de responsabilidad: soy uno de los principales autores de esa biblioteca), eliminamos filas y columnas enteras, y no es demasiado costoso en general. El truco consiste en utilizar el hecho de que el patrón de dispersión suele ser simétrico, para que sepa en qué filas debe tener en cuenta al eliminar una columna completa.
El mejor enfoque, en mi opinión, es eliminar estas filas y columnas en las matrices de celdas, antes de que se agreguen a la matriz global. Allí trabajas con matrices completas, por lo que todo es eficiente.
Nunca he oído hablar del enfoque de grandes números y no lo usaría porque seguramente conducirá a problemas terriblemente mal condicionados.
Como referencia, los algoritmos que utilizamos en deal.II se describen conceptualmente en las clases 21.6 y 21.65 en http://www.math.colostate.edu/~bangerth/videos.html . Coinciden estrechamente con su descripción.
fuente
Cero BCs son fáciles. Para los BC no nulos también puede usar multiplicadores de Lagrange. Por ejemplo, mira aquí . Una ventaja de los LM es que puede usar cualquier ecuación de restricción, aunque el sistema se vuelve indefinido, por lo que necesita un solucionador adecuado.
fuente