Hi Hom Nath,

Thank you very much for your email. The code you send it starting to make sense 
for me, I would just appreciate if you would explain a few things for me. At 
the minute I am outputting as follows within <AppendedData>:

size = idim*jdim*sizeof(float);
totalsize = size*4;
file << "_";
file.write(reinterpret_case<const char*>(&totalsize), 4);
file.write(&Array1, size);
file.write(&Array2, size);
file.write(&Array3, size);
file.write(&Array4, size);

But sadly it's not working. I compute the offset as:

for (i = 0; i < 4; i++)
{
    offset[i] = i*size;
}

Things get extremely strange in Paraview. I have one outputting five arrays 
same as above and I can read and view for first, third and fifth no problems 
but not the second or the fourth. The three that read even look like they 
should (although without extremely detailed checking.

I assume I am missing something about how to either compute the offset or the 
binary layout. Your code seems to say that each dataarray should have its own 
integer binary output tells the size of that data instead of just one at the 
start of the array?

Any help is greatly appreciated.
David



From: Hom Nath Gharti 
Sent: Wednesday, April 01, 2009 1:59 PM
To: David Mulholland 
Cc: Thorsten Hater ; [email protected] 
Subject: Re: [Paraview] VTK XML Binary Output


I thought my C code may be helpful to you. I have 5 data array of different 
size, and I do like this:

nvar=5;
/* Bytes and offsets for ParaView file */    
    bytes[0] = (ndim*nnod)*sizeof(float);     /* Coordinates */
    bytes[1] = (nenod*nelmt)*sizeof(int);     /* Connectivity */
    bytes[2] = (nelmt)*sizeof(int);         /* Offsets */
    bytes[3] = (nelmt)*sizeof(int);         /* Types */
    bytes[4] = (nelmt)*sizeof(float);         /* Cell data */
    
    off[0]=0; /* 1st offset */
    for (i=0; i<nvar; i++){        
        if(i<nvar-1)off[i+1]=off[i]+sizeof(int)+bytes[i];
        bytes[i]=bytes[i]+sizeof(int); /* For each byte we must also add the 
sizeof(int) for itself also */   
    }

Best wishes,
Hom Nath


2009/4/1 David Mulholland <[email protected]>

  Hi Thorsten, 

  I just tried that and it is now giving me a segmentation fault... I am using 
the following line: 
  file.write(reinterpret_cast<const char*>(size), 4);

  My size is calculated as - int size = idim*jdim*sizeof(float). idim is 
currently in the region of 400 and jdim 200. I am outputting big files and it 
is likely to get bigger.

  Also, I intend to include more data arrays each timestep, I just want to get 
it working with pressure first and then I will include then which is why I want 
to calculate the offset... I assuming it is just the number of bytes to the 
start of the next datafield...

  Thanks David 


  From: Thorsten Hater 
  Sent: Wednesday, April 01, 2009 10:55 AM
  To: David Mulholland 
  Cc: [email protected] 
  Subject: Re: [Paraview] VTK XML Binary Output


  Hello David,

  the offset parameter is relevant if you append mulitple data sections into a 
single file.
  Every DataArray tag with append format specifies the offset as the position 
in the 
  binary data in bytes.
  To write the integer I use the following:

  std::ofstream os; // binary mode (for windows ...) ofstream to your file
  int N; // size in bytes
  os.write(reinterpret_cast<const char*>(N), 4);

  Thorsten

  David Mulholland schrieb: 
    Hi Thorsten,

    That's really helpful. I don't quite know how to write out the number of 
bits as a char? If you could explain a way of how to do that it would be 
greatly appreciated. 

    Also, how do I calculate what value goes in for the offset? I had a look at 
a couple of output files from paraview and it wasnt obvious how it was 
calculated.

    Thanks
    David


    From: Thorsten Hater 
    Sent: Tuesday, March 31, 2009 2:23 PM
    To: David Mulholland 
    Cc: [email protected] 
    Subject: Re: [Paraview] VTK XML Binary Output


    Hello,

    the solution might be to append your data as

    < DataArray ... format="appended">
    </DataArray>
    < AppendedData encoding="raw">
    _NNNNData 
    </AppendedData>
    where you should replace NNNN with a four 
    byte integer containing the number of bytes 
    in the data array as 4 chars.
    Setting the encoding to "raw" tells ParaView, that
    the data is simply a stream of bytes rather than 
    base64 encoded.
    If you want to write Image I can supply a small
    writer project for 2D data.

        Thorsten
     
    David Mulholland schrieb: 
      Hello,

      I am currently trying to write my own quick output routine to generate a 
      binary file using C++. I am currently trying to avoid having to use the 
vtk 
      libraries because I only need a very basic output that doesn't change 
much. 
      I so far have the ASCII output working no problem but I can't get the 
binary 
      working.

      I am using file.write() function to output the binary data and that seems 
to 
      be working no problem and when used in a legacy format application it 
works 
      perfectly except that the data is LittleEndian instead of BigEndian. 
That's 
      why I have moved to BigEndian because I don't want to have to make the 
      output routine for the data anymore complicated that file.write.

      I started using the xml format and considering my output is raw binary 
and 
      not base64 I changed it to be in the AppendedData section instead of 
      DataArray. It still isn't working right, I get the following error when I 
      try to load in ParaView:

      ERROR: In ..\..\..\ParaView3\VTK\IO\vtkXMLStructuredDataReader.cxx, line 
349
      vtkXMLImageDataReader (0ADEC7F8): Error reading extent 0 422 0 242 0 1 
from 
      piece 0


      ERROR: In ..\..\..\ParaView3\VTK\IO\vtkXMLDataReader.cxx, line 537
      vtkXMLImageDataReader (0ADEC7F8): Cannot read cell data array "pressure" 
      from PointData in piece 0.  The data array in the element may be too 
short.

      The format of my output file is as follows:

      <?xml version="1.0"?>
      <VTKFile type="ImageData" version="0.1" byte_order="LittleEndian">
      <ImageData WholeExtent="0 422 0 242 0 1" Origin="0 0 0" Spacing="1 1 1">
      <Piece Extent="0 422 0 242 0 1">
      <PointData>
      </PointData>
      <CellData Scalars="pressure">
      <DataArray type="Float32" Name="pressure" format="appended" offset="0"/>
      </CellData>
      </Piece>
      </ImageData>
      <AppendedData encoding="raw">
      _BINARYDATA
      </AppendedData>
      </VTKFile>

      Note following an error message I have added an _ at the start of the 
binary 
      data. Is this required?

      One final thing, when using appended data, how do you calculate what the 
      offset should be?

      Thanks
      David
--------------------------------------------------------------------------
_______________________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the ParaView Wiki at: 
http://paraview.org/Wiki/ParaView

Follow this link to subscribe/unsubscribe:
http://www.paraview.org/mailman/listinfo/paraview
  




  _______________________________________________
  Powered by www.kitware.com

  Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

  Please keep messages on-topic and check the ParaView Wiki at: 
http://paraview.org/Wiki/ParaView

  Follow this link to subscribe/unsubscribe:
  http://www.paraview.org/mailman/listinfo/paraview


_______________________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the ParaView Wiki at: 
http://paraview.org/Wiki/ParaView

Follow this link to subscribe/unsubscribe:
http://www.paraview.org/mailman/listinfo/paraview

Reply via email to