Ошибка формата данных vtk - PullRequest
1 голос
/ 05 декабря 2011

Я пытаюсь визуализировать некоторые данные, которые я сохранил на обычной сетке, используя VTK (рисование цветной изоповерхности). Я написал код для вывода данных в устаревшем формате vtk, который работает для версий данных с низким разрешением. Я могу извлечь и просмотреть ожидаемую изоповерхность с помощью ParaView или библиотеки VTK. Когда я увеличиваю разрешение в 10 раз в каждом измерении (nx увеличивается от 100 до 1000, то же самое с ny, nz), paraview и программа просмотра, которую я написал с использованием библиотеки VTK, некорректны. Они выглядят как набор слегка смещенных осей, а не как один шарик. Из других тестов я знаю, что сами данные верны.

Что-то не так с моим прежним дамп-кодом формата vtk ниже? Я не понимаю, что делает таблица поиска, но, похоже, она отлично работает в случае низкого разрешения.

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();

1 Ответ

2 голосов
/ 08 декабря 2011

В указанном вами файле VTK есть несколько вхождений 1.79769e+308.Чтобы «увидеть» ваши данные, мне пришлось заменить их нулями.Сделав это и просмотрев ваш файл данных в VisIt , я бы предположил, что ваш метод записи данных точек неверен (три вложенных для циклов - которые сливают данные из 3D в одномерный список).

Я бы посоветовал вам написать несколько небольших наборов тестовых данных с помощью модуля записи VTK, а также этого простого кода C, который поставляется с VisIt для записи устаревших файлов VTK.Убедитесь, что наборы данных, написанные обоими методами, полностью совпадают (обратите внимание, что VisItWriterLib.c записывает форматы файлов VTK версии 2, тогда как вы используете версию 3 - однако это не должно вызывать проблем).

Редактировать: Как обсуждалось в комментариях, проблема заключалась в упорядочении вложенных циклов for, которые использовались для вывода данных точек и сглаживания их из 3D в одномерный список.Код

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;

должен фактически читать

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;

, т. Е. Данные должны быть записаны в столбце в главном порядке, а не в мажорной строке.Это тот момент, когда в документе формата файлов VTK отсутствует.

...