Estoy interesado en AMR local en mallas no estructuradas. Actualmente, estoy trabajando con la biblioteca OpenFOAM: admite AMR local completamente no estructurado:
- los criterios de refinamiento de celda determinan una lista de celdas que se cortan
- las celdas seleccionadas se refinan: se reconstruye toda la malla
- se crea un mapa desde la malla anterior a una nueva
- se vuelve a calcular la conectividad (celdas de cara, caras de borde, etc.)
- los campos se asignan a la nueva malla
Dado que las estructuras de datos involucradas son básicamente vectores C ++, la malla se infla, se copia.
Necesito aprender acerca de enfoques alternativos que se pueden construir sobre una malla que utiliza estructuras de datos estáticos. Uno de ellos es el AMR local paralelo de Octree Forrest, presente en p4est y Dendro .
¿Alguien puede señalarme un artículo de revisión reciente sobre estrategias de AMR adaptativas locales para mallas no estructuradas?
El asesoramiento basado en la experiencia sería aún mejor: ¿qué motor AMR local es la opción óptima para la malla no estructurada basada en la estructura de datos fijos?
Necesito una descripción general antes de leer sobre el equilibrio de la comunicación entre árboles en la primera página de un documento. :)
Respuestas:
De los comentarios anteriores, entiendo que desea evitar copiar el vector cuando agrega más celdas. El enfoque más fácil es reservar espacio para la cantidad máxima de celdas que desee tener:
Su vector ha asignado espacio para crear celdas maxNoCells pero aún no se han creado celdas. Ahora puede agregar maxNoCells a su vector, cada operación a
O(1)
tiempo, sin que el vector se copie. Sin embargo, el estándar C ++ requiere que la operación push_back sea tiempo amortizadoO(1)
. Si agrega más que maxNoCells, el vector se copiará a sí mismo, reservando espacio para k-veces tantas celdas como tenía anteriormente (las implementaciones típicas eligen ak entre 1.4 y 2), para que pueda seguir agregando celdas al vector aO(1)
tiempo. Esta operación de cambio de tamaño no lo esO(1)
.O(1)
O(1)
tiempo ... en la medida en que reserve memoria primero, ¡también puede agregar elementos en O (1) tiempo! Como el profesor Bangerth mencionó anteriormente, las estructuras de datos jerárquicos como los árboles también usan vectores internamente para almacenar sus datos.Sin embargo, creo que es una mejor práctica asignar memoria al comienzo de la simulación. Debe saber cuántas celdas puede necesitar para verificar si tiene suficiente memoria disponible. No desea que su simulación en 200,000 procesadores tenga que reasignar su estructura de datos o quedarse sin memoria y tener que cambiar al disco. En caso de que eso ocurra, mi opinión es que su programa debería fallar en voz alta debido a un error de entrada del usuario.
fuente