Me gustaría conocer un buen método para interpolar datos entre dos cuadrículas no estructuradas, donde una cuadrícula es una versión más gruesa de la otra.
La eficiencia es muy importante para mí, ya que estoy resolviendo un problema PDE transitorio en el que necesito transferir datos entre las cuadrículas en cada paso de la solución.
Pensé en usar kd-tree para buscar el nodo más cercano de un punto dado, luego usaría las funciones de forma de ese elemento (simulación FEM) para interpolar los datos. ¿Es esta una buena solución? ¿Hay mejores?
¿También conoce alguna biblioteca robusta y confiable en C / C ++ para esta tarea?
* Sé que hay una pregunta similar, pero pide el método más preciso en una cuadrícula estructurada.
interpolation
Bernardo MR
fuente
fuente
Respuestas:
Las redes no estructuradas tienen su lugar.
Es posible que desee ver el Marco de modelado del sistema terrestre (ESMF). Tienen un código para volver a cuadricular, específicamente para este propósito, y también han hecho algunas cosas ingeniosas con código paralelo. Todo el sistema está diseñado para acoplar modelos, por lo que también puede haber otras cosas útiles allí.
Algunas otras notas:
"No hay forma de hacer esto de manera eficiente para un número significativo de puntos"
bueno, eficiente es algo relativo: una vez que tienes la cuadrícula en una estructura de árbol, puedes buscarla en O (logn), que puede ser bastante rápido, aunque no O (1), como buscar en una cuadrícula regular es.
Además, parece que si bien la interpolación debe realizarse en cada paso, si las cuadrículas no se adaptan, la asignación de una cuadrícula a otra permanece constante. Por lo tanto, puede calcular ese mapeo (es decir, qué elemento en cada cuadrícula corresponde a qué elemento en el otro) de la manera que sea conveniente, almacenarlo y luego nunca necesita calcularlo nuevamente (hasta que las cuadrículas cambien).
Eso lo deja con el código de interpolación, donde querrá equilibrar la precisión con el rendimiento, la interpolación lineal simple a través de un triángulo es rápida y puede ser lo suficientemente buena.
"Pensé en usar kd-tree para buscar el nodo más cercano de un punto dado, luego usaría las funciones de forma de ese elemento"
recuerde que el nodo más cercano no le proporciona el elemento, por lo que querrá hacer un poco más para encontrar el elemento que desea. Una opción sería usar un rtree en su lugar, que almacena / busca por cuadro delimitador: obtendrá más de un elemento con cada búsqueda, pero luego puede verificar cuál de ellos es correcto directamente.
fuente
Si lo entiendo correctamente, desea completar los valores de la cuadrícula más fina interpolando en la cuadrícula más gruesa. Una forma de hacer interpolación lineal en una cuadrícula no estructurada es con triangulaciones de Delaunay (así es como se implementan los comandos griddata y TriScatteredInterp de Matlab). Después de construir una triangulación de los puntos de la cuadrícula, la interpolación se reduce a localizar el triángulo que contiene el punto objetivo, calcular sus coordenadas barcéntricas y usar los valores de las funciones en los vértices para calcular el valor interpolado. CGAL puede construir triangulaciones n-dimensionales (para el medio n), y también tiene un módulo de interpolación 2D incorporado .
fuente
Esto es lo que estoy haciendo en este momento, excepto que estoy transfiriendo valores de función en puntos de cuadratura, no en nodos. Estoy implementando la técnica explicada en la respuesta elegida a mi pregunta aquí: Encontrar en qué triángulos están los puntos .
fuente
Este es el tipo de trabajo para el que realmente desea evitar mallas no estructuradas, ya que no hay forma de hacerlo de manera eficiente para un número significativo de puntos. Debería considerar el uso de mallas que estén al menos relacionadas de alguna manera con cada una. Por ejemplo, si ambos se obtienen del refinamiento jerárquico de una malla gruesa, entonces puede averiguar de manera relativamente fácil y eficiente dónde se encuentran los puntos de interpolación de una malla en la otra malla.
fuente