Metodo di interpolazione efficiente per le reti non strutturate?


12

Vorrei conoscere un buon metodo per interpolare i dati tra due griglie non strutturate, in cui una griglia è una versione più grossolana dell'altra.

L'efficienza è molto importante per me poiché sto risolvendo un problema transitorio di PDE in cui ho bisogno di trasferire dati tra le reti in ogni momento della soluzione.

Ho pensato di usare kd-tree per cercare il nodo più vicino di un dato punto, quindi avrei usato le funzioni di forma di quell'elemento (simulazione FEM) per interpolare i dati. È una buona soluzione? Ce ne sono di migliori?

Conosci anche qualche libreria robusta e affidabile in C / C ++ per questa attività?

* So che c'è una domanda simile, ma richiede il metodo più accurato su una griglia strutturata.


guarda queste domande e risposte
denfromufa

Risposte:


6

Le griglie non strutturate hanno il loro posto.

Potresti voler dare un'occhiata al Earth System Modeling Framework (ESMF). Hanno un po 'di codice per ri-grigliare - appositamente per questo scopo - e hanno fatto anche cose interessanti con codice parallelo. L'intero sistema è progettato per accoppiare modelli, quindi potrebbero esserci anche altre cose utili.

Alcune altre note:

"nessun modo per farlo in modo efficiente per un numero significativo di punti"

bene, l'efficienza è una cosa relativa - una volta che hai la griglia in una struttura ad albero, puoi cercarla in O (logn), che può essere dannatamente veloce, anche se non O (1), come cercare una griglia normale è.

Inoltre, sembra che mentre l'interpolazione debba essere eseguita in ogni momento, se le griglie non si adattano, la mappatura da una griglia all'altra rimane costante. Quindi puoi calcolare quella mappatura (cioè quale elemento in ciascuna griglia corrisponde a quale elemento nell'altra) in qualunque modo sia conveniente, memorizzarlo, e quindi non dovrai mai calcolarlo (fino a quando le griglie cambiano).

Ciò ti lascia con il codice di interpolazione - dove vorrai bilanciare l'accuratezza con le prestazioni - l'interpolazione lineare semplice attraverso un triangolo è veloce e può essere abbastanza buona.

"Ho pensato di usare kd-tree per cercare il nodo più vicino di un dato punto, quindi avrei usato le funzioni di forma di quell'elemento"

ricorda che il nodo più vicino non ti fornisce l'elemento, quindi ti consigliamo di fare un po 'di più per trovare l'elemento che desideri. Un'opzione sarebbe quella di usare invece un rtree, che memorizza / ricerca per riquadro di selezione - otterrai più di un elemento con ogni ricerca, ma puoi quindi verificare quale di questi è direttamente corretto.


Questo sembra carino. Non ho bisogno di adattare le mesh, quindi la mappatura da una griglia all'altra verrà effettuata una sola volta. Grazie per il suggerimento sulla struttura dei dati di r-tree.
Bernardo MR,

1
Sono ancora convinto che questo non possa essere fatto in modo efficiente :-) In realtà ci sono due problemi: (i) In genere hai punti , quindi una ricerca per ogni punto porta ancora a un comportamento globale superlineare. (ii) La parte più costosa è in realtà l'interpolazione sulla cella che hai appena trovato perché devi tornare al sistema di coordinate di quella cella, valutare le funzioni della forma, moltiplicare con i coefficienti, ecc. È molto lavoro se hai bisogno farlo per un gran numero di punti di interpolazione. O ( log N )O(N)O(logN)
Wolfgang Bangerth,

7

Se ti capisco correttamente, vuoi inserire i valori della griglia più fine interpolando sulla griglia più grossolana. Un modo per eseguire l'interpolazione lineare su una griglia non strutturata è con le triangolazioni Delaunay (in questo modo vengono implementati i comandi griddata e TriScatteredInterp di Matlab). Dopo aver costruito una triangolazione dei punti della griglia, l'interpolazione si riduce alla posizione del triangolo contenente il punto target, calcolando le sue coordinate baricentriche e utilizzando i valori delle funzioni sui vertici per calcolare il valore interpolato. CGAL può costruire triangolazioni n-dimensionali (per n medio) e ha anche un modulo di interpolazione 2d incorporato.


Sì. Ma voglio anche "iniettare" i valori dalla griglia fine alla griglia grezza, ecco perché ho detto trasferimento.
Bernardo MR

3

Questo è quello che sto facendo al momento, tranne per il fatto che sto trasferendo i valori delle funzioni in punti di quadratura, non nodi. Sto implementando la tecnica spiegata nella risposta prescelta alla mia domanda qui: Trovare in quali punti triangoli ci sono .

ABAB

  1. BpiA
  2. pi
  3. AA
  4. Ap1p2p3A

NMAO(NM)O(max(N,M))


2

Questo è il tipo di lavoro per il quale vuoi davvero evitare maglie non strutturate poiché non c'è modo di farlo in modo efficiente per un numero significativo di punti. Dovresti considerare l'utilizzo di mesh almeno in qualche modo correlate a ciascuna. Ad esempio, se entrambi sono ottenuti dalla raffinatezza gerarchica di una mesh grossolana, è possibile scoprire in modo relativamente semplice ed efficiente dove si trovano i punti di interpolazione di una mesh sull'altra mesh.


Penso che potrebbe essere l'opzione migliore (gerarchia di griglie). In questo caso, conosci una buona struttura di dati o un metodo specifico da utilizzare?
Bernardo MR

Sì, le mesh gerarchiche sono tutte memorizzate come alberi quad / oct (se iniziano su una singola cella grossolana) o foreste di tali alberi (se la mesh grossolana ha più di una cella).
Wolfgang Bangerth,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.