*構造格子から非構造格子への変換(VTKライブラリ) [#k0eb16de]

構造格子を非構造格子に変換します。

可視化ソフトウェア[[ParaView:http://www.paraview.org]]の"Clean to Grid"フィルターおよび"Clean Cells to Grid"フィルターを使うと、構造格子をヘキサ要素に変換することで非構造格子にしますが、下絵の通り、円柱状の構造格子は上手く変換できません。これは、円柱の中心線上にあるプリズム要素を、縮退したヘキサ要素とみなして削除してしまうからです。

#ref(struct_to_unstruct_paraview.png,center,nowrap,40%,ParaViewでの変換);

そこで、上のフィルター"Clean to Grid"と"Clean Cells to Grid"で使用している関数(vtkCleanUnstructuredGrid, vtkCleanUnstructuredGridCells)を少し書き換えて、縮退したヘキサ要素をプリズム要素、ピラミッド要素、または、テトラ要素に変換するように修正しました。このプログラムを使用すると、穴が空かず、結果は期待するものとなりました。

#ref(struct_to_unstruct.png,center,nowrap,40%,プログラムでの変換);


**StructuredGridToUnstructuredGrid.cxxp [#y88ae58d]
#code(c){{
#include <vtkSmartPointer.h>
#include <vtkXMLGenericDataObjectReader.h>
#include <vtkXMLUnstructuredGridWriter.h>
#include <vtksys/SystemTools.hxx>

#include "vtkCleanUnstructuredGrid.h"
#include "vtkCleanUnstructuredGridCells.h"

#include<string>

int main(int argc, char* argv[])
{
  // Verify input arguments
  if (argc < 2)
    {
  {
    std::cerr << "Required arguments: InputFilename" << std::endl;
    return EXIT_FAILURE;
    }
  }

  // Get the filename from the command line;
  std::string inputFilename = argv[1];

  // Get all data from the file
  vtkSmartPointer<vtkXMLGenericDataObjectReader> reader =
    vtkSmartPointer<vtkXMLGenericDataObjectReader>::New();
  reader->SetFileName(inputFilename.c_str());
  reader->Update();

  vtkSmartPointer<vtkCleanUnstructuredGrid> cleanFilter =
    vtkSmartPointer<vtkCleanUnstructuredGrid>::New();
  cleanFilter->SetInputConnection(reader->GetOutputPort());
  cleanFilter->Update();

  vtkSmartPointer<vtkCleanUnstructuredGridCells> cleanCellsFilter =
    vtkSmartPointer<vtkCleanUnstructuredGridCells>::New();
  cleanCellsFilter->SetInputConnection(cleanFilter->GetOutputPort());
  cleanCellsFilter->Update();

  std::string outputFilename = vtksys::SystemTools::GetFilenameWithoutExtension(inputFilename)
  std::string outputFilename = 
    vtksys::SystemTools::GetFilenameWithoutExtension(inputFilename)
                               + ".vtu";
  vtkSmartPointer<vtkXMLUnstructuredGridWriter> writer =
    vtkSmartPointer<vtkXMLUnstructuredGridWriter>::New();
  writer->SetFileName(outputFilename.c_str());
  writer->SetInputConnection(cleanCellsFilter->GetOutputPort());
  writer->Update();
}

}}

**ダウンロードとビルド [#k551ac14]
ソースコードと'''CMakeLists.txt'''ファイル:
#ref(StructuredGridToUnstructuredGrid_src.zip)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS