CFD Online Discussion Forums

CFD Online Discussion Forums (http://www.cfd-online.com/Forums/)
-   Tecplot (http://www.cfd-online.com/Forums/tecplot/)
-   -   I created a tecplot binary file... (http://www.cfd-online.com/Forums/tecplot/95920-i-created-tecplot-binary-file.html)

AlbertoVe January 7, 2012 20:57

I created a tecplot binary file...
 
Dear all, I wrote a fortran code to create a binary .plt file containing a triangular mesh and relevant results for each nodes that can be read from tecplot. I read the manual http://download.tecplot.com/360/dataformat.pdf here and I followed the instruction in appendix A (pag 147). I really cannot understand what s wrong with my code. Tecplot reads the file but the mesh is wrong. I checked everything plenty of times, everything looks fine to me. Did anybody do that?any tecplot expert that can tell me what is wrong with my code? I paste the code below. In my code nodi contains the number of nodes and maglie contains the number of cells. i am simply trying to obtain the triangular mesh made of 4 elements in figure 4.10 pag 130.
thanks

Code:

        Program tecplot

          IMPLICIT NONE
    INTEGER nodi,maglie,ncan,j,iter,i, buttaINT,iWRITE,nTIMEstep,
    & iREAD,MAXexten,posiz,nOUT,k,N1,N2,N3,kkk,M,nodiGEO,jSTAMPA,
    & NumVar,FileType,ZoneType,StrandID,VarLoc,
    & jmax
    REAL*4 dt,BUTTA,butta1,butta2,butta4,butta3,butta5
      real*8 t,DBLEmin,DBLEmax
      integer, ALLOCATABLE :: iterOUT(:),n123(:,:),nodeCELLcenter(:)
      real*4, ALLOCATABLE :: vettore(:),tOUT(:),x(:),CSprint(:,:),
    &  y(:),z(:),CSnod(:),CS(:,:),area(:),areaNOD(:)
    character*40 nomefile,FM,variab,NOMEFILEGEO,intNAME,fileBUTTA
      character*8 header
      character*1 aster
      CHARACTER*1 NULCHAR
      logical stampa


        nodi  = 6
      maglie = 4
      x(1)=-1.0; y(1)= 0.0 
      x(2)= 0.0; y(2)= 0.0 
      x(3)= 1.0; y(3)= 0.0 
      x(4)=-0.5; y(4)= 0.8 
      x(5)= 0.5; y(5)= 0.8 
      x(6)= 0.0; y(6)= 1.6 
  numvar = 2
      allocate (CSprint(max(maglie,nodi),numvar),nodeCELLcenter(numvar))
  !     
      ! write BINARY FILE FOR TECPLOT
      !
      ! All character strings are null terminated (i.e. terminated by a zero value)
        !header = '#!TDV112'
        iwrite = iwrite+1
        write(36,rec=iwrite) '#!TDV112' !header
        iwrite = iwrite+2 !2 because it is a  char*8 and it fills 8 byte (2*recl)
       
          !ii. Integer value of 1.
          buttaINT =1
          write(36,rec=iwrite) buttaINT  ; iwrite = iwrite+1
         
         
          !iii. Title and variable names.
          FileType = 0 !Title and variable names. 0 = FULL,1 = GRID, 2 = SOLUTION
          write(36,rec=iwrite) FileType ; iwrite = iwrite+1
          write(36,rec=iwrite) ICHAR('T') ; iwrite = iwrite+1
          write(36,rec=iwrite) ICHAR(NULCHAR) ; iwrite = iwrite+1
!
          write(36,rec=iwrite) NumVar  ; iwrite = iwrite+1
          !DO I=1,NUMVAR
          !!Variable names (INT32*N). N = L[1] + L[2] + ....  L[NumVar]where:L[i] = length of the ith variable name + 1(for the  terminating 0 value).
            write(36,rec=iwrite) ICHAR('x')
            iwrite = iwrite+1
            write(36,rec=iwrite) ICHAR(NULCHAR)
            iwrite = iwrite+1
            write(36,rec=iwrite) ICHAR('y')
            iwrite = iwrite+1
            write(36,rec=iwrite) ICHAR(NULCHAR)
            iwrite = iwrite+1
          !ENDDO
          !iv. Zones
          BUTTA = 299.0 !Zone marker.
          write(36,rec=iwrite) BUTTA      ;iwrite = iwrite+1
          write(36,rec=iwrite) ICHAR('Z') ;iwrite = iwrite+1 !Zone name  (INT32*N). N = (length of zone name) + 1(for the terminating 0 value).
          write(36,rec=iwrite) ICHAR('O') ;iwrite = iwrite+1
          write(36,rec=iwrite) ICHAR('N') ;iwrite = iwrite+1
          write(36,rec=iwrite) ICHAR('E') ;iwrite = iwrite+1
          write(36,rec=iwrite) ICHAR('1') ;iwrite = iwrite+1
          write(36,rec=iwrite) ICHAR(NULCHAR) ; iwrite = iwrite+1
          write(36,rec=iwrite) -1 !0 !ParentZone: 0 = indicates that  this zone is not associated with a parent zone.>0 = A value greater  than zero is considered this zone's parent.
          iwrite = iwrite+1
          StrandID = 0
          write(36,rec=iwrite) StrandID !IN REALTA IL MANUALE DICE  StrandID=0 =>static zone  StrandID: -2 = pending strand ID for  assignmentby Tecplot; -1 = static strand ID; 0 <= N < 32700 valid  strand ID
          iwrite = iwrite+1
          t =t + DBLE(dt)
          write(36,rec=iwrite) t
          iwrite = iwrite+1
          iwrite = iwrite+1
          write(36,rec=iwrite) -1 !Not used.
          iwrite = iwrite+1
          ZoneType =2
          write(36,rec=iwrite) ZoneType !ZoneType 0=ORDERED,  1=FELINESEG,  2=FETRIANGLE, 3=FEQUADRILATERAL, 4=FETETRAHEDRON,  5=FEBRICK, 6=FEPOLYGON, 7=FEPOLYHEDRON
          iwrite = iwrite+1
          VarLoc = 1
          write(36,rec=iwrite) VarLoc !Specify Var Location.  0 = Don’t specify, all data is locatedat the nodes. 1 = Specify
          iwrite = iwrite+1
          if (VarLoc.eq.1) then
            nodeCELLcenter(1) = 0
            nodeCELLcenter(2) = 0
            do i=1,numvar
              write(36,rec=iwrite) nodeCELLcenter(i) !0 = Node, 1 = Cell Centered (See note 5.)
              iwrite = iwrite+1
            enddo
          endif
          write(36,rec=iwrite) 0 !Are raw local 1-to-1 face neighbors supplied? (0=FALSE 1=TRUE).
          iwrite = iwrite+1
          write(36,rec=iwrite) 0 !Number of miscellaneous user-defined  face neighbor connections (value >= 0). This value is in addition to  the face neighbors
          iwrite = iwrite+1
          write(36,rec=iwrite) nodi
          iwrite = iwrite+1
          write(36,rec=iwrite) maglie
          iwrite = iwrite+1
          write(36,rec=iwrite) 0,0,0 !ICellDim,JCellDim, KCellDim (for future use; set to zero)
          iwrite = iwrite+3
          write(36,rec=iwrite)  0 !1=Auxiliary name/value pair to follow ;  0=No more Auxiliary name/value pairs.
          iwrite = iwrite+1
          !v. Geometries
          !write(36,rec=iwrite) 399.0e0 ! Geometry marker. Value = 399.0
          !iwrite = iwrite+1
          !vi. Text
          !write(36,rec=iwrite) 499.0e0 !Text marker. Value=499.0
          !iwrite = iwrite+1
          !vii.CustomLabel
          !write(36,rec=iwrite) 599.0e0 !CustomLabel Marker; F=599
          !iwrite = iwrite+1
          !viii.UserRec
          !write(36,rec=iwrite) 699.0e0 !UserRec Marker; F=699
          !iwrite = iwrite+1
          !ix. Dataset Auxiliary data.
          !write(36,rec=iwrite) 799.0e0 !DataSetAux Marker; F=799.0
          !iwrite = iwrite+1
          !x. Variable Auxiliary data.
          !write(36,rec=iwrite) 999.0e0 !VarAux Marker; F=899.0
          !iwrite = iwrite+1
          write(36,rec=iwrite) 357.0e0  !EOHMARKER, value=357.0
          iwrite = iwrite+1
          !II. DATA SECTION
          write(36,rec=iwrite) 299.0e0 !Zone marker Value = 299.0
          iwrite = iwrite+1
          !i. For both ordered and fe zones:
          DO I=1,NUMVAR
            write(36,rec=iwrite) 1  !Variable data format (INT32*N),  N=Total number of vars 1=Float, 2=Double, 3=LongInt,4=ShortInt, 5=Byte,  6=Bit
            iwrite = iwrite+1
          ENDDO
          write(36,rec=iwrite) 0  !Has passive variables: 0 = no, 1 = yes.
          iwrite = iwrite+1
          write(36,rec=iwrite) 0  !Has variable sharing 0 = no, 1 = yes.
          iwrite = iwrite+1
          write(36,rec=iwrite) -1 !Zero based zone number to share  connectivity list with (-1 = no sharing). FEPOLYGON and FEPOLYHEDRON  zones use this zone number to share face map data.
          iwrite = iwrite+1
          !Compressed list of min/max pairs for each non-shared and non-passive variables
          CSprint(1:nodi,1) = x(1:nodi);
          CSprint(1:nodi,2) = y(1:nodi);
          DO I=1,numvar
            if (nodeCELLcenter(i).eq.0) then
              jmax = nodi
            elseif (nodeCELLcenter(i).eq.1) then
              jmax = maglie
            endif
            DBLEmin = DBLE(MINVAL(CSprint(1:jmax,i)))
            DBLEmax = DBLE(MAXVAL(CSprint(1:jmax,i)))
            write(36,rec=iwrite) DBLEmin
            iwrite = iwrite+2
            write(36,rec=iwrite) DBLEmax
            iwrite = iwrite+2
            DO J=1,jmax
              write(36,rec=iwrite) CSprint(j,I) 
              iwrite = iwrite+1
            enddo
          enddo
          !ii. specific to ordered zones
          !iii. specific to fe zones
          do i=1,maglie
!            do k=1,3
!              buttaINT = n123(k,i)
!              write(36,rec=iwrite) buttaINT
!              iwrite = iwrite+1
!            enddo
            write(36,rec=iwrite) 1, 2, 4
            iwrite = iwrite+3
            write(36,rec=iwrite) 2, 5, 4
            iwrite = iwrite+3
            write(36,rec=iwrite) 3, 5, 2
            iwrite = iwrite+3
            write(36,rec=iwrite) 5, 6, 4
            iwrite = iwrite+3
          enddo
      enddo
    STOP
    END


wenlong June 8, 2012 17:47

Missing DataPacking parameter
 
The document is INACCURATE although it is a 2012 version. On page 150 of the pdf file, between


+-----------+
| INT32 | ZoneType 0=ORDERED, 1=FELINESEG,
+-----------+ 2=FETRIANGLE, 3=FEQUADRILATERAL,
4=FETETRAHEDRON, 5=FEBRICK,
6=FEPOLYGON, 7=FEPOLYHEDRON

and

+-----------+
| INT32 | Specify Var Location.
+-----------+ 0 = Donít specify, all data is located
at the nodes.
1 = Specif


The following is missing:
+-----------+
| INT32 | DataPacking 0=Block, 1=Point
+-----------+

See an earlier version of the document (line 83):

http://download.tecplot.com/tecio/360/binaryformat.txt

Hopefully this solves your problem.

Wen

andreasp June 12, 2012 14:14

seems that you are not using the tecio library for writing the .plt file.
any specific reason for that? for me the library has always worked fine. so this might help you...

best, andreas

wenlong June 12, 2012 14:49

I'm trying to get it going with matlab/octave. The tecio works fine, but I find it not convenient to call the c programs from matlab.

If you have done that, please let me know.

andreasp June 12, 2012 15:07

Sorry I don't really have experience with C functions in matlab. The only thing I know is that you need to use this MEX interface. Possibly, you are also required to use a certain compiler for your C code in order to stay compatible with the Matlab runtime libs. (For gcc I somehow believe you must not use a compiler newer than gcc 4.4... just breaking out old memories with no guarantee...)

But anyway, it should be possible (with moderate effort) to call C/C++/Fortran routines from Matlab...

wenlong June 12, 2012 16:03

Thanks! I'm 3 quarters done with writing a matlab function that will generate binary plt files (lines, surfaces, bricks, finite elements and geometries) without using tecio or mex. I will post it here for folks to use after I finish debugging.

The tecplot has now deprecated POINT type of datapacking.

wenlong June 27, 2012 19:56

mat2tecplot.m
 
1 Attachment(s)
Dear all,

I finally finished and tested a matlab program that will dump data to tecplot binary format directly without using tecio. I'm loving it and here you go. Please see the attached mat2tecplot.m .

Simply unzip it and type in matlab command:

mat2tecplot

It will show you how it works.

Wen Long


All times are GMT -4. The time now is 10:48.