Написание наследственного файла VTK ASCII для рисования контуров в VisIt - PullRequest
1 голос
/ 09 января 2012

Я пытаюсь написать устаревший файл .vtk для чтения в VisIt с помощью C. К сожалению, моя установленная программа VisIt отказывается отрисовывать файл VTK, который я пишу, читая: 'local host fail'

Ниже приведен код, используемый для чтения данных из одного файла и преобразования его в устаревший файл VTK. Я использую макросы XPIX, YPIX и ZPIX для описания размеров пиксельной сетки. Каждый пиксель содержит значение скалярной плотности. Я перечислил пиксели в «сеточном файле», используя порядок строк: т.е.

int list_index(x,y,z) = YPIX * ZPIX * x + ZPIX * y + z;

Каждая запись в этом списке пикселей считывается в массив с именем grid[] типа double и записывается в outfile под устаревшими данными заголовка VTK:

/*Write vtk header */                                                           
fprintf(outfile,"# vtk DataFile Version 3.0\n");                                
fprintf(outfile,"Galaxy density grid\nASCII\nDATASET STRUCTURED_POINTS\n");     
fprintf(outfile,"DIMENSIONS %d %d %d \n", (XPIX+1), (YPIX+1), (ZPIX+1));        
fprintf(outfile,"ORIGIN 0 0 0\n");                                              
fprintf(outfile,"SPACING 1 1 1\n");//or ASPECT_RATIO                            
fprintf(outfile,"CELL_DATA %d\n", totalpix);                                    
fprintf(outfile,"SCALARS cell_density float 1\n");                              
fprintf(outfile, "LOOKUP_TABLE default\n");                                     

/*Create Memory Space to store Pixel Grid*/                                     
double *grid;                                                                   
grid = malloc(XPIX * YPIX * ZPIX * sizeof(double));                             
if (grid == NULL ){                                                             
  fprintf(stderr, "Pixel grid of type double failed to initialize\n");          
  exit(EXIT_FAILURE);                                                           
}                                                                               
fprintf(stderr,"Pixel grid has been initialized.\n Now reading infile\n");      

/*Read infile contents into double grid[], using Row-Major Indexing*/           
double rho;                                                                     
char newline;                                                                   
int i, j, k;                                                                    
for(i = 0; i < XPIX; i++){                                                      
  for(j = 0; j < YPIX; j++){                                                    
    for(k = 0; k < ZPIX; k++){                                                  
      fscanf(infile, "%lf", &rho);                                              
      grid[getindex(i,j,k)] = rho;                                              
    }                                                                           
  }                                                                             
  fprintf(stderr,"%d\n", i);                                                    
}                                                                               
fprintf(stderr,"Finished reading\n");                                           

#if !DEBUG                                                                      
/*Write out grid contents in Row major order*/                                  
fprintf(stderr,"Now writing vtk file");                                         
for(i = 0; i < XPIX; i++){                                                      
  for(j = 0; j < YPIX; j++){                                                    
    for(k = 0; k < ZPIX; k++){                                                  
      fprintf(outfile, "%lf ", grid[getindex(i,j,k)]);                          
    }                                                                           
    fprintf(outfile,"\n");                                                      
  }                                                                             
}                                                                               
fprintf(stderr,"Finished Writing to outfile\n");                                
#endif  

После выполнения списка данных сетки через эту процедуру у меня есть XPIX*YPIX строк в таблице lookup_table, каждая из которых содержит ZPIX записей. Это неправильный формат? VisIt продолжает сбой при чтении входного файла. Мне известно о том, что structured_points может использовать индексацию по основным столбцам, но моя первая цель, конечно же, получить какой-то результат от VisIt. Я хотел бы нарисовать контур, используя скалярную ячейку cell_density в конце концов. У меня слишком большой набор данных?

1 Ответ

2 голосов
/ 09 января 2012

Вы видели принятый ответ на вопрос Ошибка формата данных vtk ? Вопрос заключается в отладке модуля записи VTK в C ++, но он очень похож на ваш код (и, конечно, должен давать те же результаты).

Ключевым моментом из принятого ответа является то, что данные записываются в мажорном столбце порядке, не мажорном порядке строки (вы, похоже, намекаете на это в своем вопросе: «Я» Я осознаю тот факт, что structd_points могут использовать индексирование по основным столбцам ").

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

Редактировать : Чтобы ответить на пару других ваших вопросов:

После запуска списка данных сетки через эту процедуру, у меня есть Строки XPIX * YPIX в lookup_table, каждая из которых содержит записи ZPIX. Это неверный формат?

Это , а не правильный формат. LOOKUP_TABLE должен быть списком XPIX*YPIX*ZPIX строк, с одним элементом на строку (или, в качестве альтернативы, VisIt примет одну строку с XPIX*YPIX*ZPIX элементами). См. Раздел Формат атрибута набора данных в документе Форматы файлов VTK (www.vtk.org/VTK/img/file-formats.pdf).

.

Мой набор данных слишком большой?

Я сомневаюсь в этом. VisIt предназначен для обработки огромных наборов данных и, AFAIK, может отображать петабайтные наборы данных. Я был бы очень удивлен, если ваши данные настолько велики.

Однако, если вас беспокоит наличие больших файлов, вы можете разделить ваши данные на несколько файлов и сказать VisIt, что эти файлы считаются параллельными. Для этого запишите немного ваших данных в отдельные файлы, например, domain1.vtk, domain2.vtk, ... domainN.vtk и т. Д. Затем запишите главный файл .visit, имеющий структуру

!NBLOCKS N
domain1.vtk
domain2.vtk
...
domainN.vtk

Сохраните, например, mydata.visit, а затем откройте этот файл .visit, а не .vtk, в VisIt.

...