Domanda

Sto cercando di visualizzare alcuni dati che ho memorizzato su una griglia normale usando VTK (disegnando un'isosurfaccia colorata). Ho scritto del codice per scaricare i dati nel formato Legacy VTK che funziona per le versioni a bassa risoluzione dei dati. Posso estrarre e visualizzare l'isosuperficie prevista con paraview o la libreria VTK. Quando aumento la risoluzione di un fattore 10 in ogni dimensione (NX passa da circa 100 a 1000, lo stesso con NY, NZ), Paraview e uno spettatore che ho scritto usando la libreria VTK non sono corretti. Sembrano un set di fogli leggermente fuori asse invece di un singolo "blob". So da altri test che i dati stessi sono corretti.

C'è qualcosa che non va nel mio codice di dumping in formato VTK legacy qui sotto? Non capisco cosa faccia la tabella di ricerca, ma sembra funzionare bene per il caso a bassa risoluzione.

std::ofstream out(filename);

out << "# vtk DataFile Version 3.0" << std::endl;
out << "Signed distance/biharmonic visualizer" << std::endl;
out << "ASCII" << std::endl;
out << "DATASET STRUCTURED_POINTS" << std::endl;
out << "DIMENSIONS " << nx << " " << ny << " " << nz << std::endl;
out << "ORIGIN 0 0 0" << std::endl;
out << "SPACING " << h << " " << h << " " << h << std::endl;
out << "POINT_DATA " << nx*ny*nz << std::endl;
out << "SCALARS signedDistance double" << std::endl;
out << "LOOKUP_TABLE default" << std::endl;
for(size_t i = 0; i < nx; ++i)
  for(size_t j = 0; j < ny; ++j)
    for(size_t k = 0; k < nz; ++k)
      out << tempPhi(i,j,k) << std::endl;
out << "SCALARS biharmonic double" << std::endl;
out << "LOOKUP_TABLE default" << std::endl;
for(size_t i = 0; i < nx; ++i)
  for(size_t j = 0; j < ny; ++j)
    for(size_t k = 0; k < nz; ++k)
      out << biharmonic(i,j,k) << std::endl;
out.close();
È stato utile?

Soluzione

Nel file VTK fornisci ci sono una serie di occorrenze di 1.79769e+308. Per "vedere" i tuoi dati ho dovuto sostituirli con zeri. Dopo averlo fatto e esaminare il tuo file di dati Visitare Immagino che il tuo metodo di scrittura dei dati dei punti non è corretto (i tuoi tre nidificati per loop - che appiattiscono i dati da 3D a un elenco 1D).

Ti suggerirei di scrivere alcuni piccoli set di dati di test con il tuo scrittore VTK e anche con questo Codice C semplice, fornito con visite per scrivere file VTK legacy. Assicurati che i set di dati scritti con entrambi i metodi siano d'accordo (si noti che visitwriterlib.c scrivi i formati di file VTK versione 2, mentre si utilizzano la versione 3 - ciò non dovrebbe causare un problema).

Modificare: Come discusso nei commenti, il problema era l'ordinamento dei loop nidificati che venivano utilizzati per produrre i dati dei punti e appiattirli da 3D a un elenco 1D. Il codice

for(size_t i = 0; i < nx; ++i)
  for(size_t j = 0; j < ny; ++j)
    for(size_t k = 0; k < nz; ++k)
      out << tempPhi(i,j,k) << std::endl;

dovrebbe in effetti leggere

for(size_t k = 0; k < nz; ++k)
  for(size_t j = 0; j < ny; ++j)
    for(size_t i = 0; i < nx; ++i)
      out << tempPhi(i,j,k) << std::endl;

cioè i dati dovrebbero essere scritti colonna Ordine maggiore, non più grande. Questo è un punto in cui manca il documento dei formati di file VTK.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top