493 lines
14 KiB
C
493 lines
14 KiB
C
|
/*
|
||
|
* Complex example C program to write a
|
||
|
* binary data file for Tecplot. This example
|
||
|
* does the following:
|
||
|
*
|
||
|
* 1. Open a data file called "field.plt."
|
||
|
* 2. Open a data file called "line.plt."
|
||
|
* 3. Assign values for X, Y and P. These will be used
|
||
|
* in both the ordered and finite-element data files.
|
||
|
* 4. Write out an ordered zone dimensioned 4 x 5 to "field.plt."
|
||
|
* 5. Assign values for XL and YL arrays.
|
||
|
* 6. Write out data for line plot to "line.plt." Make the data
|
||
|
* use double precision.
|
||
|
* 7. Write out a finite-element zone to "field.plt."
|
||
|
* 8. Write out a text record to "field.plt."
|
||
|
* 9. Write out a geometry (circle) record to "field.plt."
|
||
|
* 10. Close file 1.
|
||
|
* 11. Close file 2.
|
||
|
*/
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <math.h>
|
||
|
#include "TECIO.h"
|
||
|
|
||
|
int main(void)
|
||
|
{
|
||
|
float X[5][4], Y[5][4], P[5][4];
|
||
|
double XL[50], YL[50];
|
||
|
double SolTime;
|
||
|
INTEGER4 Debug, I, J, K, L, III, NPts, NElm, DIsDouble, VIsDouble, IMax, JMax, KMax;
|
||
|
INTEGER4 ICellMax, JCellMax, KCellMax, ZoneType, Clipping;
|
||
|
INTEGER4 StrandID, ParentZn, FieldFileType, LineFileType;
|
||
|
INTEGER4 SharingZone[3] = {0, 0, 0};
|
||
|
INTEGER4 IsBlock, NumFaceConnections, FaceNeighborMode, ShareConnectivityFromZone;
|
||
|
INTEGER4 NM[12][4];
|
||
|
double XP, YP, ZP, FH, LineSpacing, PatternLength;
|
||
|
double BoxMargin, BoxLineThickness, TextAngle;
|
||
|
INTEGER4 AttachToZone, Zone, Scope, PositionCoordSys, FontType, HeightUnits;
|
||
|
INTEGER4 IsFilled, GeomType, LinePattern, NumEllipsePts;
|
||
|
INTEGER4 Anchor, BoxType, BoxColor, BoxFillColor, TextColor, Color, FillColor;
|
||
|
INTEGER4 ArrowheadStyle, ArrowheadAttachment, NumSegments, NumSegPts[1];
|
||
|
double LineThickness, ArrowheadSize, ArrowheadAngle;
|
||
|
float XGeomData[1], YGeomData[1], ZGeomData[1];
|
||
|
enum FileType { FULL = 0, GRID = 1, SOLUTION = 2 };
|
||
|
|
||
|
Debug = 2;
|
||
|
VIsDouble = 0;
|
||
|
DIsDouble = 0;
|
||
|
FieldFileType = FULL;
|
||
|
LineFileType = FULL;
|
||
|
/*
|
||
|
* Open order.plt and write the header information.
|
||
|
*/
|
||
|
I = TECINI112((char*)"DATASET WITH ONE ORDERED ZONE AND ONE FE-QUAD ZONE OVER 2 TIME STEPS",
|
||
|
(char*)"X Y P",
|
||
|
(char*)"field.plt",
|
||
|
(char*)".",
|
||
|
&FieldFileType,
|
||
|
&Debug,
|
||
|
&VIsDouble);
|
||
|
/*
|
||
|
* Open line.plt and write the header information.
|
||
|
*/
|
||
|
VIsDouble = 1;
|
||
|
I = TECINI112((char*)"DATASET WITH ONE I-ORDERED ZONE",
|
||
|
(char*)"X Y",
|
||
|
(char*)"line.plt",
|
||
|
(char*)".",
|
||
|
&LineFileType,
|
||
|
&Debug,
|
||
|
&VIsDouble);
|
||
|
|
||
|
/*
|
||
|
* Calculate values for the field variables.
|
||
|
*/
|
||
|
for (J = 0; J < 5; J++)
|
||
|
for (I = 0; I < 4; I++)
|
||
|
{
|
||
|
X[J][I] = (float)(I + 1);
|
||
|
Y[J][I] = (float)(J + 1);
|
||
|
P[J][I] = (float)((I + 1) * (J + 1));
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Make sure writing to file #1.
|
||
|
*/
|
||
|
III = 1;
|
||
|
I = TECFIL112(&III);
|
||
|
|
||
|
/*
|
||
|
* Write the zone header information for the ordered zone.
|
||
|
*/
|
||
|
IMax = 4;
|
||
|
JMax = 5;
|
||
|
KMax = 1;
|
||
|
ICellMax = 0;
|
||
|
JCellMax = 0;
|
||
|
KCellMax = 0;
|
||
|
ZoneType = 0;
|
||
|
SolTime = 10.0;
|
||
|
StrandID = 1;
|
||
|
ParentZn = 0;
|
||
|
IsBlock = 1;
|
||
|
NumFaceConnections = 0;
|
||
|
FaceNeighborMode = 0;
|
||
|
ShareConnectivityFromZone = 0;
|
||
|
I = TECZNE112((char*)"Ordered Zone 1",
|
||
|
&ZoneType,
|
||
|
&IMax,
|
||
|
&JMax,
|
||
|
&KMax,
|
||
|
&ICellMax,
|
||
|
&JCellMax,
|
||
|
&KCellMax,
|
||
|
&SolTime,
|
||
|
&StrandID,
|
||
|
&ParentZn,
|
||
|
&IsBlock,
|
||
|
&NumFaceConnections,
|
||
|
&FaceNeighborMode,
|
||
|
NULL, /* PassiveVarList */
|
||
|
NULL, /* ValueLocation */
|
||
|
NULL, /* ShareVarFromZone */
|
||
|
0, /* TotalNumFaceNodes */
|
||
|
0, /* NumConnectedBoundaryFaces */
|
||
|
0, /* TotalNumBoundaryConnections */
|
||
|
&ShareConnectivityFromZone);
|
||
|
/*
|
||
|
* Write out the field data for the ordered zone.
|
||
|
*/
|
||
|
III = IMax * JMax;
|
||
|
I = TECDAT112(&III, &X[0][0], &DIsDouble);
|
||
|
I = TECDAT112(&III, &Y[0][0], &DIsDouble);
|
||
|
I = TECDAT112(&III, &P[0][0], &DIsDouble);
|
||
|
|
||
|
/*
|
||
|
* Calculate values for the I-ordered zone.
|
||
|
*/
|
||
|
|
||
|
for (I = 0; I < 50; I++)
|
||
|
{
|
||
|
XL[I] = I + 1;
|
||
|
YL[I] = sin((double)(I + 1) / 20.0);
|
||
|
}
|
||
|
/*
|
||
|
* Switch to the "line.plt" file (file number 2)
|
||
|
* and write out the line plot data.
|
||
|
*/
|
||
|
|
||
|
III = 2;
|
||
|
I = TECFIL112(&III);
|
||
|
|
||
|
/*
|
||
|
* Write the zone header information for the XY-data.
|
||
|
*/
|
||
|
IMax = 50;
|
||
|
JMax = 1;
|
||
|
KMax = 1;
|
||
|
SolTime = 0.0;
|
||
|
StrandID = 0; /* StaticZone */
|
||
|
I = TECZNE112((char*)"XY Line plot",
|
||
|
&ZoneType,
|
||
|
&IMax,
|
||
|
&JMax,
|
||
|
&KMax,
|
||
|
&ICellMax,
|
||
|
&JCellMax,
|
||
|
&KCellMax,
|
||
|
&SolTime,
|
||
|
&StrandID,
|
||
|
&ParentZn,
|
||
|
&IsBlock,
|
||
|
&NumFaceConnections,
|
||
|
&FaceNeighborMode,
|
||
|
0, /* TotalNumFaceNodes */
|
||
|
0, /* NumConnectedBoundaryFaces */
|
||
|
0, /* TotalNumBoundaryConnections */
|
||
|
NULL, /* PassiveVarList */
|
||
|
NULL, /* ValueLocation */
|
||
|
NULL, /* ShareVarFromZone */
|
||
|
&ShareConnectivityFromZone);
|
||
|
/*
|
||
|
* Write out the line plot.
|
||
|
*/
|
||
|
DIsDouble = 1;
|
||
|
III = IMax;
|
||
|
I = TECDAT112(&III, (float *) & XL[0], &DIsDouble);
|
||
|
I = TECDAT112(&III, (float *) & YL[0], &DIsDouble);
|
||
|
|
||
|
/*
|
||
|
* Switch back to the field plot file and write out
|
||
|
* the finite-element zone.
|
||
|
*/
|
||
|
III = 1;
|
||
|
I = TECFIL112(&III);
|
||
|
|
||
|
/*
|
||
|
* Move the coordinates so this zone's not on top of the other
|
||
|
*/
|
||
|
for (J = 0; J < 5; J++)
|
||
|
for (I = 0; I < 4; I++)
|
||
|
{
|
||
|
X[J][I] = (float)(I + 6);
|
||
|
Y[J][I] = (float)(J + 1);
|
||
|
P[J][I] = (float)((I + 1) * (J + 1));
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Write the zone header information for the finite-element zone.
|
||
|
*/
|
||
|
ZoneType = 3; /* FEQuad */
|
||
|
NPts = 20; /* Number of points */
|
||
|
NElm = 12; /* Number of elements */
|
||
|
KMax = 0; /* Unused */
|
||
|
SolTime = 10.0;
|
||
|
StrandID = 2;
|
||
|
I = TECZNE112((char*)"Finite Zone 1",
|
||
|
&ZoneType,
|
||
|
&NPts,
|
||
|
&NElm,
|
||
|
&KMax,
|
||
|
&ICellMax,
|
||
|
&JCellMax,
|
||
|
&KCellMax,
|
||
|
&SolTime,
|
||
|
&StrandID,
|
||
|
&ParentZn,
|
||
|
&IsBlock,
|
||
|
&NumFaceConnections,
|
||
|
&FaceNeighborMode,
|
||
|
0, /* TotalNumFaceNodes */
|
||
|
0, /* NumConnectedBoundaryFaces */
|
||
|
0, /* TotalNumBoundaryConnections */
|
||
|
NULL, /* PassiveVarList */
|
||
|
NULL, /* ValueLocation */
|
||
|
NULL, /* ShareVarFromZone */
|
||
|
&ShareConnectivityFromZone);
|
||
|
/*
|
||
|
* Write out the field data for the finite-element zone.
|
||
|
*/
|
||
|
IMax = 4;
|
||
|
JMax = 5;
|
||
|
III = IMax * JMax;
|
||
|
DIsDouble = 0;
|
||
|
I = TECDAT112(&III, &X[0][0], &DIsDouble);
|
||
|
I = TECDAT112(&III, &Y[0][0], &DIsDouble);
|
||
|
I = TECDAT112(&III, &P[0][0], &DIsDouble);
|
||
|
|
||
|
/*
|
||
|
* Calculate and then write out the connectivity list.
|
||
|
* Note: The NM array references cells starting with
|
||
|
* offset of 1.
|
||
|
*/
|
||
|
|
||
|
for (I = 1; I < IMax; I++)
|
||
|
for (J = 1; J < JMax; J++)
|
||
|
{
|
||
|
K = I + (J - 1) * (IMax - 1);
|
||
|
L = I + (J - 1) * IMax;
|
||
|
NM[K-1][0] = L;
|
||
|
NM[K-1][1] = L + 1;
|
||
|
NM[K-1][2] = L + IMax + 1;
|
||
|
NM[K-1][3] = L + IMax;
|
||
|
}
|
||
|
|
||
|
I = TECNOD112((INTEGER4 *)NM);
|
||
|
|
||
|
/*
|
||
|
* Calculate values for the new solution variable.
|
||
|
*/
|
||
|
for (J = 0; J < 5; J++)
|
||
|
for (I = 0; I < 4; I++)
|
||
|
{
|
||
|
P[J][I] = (float)(2.0 * (I + 1) * (J + 1));
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Write the zone header information for time step 2
|
||
|
*/
|
||
|
ZoneType = 0;
|
||
|
IMax = 4;
|
||
|
JMax = 5;
|
||
|
KMax = 1;
|
||
|
SolTime = 20.0;
|
||
|
StrandID = 1;
|
||
|
SharingZone[0] = 1;
|
||
|
SharingZone[1] = 1;
|
||
|
SharingZone[2] = 0; /* solution variable is not shared */
|
||
|
ShareConnectivityFromZone = 0;
|
||
|
|
||
|
I = TECZNE112((char*)"Ordered Zone 2",
|
||
|
&ZoneType,
|
||
|
&IMax,
|
||
|
&JMax,
|
||
|
&KMax,
|
||
|
&ICellMax,
|
||
|
&JCellMax,
|
||
|
&KCellMax,
|
||
|
&SolTime,
|
||
|
&StrandID,
|
||
|
&ParentZn,
|
||
|
&IsBlock,
|
||
|
&NumFaceConnections,
|
||
|
&FaceNeighborMode,
|
||
|
0, /* TotalNumFaceNodes */
|
||
|
0, /* NumConnectedBoundaryFaces */
|
||
|
0, /* TotalNumBoundaryConnections */
|
||
|
NULL,
|
||
|
NULL,
|
||
|
SharingZone,
|
||
|
&ShareConnectivityFromZone);
|
||
|
|
||
|
/*
|
||
|
* Write out the solution variable the grid variables are shared.
|
||
|
*/
|
||
|
IMax = 4;
|
||
|
JMax = 5;
|
||
|
III = IMax * JMax;
|
||
|
DIsDouble = 0;
|
||
|
I = TECDAT112(&III, &P[0][0], &DIsDouble);
|
||
|
|
||
|
/*
|
||
|
* Calculate values for the new solution variable.
|
||
|
*/
|
||
|
for (J = 0; J < 5; J++)
|
||
|
for (I = 0; I < 4; I++)
|
||
|
{
|
||
|
P[J][I] = (float)(3.0 * (I + 1) * (J + 1));
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Write another time step for the FEZone and share from the first
|
||
|
*/
|
||
|
ZoneType = 3;
|
||
|
SolTime = 20.0;
|
||
|
StrandID = 2;
|
||
|
KMax = 0;
|
||
|
SharingZone[0] = 2;
|
||
|
SharingZone[1] = 2;
|
||
|
SharingZone[2] = 0; /* solution variable is not shared */
|
||
|
ShareConnectivityFromZone = 2;
|
||
|
I = TECZNE112((char*)"Finite Zone 2",
|
||
|
&ZoneType,
|
||
|
&NPts,
|
||
|
&NElm,
|
||
|
&KMax,
|
||
|
&ICellMax,
|
||
|
&JCellMax,
|
||
|
&KCellMax,
|
||
|
&SolTime,
|
||
|
&StrandID,
|
||
|
&ParentZn,
|
||
|
&IsBlock,
|
||
|
&NumFaceConnections,
|
||
|
&FaceNeighborMode,
|
||
|
0, /* TotalNumFaceNodes */
|
||
|
0, /* NumConnectedBoundaryFaces */
|
||
|
0, /* TotalNumBoundaryConnections */
|
||
|
NULL, /* PassiveVarList */
|
||
|
NULL, /* ValueLocation */
|
||
|
SharingZone,
|
||
|
&ShareConnectivityFromZone);
|
||
|
|
||
|
/*
|
||
|
* Write out the solution variable the grid variables are shared.
|
||
|
*/
|
||
|
IMax = 4;
|
||
|
JMax = 5;
|
||
|
III = IMax * JMax;
|
||
|
DIsDouble = 0;
|
||
|
I = TECDAT112(&III, &P[0][0], &DIsDouble);
|
||
|
|
||
|
/*
|
||
|
* Prepare to write out text record. Text is positioned
|
||
|
* at 0.5, 0.5 in frame units and has a height
|
||
|
* of 0.05 frame units.
|
||
|
*/
|
||
|
XP = 50.0;
|
||
|
YP = 50.0;
|
||
|
ZP = 0.0;
|
||
|
FH = 5.0;
|
||
|
Scope = 1; /* Local */
|
||
|
Clipping = 1; /* Clip to frame */
|
||
|
PositionCoordSys = 1; /* Frame */
|
||
|
FontType = 1; /* Helv Bold */
|
||
|
HeightUnits = 1; /* Frame */
|
||
|
AttachToZone = 0;
|
||
|
Zone = 0;
|
||
|
BoxType = 0; /* None */
|
||
|
BoxMargin = 5.0;
|
||
|
BoxLineThickness = 0.5;
|
||
|
BoxColor = 3;
|
||
|
BoxFillColor = 7;
|
||
|
TextAngle = 0.0;
|
||
|
Anchor = 0; /* Left */
|
||
|
LineSpacing = 1.0;
|
||
|
TextColor = 0; /* Black */
|
||
|
|
||
|
III = TECTXT112(&XP,
|
||
|
&YP,
|
||
|
&ZP,
|
||
|
&PositionCoordSys,
|
||
|
&AttachToZone,
|
||
|
&Zone,
|
||
|
&FontType,
|
||
|
&HeightUnits,
|
||
|
&FH,
|
||
|
&BoxType,
|
||
|
&BoxMargin,
|
||
|
&BoxLineThickness,
|
||
|
&BoxColor,
|
||
|
&BoxFillColor,
|
||
|
&TextAngle,
|
||
|
&Anchor,
|
||
|
&LineSpacing,
|
||
|
&TextColor,
|
||
|
&Scope,
|
||
|
&Clipping,
|
||
|
(char*)"Hi Mom",
|
||
|
(char*)"");
|
||
|
|
||
|
/*
|
||
|
* Prepare to write out geometry record (circle). Circle is
|
||
|
* positioned at 25, 25 (in frame units) and has a radius of
|
||
|
* 20 percent. Circle is drawn using a dashed line.
|
||
|
*/
|
||
|
|
||
|
|
||
|
XP = 25.0;
|
||
|
YP = 25.0;
|
||
|
ZP = 0.0;
|
||
|
IsFilled = 0;
|
||
|
Color = 0;
|
||
|
FillColor = 7;
|
||
|
GeomType = 3; /* Circle */
|
||
|
LinePattern = 1; /* Dashed */
|
||
|
LineThickness = 0.3;
|
||
|
PatternLength = 1.5;
|
||
|
NumEllipsePts = 72;
|
||
|
ArrowheadStyle = 0;
|
||
|
ArrowheadAttachment = 0;
|
||
|
ArrowheadSize = 0.1;
|
||
|
ArrowheadAngle = 15.0;
|
||
|
NumSegments = 1;
|
||
|
NumSegPts[0] = 1;
|
||
|
|
||
|
XGeomData[0] = 20.0;
|
||
|
YGeomData[0] = 0.0;
|
||
|
ZGeomData[0] = 0.0;
|
||
|
|
||
|
|
||
|
III = TECGEO112(&XP,
|
||
|
&YP,
|
||
|
&ZP,
|
||
|
&PositionCoordSys,
|
||
|
&AttachToZone,
|
||
|
&Zone,
|
||
|
&Color,
|
||
|
&FillColor,
|
||
|
&IsFilled,
|
||
|
&GeomType,
|
||
|
&LinePattern,
|
||
|
&PatternLength,
|
||
|
&LineThickness,
|
||
|
&NumEllipsePts,
|
||
|
&ArrowheadStyle,
|
||
|
&ArrowheadAttachment,
|
||
|
&ArrowheadSize,
|
||
|
&ArrowheadAngle,
|
||
|
&Scope,
|
||
|
&Clipping,
|
||
|
&NumSegments,
|
||
|
NumSegPts,
|
||
|
&XGeomData[0],
|
||
|
&YGeomData[0],
|
||
|
&ZGeomData[0],
|
||
|
(char*)"");
|
||
|
|
||
|
/*
|
||
|
* Close out file 1.
|
||
|
*/
|
||
|
I = TECEND112();
|
||
|
|
||
|
/*
|
||
|
* Close out file 2.
|
||
|
*/
|
||
|
III = 2;
|
||
|
I = TECFIL112(&III);
|
||
|
I = TECEND112();
|
||
|
|
||
|
return 0;
|
||
|
}
|