[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