Cómo implementar eficientemente las condiciones de contorno de Dirichlet en matrices de rigidez global de elementos finitos dispersos

9

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:

K=[5 520 0-10 024 410 00 00 016 632-10 037 70 00 00 020 03]y vector del lado derechosi=[si1si2si3si4 4si5 5]

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: X1=CK11

K=[10 00 00 00 00 04 410 00 00 016 6320 00 037 70 00 00 020 03]y vector del lado derechosi=[Csi2-2×Csi3-0 0×Csi4 4+1×Csi5 5-0 0×C]

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:

K=[10 00 00 00 024 410 00 00 016 632-10 037 70 00 00 020 03]y vector del lado derechosi=[Csi2si3si4 4si5 5]

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: K11

K=[1.0mi6420 0-10 024 410 00 00 016 632-10 037 70 00 00 020 03]y vector del lado derechosi=[C×1.0mi64si2si3si4 4si5 5]

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).

James
fuente
2
¿Tienes evidencia de que esto te está frenando sustancialmente?
Bill Barth
@BillBarth Sí, aunque siempre existe la posibilidad de que esté haciendo algo de manera ineficiente. Gennadily mismo escribe que si bien el método explícito es fácil para las matrices 2D completas, "... no siempre es fácil acceder a las filas y columnas de la matriz cuando una matriz está en formato compacto". sugiriendo que el método explícito puede ser más difícil de implementar de manera eficiente. Como mi código está escrito actualmente, el método explícito puede llevar más tiempo que la resolución real.
James
1
hágalo como dice Wolfgang y aplique condiciones de contorno a las matrices de elementos antes de ensamblar.
Bill Barth
@BillBarth Sí, creo que haré eso. ¡Sus videos son increíbles! Acabo de dejarle un comentario / pregunta sobre si necesita volver a ensamblar las matrices globales en cada paso de tiempo, después de lo cual creo que aceptaré su respuesta.
James

Respuestas:

11

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.

Wolfgang Bangerth
fuente
2
En el caso de un problema dependiente del tiempo (digamos la ecuación de calor), ¿vuelve a ensamblar la matriz global en cada paso de tiempo? La razón por la que pregunto es que en el caso de condiciones de Dirichlet distintas de cero, necesita información de la matriz global original al modificar el lado derecho, pero si cerró esas columnas durante el paso de tiempo anterior, esta información se pierde (a menos que la almacene en matrices adicionales). Sin embargo, esto no sería un problema si la matriz global se vuelve a ensamblar cada vez, que es lo que estoy considerando hacer y lo que habría que hacer de todos modos si se usa una malla adaptativa.
James
1
Depende de la aplicación. Todos los códigos "grandes" resuelven problemas no lineales dependientes del tiempo, y para estos está claro que necesita volver a ensamblar de una forma u otra. Para códigos lineales, puede almacenar la matriz original y, en cada paso, copiarla en otro lugar, aplicar condiciones de contorno y luego usarla en el solucionador. Esto solo requiere más memoria, pero por lo demás es barato.
Wolfgang Bangerth
1
Ah, veo que eso es lo que sospechaba. Implementaré como usted sugirió. Ok, eso es por tu ayuda. Esos videos tutoriales deallii son realmente buenos por cierto!
James
2

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.

stali
fuente