Estoy interesado en un consejo para estructuras de datos eficientes para la exploración celular en CFD de volumen finito no estructurado basado en células.
Un ejemplo que encontré (en el código dolfyn cfd) es el siguiente (mostraré el segmento relevante) Entonces tenemos una matriz NFaces donde se almacena el número de caras para cada celda. Luego, la matriz CFace que asigna el número de cara local a la celda al número de cara global.
El código se basa en la cara, por lo tanto, hay un tipo de datos de cara que almacena el número de serie de dos celdas que se encuentra entre Cara (k)% celda1 y Cara (k)% celda2.
Cualquier comentario sobre esto o sugerencias para un enfoque alternativo son bienvenidos
fuente
Sé que esta pregunta ya está respondida, pero aquí hay un almacenamiento en bucle basado en una sola cara similar que se implementa en la biblioteca OpenFOAM C ++:
Cada celda tiene un índice (ID) en una lista de celdas. Se definen dos listas para todas las caras: "propietario interno de la cara" y "vecino de la cara". La longitud de ambas listas de caras corresponde al número de caras internas en la malla. El propietario de una cara será la celda con la ID más baja en la lista de celdas (opuesta para la cara vecina) Las caras fronterizas se escriben en último lugar y tienen normales orientadas hacia afuera (desde el dominio de la solución) y, por supuesto, solo una celda propietaria. El área de la cara normal está orientada para que se vea hacia afuera desde la celda del propietario hacia la celda vecina.
Esto funciona bien, por ejemplo, para el cálculo de flujo. El flujo se evalúa una vez por cara, y se agrega a la suma de caras totales para las celdas propietarias, y se deduce de las celdas vecinas (la suma / deducción se decide en función de la orientación del área de la cara normal). Las caras de límite se ordenan y almacenan en la parte inferior de la lista de caras, lo que permite que las condiciones de límite se definan como sectores de la lista de caras (etiqueta de inicio, etiqueta final del parche de límite), simplificando así la implementación de las condiciones de límite, también como una mejora de la eficiencia del proceso de actualización para las condiciones de contorno, ya que depende de la solución provista por las operaciones en las caras internas.
Dado que las caras de límite se aglomeran en parches, la comunicación entre procesos se define para parches acoplados (procesador) y se predefinen. Esto significa que tan pronto como haya un bucle sobre la malla de límites, las funciones de acceso de nivel superior evocan llamadas MPI envueltas, haciendo que dicho código se paralelice "automáticamente", si se basa en la conectividad basada en la cara explicada anteriormente.
fuente