[Paraview] Writing binary files: C/Fortran interface to VTK XMLfiles.

Thierry Dubuis tdubuis at scconsultants.com
Tue Jan 31 12:32:35 EST 2006


There are lot of encoding Base 64 program on the web but only in C, Java 
or Visual Basic.

If you can use C/C++ compiler, I thing the best way for you is to use 
the Brad King's fortran code example (see my last email).
To convert a data array to a string in C we use the memory copy in 
fortran I don't know.
Could you use pointer? 2 pointer on the same memory adress
1. the fist with the real*8 type
2. the second with a character type

Try in this way.

Best regards,
Thierry Dubuis

Stéphane Montésino wrote:

> Thanks for all tese answers, but I 'm still like an an homosexual with 
> a wonderfull girl. I don't know how to use it (sorry her).
>
> In fact, I would like to directly write this type of file that I can 
> obtain when I save my data with Paraview:
>
> <?xml version="1.0"?>
> <VTKFile type="RectilinearGrid" version="0.1" 
> byte_order="LittleEndian" compressor="vtkZLibDataCompressor">
>  <RectilinearGrid WholeExtent="1 8 1 4 1 16">
>    <Piece Extent="1 8 1 4 1 16">
>      <PointData>
>        <DataArray type="Float32" Name="pressure" format="appended" 
> offset="0"           />
>      </PointData>
>      <CellData>
>      </CellData>
>      <Coordinates>
>        <DataArray type="Float32" Name="X_COORDINATES" 
> format="appended" offset="956"         />
>        <DataArray type="Float32" Name="Y_COORDINATES" 
> format="appended" offset="1036"        />
>        <DataArray type="Float32" Name="Z_COORDINATES" 
> format="appended" offset="1092"        />
>      </Coordinates>
>    </Piece>
>  </RectilinearGrid>
>  <AppendedData encoding="base64">
>   _AQAAAACAAAAACAAAuQIAAA==eJwVy8fvoFMUx+HDdIkyWOiG/0Bvmzfm   etc.....
>  </AppendedData>
> </VTKFile>
>
> My knowledge are only reduces to Fluid mechanics.
>
> >>>>>>>>>>>>>Encode in Base 64 ? More details please...How to ?   
> <<<<<<<<<<<<<<<<<<<<<<
>
> Link properly to vtkIO ? More details please.
> >>>>>>>>>>>>>> Does it mean that VTK IO library should be installed on 
> the Computer where my CFD code run ?.
> I don't run my code on my own computer. It runs in Computing center 
> where I can't install what I want.
> >>>>>>>>So I would like to obtain some fortran routine I could link 
> myself  to my  CFD code  <<<<<<<<<<<<<<<<
>
> When I try  to write binary data in a formatted file:
> run-time error F6204: WRITE(pressure.vtr)
> - unformatted I/O not consistent with OPEN options
>
> When I try  to write formatted string in an unformatted file:
> run-time error F6200: WRITE(pressure.vtr)
> - formatted I/O not consistent with OPEN options
>
> >>>>>>>>>>>>>>>>How to convert my data to a string ?   
> <<<<<<<<<<<<<<<<<<<<<
>
>
> The format for raw appended binary data should be
>
> <AppendedData encoding="raw">
>  _NNNN...........................
> </AppendedData>
>
> Where the underscore is literal (as you already have) and the NNNN is a
> four-byte block containing an unsigned 32-bit count of the number of
> "words" in the array.  A word is one value of the type of the array, so
> in your case the NNNN would have the number of float values.  Then the
> number of bytes of binary data to follow should be NNNN*sizeof(float).
>
> If you have another appended data array in the same file then start it
> immediately after the end of the first array (with no newline or any
> other character.  Then specify in the offset="..." attribute for the
> corresponding DataArray the number of bytes beyond the underscore where
> the second array begins.
>
> -Brad
>
>
>
>
> Thierry Dubuis wrote:
>
>> Hello Stéphane,
>>
>> perhaps this email can help you ?
>>
>> Else if you want code directly your program in fortran :
>> 1. You must encode all you data in Base64
>> 2. And write them like a string.
>> 3. don't forget to add the size of your data block (integer*4) 
>> encoded in base64 before you block.
>>
>> Best regards,
>> Thierry Dubuis
>>
>> -------- Original Message --------
>> Subject:     Re: [Paraview] Writing binary files: C/Fortran interface 
>> to VTK XML files.
>> Date:     Tue, 07 Jun 2005 10:06:51 -0400
>> From:     Brad King <brad.king at kitware.com>
>> To:     SamuelKey <samuelkey at comcast.net>
>> CC:     paraview <paraview at paraview.org>, "Wylie, Brian" 
>> <bnwylie at sandia.gov>
>> References:     
>> <200506030152.j531quWp005650 at rrcs-mta-04.hrndva.rr.com> 
>> <42A05837.3010206 at kitware.com> <000a01c5684c$1d1a6740$6e01a8c0 at last>
>>
>>
>>
>> SamuelKey wrote:
>>
>>> Needing to have a C-compiler is not a problem for me; I have one.
>>>
>>> Let me try to work with what you commit next week and see if I have
>>> any ideas. I will be gone all next week, so you won't hear from me
>>> until week after next. With luck you may hear from someone else
>>> that will help keep you busy, though I suspect "busy" is not a
>>> problem for you.
>>
>>
>>
>> Okay, the C/Fortran interface is now available.  A C program can do
>>
>> #include "vtkXMLWriterC.h"
>>
>> and link to vtkIO.  A Fortran program can use the interface (see the 
>> example code below) but will need to compile one extra .c file to 
>> link properly to vtkIO.  See VTK/IO/vtkXMLWriterF.h for instructions.
>>
>> -Brad
>>
>>      PROGRAM Hello
>>      INTEGER writer
>>      INTEGER success
>>      INTEGER*8 numpoints/8/
>>      INTEGER*8 numcells/1/
>>      INTEGER*8 cellsSize/9/
>>      REAL*4 pdata(8)/0,0,0,0,1,1,1,1/
>>      REAL*4 points(24)/0,0,0, 1,0,0, 1,1,0, 0,1,0,
>>     _                  0,0,1, 1,0,1, 1,1,1, 0,1,1/
>>      INTEGER*8 cells(9)/8,0,1,2,3,4,5,6,7/
>>      call vtkXMLWriterF_New(writer)
>>      call vtkXMLWriterF_SetDataObjectType(writer, 4)
>>      call vtkXMLWriterF_SetFileName(writer, 'test1.vtu')
>>      call vtkXMLWriterF_SetPoints(writer, 10, points, numpoints)
>>      call vtkXMLWriterF_SetCellsWithType(writer, 12, numcells, cells,
>>     _                                    cellsSize)
>>      call vtkXMLWriterF_SetPointData(writer, 'example data', 10, pdata,
>>     _                                numpoints, 1, 'SCALARS')
>>      call vtkXMLWriterF_Write(writer, success)
>>      call vtkXMLWriterF_Delete(writer)
>>      PRINT *, 'success =', success
>>      END PROGRAM Hello
>> _______________________________________________
>> ParaView mailing list
>> ParaView at paraview.org
>> http://www.paraview.org/mailman/listinfo/paraview
>>
>>
>>
>>
>> Stéphane Montésino wrote:
>>
>>> With Asci, all is OK except the size of my file.
>>> So how to write my data array in binary with my fortran code.
>>> Does anyone have some details ?
>>>
>>> !    
>>> ****************************************************************************** 
>>>
>>> !    ****                       subrout 
>>> paraview_scalar                        ****
>>> !    
>>> ****************************************************************************** 
>>>
>>> !    Export 3D scalar data upon a Non uniform rectilinear Grid
>>> !
>>> !    n1m,n2m,n3m: size of the data and the grid
>>> !    y1,y2,y3: coordinates
>>> !    scal_data: data to write
>>> !    name: name of the data
>>> !
>>>      subroutine paraview_3d_scalar(n1m,n2m,n3m,y1,y2,y3,scal_data,name)
>>> !
>>>      implicit none
>>> !
>>>      INTEGER                      ,INTENT(IN)::n1m,n2m,n3m
>>>      REAL*8,DIMENSION(n1m)        ,INTENT(IN)::y1
>>>      REAL*8,DIMENSION(n2m)        ,INTENT(IN)::y2
>>>      REAL*8,DIMENSION(n3m)        ,INTENT(IN)::y3
>>>      REAL*8,DIMENSION(n1m,n2m,n3m),INTENT(IN)::scal_data
>>>      CHARACTER(LEN=10)            ,INTENT(IN)::name
>>> !
>>>      integer::i,j,k,nfil
>>> !
>>>      nfil=41
>>>      open(nfil,file=trim(name)//'.vtr')
>>>      write(nfil,*)'<VTKFile type="RectilinearGrid" version="0.1"',
>>>     &         ' byte_order="LittleEndian">'
>>>      write(nfil,*)'  <RectilinearGrid WholeExtent=',
>>>     &                '"1 ',n1m,' 1 ',n2m,' 1 ',n3m,'">'
>>>      write(nfil,*)'    <Piece Extent=',
>>>     &                  '"1 ',n1m,' 1 ',n2m,' 1 ',n3m,'">'
>>>      write(nfil,*)'      <Coordinates>'
>>>      write(nfil,*)'        <DataArray type="Float32"',
>>>     &                             ' Name="X_COORDINATES"',
>>>     &                             ' NumberOfComponents="1">'
>>>      write(nfil,*) (y1(i),i=1,n1m)
>>>      write(nfil,*)'        </DataArray>'
>>>      write(nfil,*)'        <DataArray type="Float32"',
>>>     &                             ' Name="Y_COORDINATES"',
>>>     &                             ' NumberOfComponents="1">'
>>>      write(nfil,*) (y2(j),j=1,n2m)
>>>      write(nfil,*)'        </DataArray>'
>>>      write(nfil,*)'        <DataArray type="Float32"',
>>>     &                             ' Name="Z_COORDINATES"',
>>>     &                             ' NumberOfComponents="1">'
>>>      write(nfil,*) (y3(k),k=1,n3m)
>>>      write(nfil,*)'        </DataArray>'
>>>      write(nfil,*)'      </Coordinates>'
>>>      write(nfil,*)'      <PointData Scalars="scalar">'
>>>      write(nfil,*)'        <DataArray Name="'//trim(name)//'"',
>>>     &                             ' type="Float32"',
>>>     &                             ' NumberOfComponents="1"',
>>>     &                             ' format="ascii">'
>>>      write(nfil,*) (((scal_data(i,j,k),i=1,n1m),j=1,n2m),k=1,n3m)
>>>      write(nfil,*)'        </DataArray>'
>>>      write(nfil,*)'      </PointData>'
>>>      write(nfil,*)'    </Piece>'
>>>      write(nfil,*)'  </RectilinearGrid>'
>>>      write(nfil,*)'</VTKFile>'
>>>      close(nfil)
>>> !
>>>      return
>>>      end
>>>
>>> _______________________________________________
>>> ParaView mailing list
>>> ParaView at paraview.org
>>> http://www.paraview.org/mailman/listinfo/paraview
>>>  
>>>
>>
>
>


-- 
Thierry Dubuis
--------------------------------
Sciences & Computers Consultants
Tel : 04 77 49 75 84
Std : 04 77 49 75 80
Fax : 04 77 33 68 04



More information about the ParaView mailing list