Probar y visualizar grandes conjuntos de índices

8

Pronto implementaré el método nodal discontinuo de Galerkin, y habiendo hecho esto antes de conocer las matrices de indexación básicas que tendré que calcular, dada una malla y datos polinomiales.

El problema que encontré en el código anterior fueron errores sutiles que cometí al calcular cosas como la indexación de trazas interior / exterior. Los problemas que no surgieron en casos de prueba más simples surgirían en mallas más grandes, y generalmente esto produce un esquema inestable ya que las condiciones de contorno no se imponen correctamente (por lo que no hay posibilidad de simplemente ver la simulación cada 10 pasos más o menos y ver un problema localizado) .

Espero que algunas personas con más experiencia conozcan buenas pruebas para ejecutar en las matrices de índices para tener la confianza de que tienen razón. Las cuadraturas, derivados y similares son muy fáciles de probar, pero no puedo entender otras cosas.

Algunas pruebas que he hecho en el pasado están agregando normales interiores a normales exteriores, lo que debería producir 0 o + -2. Ser útil poder ver rápidamente el resultado de algún cambio de código es útil, pero no puedo pensar en una manera significativa de hacerlo con la indexación.

También debo mencionar que estos están yendo para quads y hexes, con el potencial de elementos curvilíneos. Ya no hay mucho código existente para comparar con una biblioteca en funcionamiento.

Puntos de bonificación si hay buenas pruebas unitarias que puedo escribir que no se basarían en una respuesta correcta existente para comparar. Me conformaré con muchas buenas heurísticas.

Reid.Atcheson
fuente

Respuestas:

7

La respuesta obvia sería, por supuesto, no implementarlo todo usted mismo, sino usar lo que otros han hecho antes. Por ejemplo, deal.II (http://www.dealii.org - descargo de responsabilidad: soy uno de los autores de esta biblioteca) ya tiene elementos DG en quads, hexes y elementos curvos, programas tutoriales que muestran cómo usar todo esto, ya se ha probado durante una década y se prueba a través de 2.700 pruebas de regresión después de cada cambio en el repositorio. Hay mucho trabajo que guardar para ti.

Pero volviendo a la pregunta original: lo que a menudo hago para este tipo de cosas cuando escribo casos de prueba para un acuerdo. II es hacer algo para lo que conozco la solución exacta y verificar que realmente la obtengo. Ejemplo: si tiene un elemento de interpolación (nodal), entonces, en una celda , asigne a cada grado de libertad el valor de una función en los nodos . Haga esto a mano , utilizando su conocimiento de cómo se ordenan los grados de libertad. Esto produce una función donde . Luego use una fórmula en cuadratura para calcular algo como . SiKf(x)xiuh(x)=iUiφi(x)Ui=f(xi)uhf2=K|uh(x)f(x)|2dxfera un polinomio del mismo orden que su espacio ansatz, entonces el resultado debería ser cero. Si mezcló índices, ya sea al asignar valores a grados de libertad a mano o en su programa al evaluar en puntos de cuadratura, obtendrá algo que no es cero.uh

El punto de todo esto es que en su prueba, utiliza dos métodos independientes para lidiar con la indexación (su conocimiento, cuando asigna valores a DoFs a mano, y lo que su código piensa que es correcto al evaluar ) y deben estar de acuerdo. Si no lo hacen, al menos uno de ellos es incorrecto.uh

Por supuesto, una vez que tenga esto en ejecución, debe guardar el caso de prueba y ejecutarlo periódicamente para asegurarse de no volver a romper accidentalmente este tipo de funcionalidad.

Wolfgang Bangerth
fuente
Si no lo hacen, al menos uno de ellos es correcto. -> uno de ellos es incorrecto?
Ondřej Čertík
Sí, por supuesto. Lo corregí
Wolfgang Bangerth
Gracias por la buena respuesta. La razón por la que estoy haciendo la mayor parte yo mismo es que la implementación es parte de la novedad de la investigación, estoy menos interesado en la simulación en sí misma que en cómo puedo mejorarla con diferentes estrategias de implementación.
Reid.Atcheson el
Ese es un objetivo válido. Pero está compitiendo con un software que ha sido optimizado durante una década. ¿Por qué no tratar de ver qué puede mejorar en uno de los paquetes existentes?
Wolfgang Bangerth