[vtkusers] How to use the vtkLSDynaReader class to handle FEM data in LSDYNA database
Thompson, David C
dcthomp at sandia.gov
Sat Feb 20 12:59:34 EST 2010
Hi Viet,
You have the right idea using vtkCompositeDataGeometryFilter and a vtkPolyDataMapper to render the reader output. The error message you're getting could have 2 sources: either (1) because the vtkStructuredGridOutlineFilter expects to receive a single vtkStructuredGrid dataset as input, not a multiblock dataset; or (2) you have not included "vtkMultiBlockDataSet.h" in your code and the outline filter cannot determine that it inherits vtkDataObject. Since the LS-Dyna reader does not output structured grids, I recommend removing that filter from your code.
If you haven't already found it, another piece of code to examine is VTK/Graphics/Testing/Cxx/TestMultiBlock.cxx which also uses vtkCompositeDataGeometryFilter to do rendering.
David
________________________________________
From: Viet H.Q.H [viet at bakuhatsu.jp]
Sent: Saturday, February 20, 2010 04:47
To: Thompson, David C; vtkusers at vtk.org
Subject: Re: [vtkusers] How to use the vtkLSDynaReader class to handle FEM data in LSDYNA database
Dear David,
Because of forgetting to comment out some lines in an other part of the code, the error message appeared as shown in the previous mail.
Sorry for the false report.
Now I am able to access data in Lsdyna files:
//string dir="/home/viet/vtk_test/3dplot/";
//string dir="/home/viet/vtk_test/airbag/";
//string dir="/home/viet/vtk_test/billet/";
string dir="/home/viet/vtk_test/taylor/";
plLD->SetDatabaseDirectory(dir.c_str());
plLD->Update();
int dbValid=plLD->IsDatabaseValid();
cout<<"Is database valid = "<<dbValid<<endl;
char * title = plLD->GetTitle();
cout<<"Title = "<<title<<endl;
int cellArrNum = plLD->GetNumberOfCellArrays(4);
cout<<"Number of cell arrays = "<<cellArrNum<<endl;
int nodeNum=plLD->GetNumberOfNodes( );
cout<<"Number of nodes = "<<nodeNum<<endl;
plLD->Dump(cout);
By reference to "MultiBlock.cxx" in "VTK/Examples", I made a code for rendering as follows:
vtkMultiBlockDataSet* mbds = plLD->GetOutput();
vtkStructuredGridOutlineFilter* of = vtkStructuredGridOutlineFilter::New();
of->SetInput(mbds);
// geometry filter
vtkCompositeDataGeometryFilter* geom1 = vtkCompositeDataGeometryFilter::New();
geom1->SetInputConnection(0, of->GetOutputPort(0));
// Rendering objects
vtkPolyDataMapper* geoMapper = vtkPolyDataMapper::New();
geoMapper->SetInputConnection(0, geom1->GetOutputPort(0));
vtkActor* geoActor = vtkActor::New();
geoActor->SetMapper(geoMapper);
geoActor->GetProperty()->SetColor(0, 0, 0);
ren->AddActor(geoActor);
I've got a error message when compiling but still know no way to fix it.
error: no matching function for call to 'vtkStructuredGridOutlineFilter::SetInput(vtkMultiBlockDataSet*&)'
Could you please be a little bit more specific on the matter of rendering a vtkMultiBlockDataSet object by giving some examples or some reference links?
Thank you in advance and best regards,
Viet.
2010/2/20 Viet H.Q.H <viet at bakuhatsu.jp<mailto:viet at bakuhatsu.jp>>
Dear David,
Thank you very much for your quick responding.
As you had explained, I ran the following code for directories containing d3plot files generated from three examples at the site: http://www.dynaexamples.com
vtkLSDynaReader *plLD=vtkLSDynaReader::New( );
//string dir="/home/viet/vtk_test/airbag/";
//string dir="/home/viet/vtk_test/taylor/";
//string dir="/home/viet/vtk_test/billet/";
//plLD->SetDatabaseDirectory(dir.c_str());
plLD->SetDatabaseDirectory("/home/viet/vtk_test/taylor/");
plLD->Update();
I get the following error:
ERROR: In /home/viet/VTK/IO/vtkPLOT3DReader.cxx, line 126
vtkPLOT3DReader (0x194f5500): Must specify geometry file
How can I specify the geometry file?
The directory "taylor" is the directory containing a d3plot file generated from the file taylor1.k downloaded at the site: http://www.dynaexamples.com/sph/bar-iv.
# ls taylor
adptmp d3dump01.0000 d3dump01.0003 d3plot glstat messag0001 mf scr0000 scr0001h scr0003 taylor1.k
bg_switch d3dump01.0001 d3full01 d3plot01 log.txt messag0002 run.sh scr0000h scr0002 scr0003h
binout0000 d3dump01.0002 d3hsp dyna.str messag0000 messag0003 run.sh.bk scr0001 scr0002h status.out
I also got the same error message for the directories "airbag"<http://www.dynaexamples.com/examples-manual/misc/airbag> and "billet"<http://www.dynaexamples.com/examples-manual/control/timestep>.
Thank you in advance and best regards,
Viet.
On Sat, Feb 20, 2010 at 9:49 AM, David Thompson <dcthomp at sandia.gov<mailto:dcthomp at sandia.gov>> wrote:
I am a beginner of using VTK. I was trying to use the vtkLSDynaReader class to handle FEM data in LSDYNA database but found no program examples to start.
I checked some functions of vtkLSDynaReader class and found that they didn't function well.
For instance, the function CanReadFile always return the value of 1 regarless of the exitence of files.
Unlike many file formats, LS-Dyna stores results in many files located in a single directory. These files have canonical names, not user-specified names. So CanReadFile attempts to determine the directory containing whatever filename you pass it and looks for these canonically-named files (d3plot, for instance) in that directory. Therefore, instead of using SetFileName() it is recommended that you use SetDatabaseDirectory() to the name of a directory containing d3plot files.
If you have a specific circumstance where this is failing, some more information would help. For instance, does d3plot exist in that directory? Does it work if you pass CanReadFile an absolute path instead of a relative one like the example you included?
Are there any starting points to use the VTK to visualize FEM data in LSDYNA database?
It should be as simple as
vtkLSDynaReader* rdr = vtkLSDynaReader::New();
rdr->SetDatabaseDirectory( "/path/to/output" );
rdr->Update();
After calling Update(), GetOutput() should return a pointer to a vtkMultiBlockDataSet that you can render.
I have tested the reader with LS-Dyna output generated from many examples at http://www.dynaexamples.como/ including
http://www.dynaexamples.com/examples-manual/misc/airbag
http://www.dynaexamples.com/examples-manual/control/timestep
http://www.dynaexamples.com/sph/bar-iv
One important thing to note is that the reader only parses LS-Dyna *output*, not LS-Dyna input decks.
David
More information about the vtkusers
mailing list