367 lines
11 KiB
C++
367 lines
11 KiB
C++
/* This example illustrates using separate grid
|
|
* and solution files.
|
|
*/
|
|
|
|
#include "TECIO.h"
|
|
#include "MASTER.h" /* for defintion of NULL */
|
|
|
|
int main()
|
|
{
|
|
/* DOCSTART:gridsolution_grid_tecini.txt*/
|
|
INTEGER4 I; /* use to check return values */
|
|
|
|
INTEGER4 Debug = 1;
|
|
INTEGER4 VIsDouble = 0;
|
|
INTEGER4 FileType = 1; /* 1 = grid file. */
|
|
|
|
I = TECINI112((char*)"Example: Separate grid and solution files",
|
|
(char*)"X Y Z", /* Defines the variables for the data file.
|
|
* Each zone must contain each of the vars
|
|
* listed here. The order of the variables
|
|
* in the list is used to define the
|
|
* variable number (e.g. X is Variable 1).
|
|
* When referring to variables in other
|
|
* TecIO functions, you will refer to the
|
|
* variable by its number.
|
|
*/
|
|
(char*)"grid.plt",
|
|
(char*)".", /* scratch directory */
|
|
&FileType,
|
|
&Debug,
|
|
&VIsDouble);
|
|
/* DOCEND */
|
|
|
|
/* DOCSTART:gridsolution_grid_teczne.txt*/
|
|
/* TECZNE Parameters */
|
|
INTEGER4 ZoneType = 7; /* FE Polyhedron */
|
|
INTEGER4 NumPts = 20; /* the number of unique
|
|
* nodes in the zone.
|
|
*/
|
|
INTEGER4 NumElems = 1;
|
|
INTEGER4 NumFaces = 12; /* the number of unique
|
|
* faces in the zone.
|
|
*/
|
|
INTEGER4 ICellMax = 0; /* not used */
|
|
INTEGER4 JCellMax = 0; /* not used */
|
|
INTEGER4 KCellMax = 0; /* not used */
|
|
double SolutionTime = 0.0;
|
|
INTEGER4 StrandID = 1; /* time strand for
|
|
* unsteady solution.
|
|
*/
|
|
INTEGER4 ParentZone = 0;
|
|
INTEGER4 IsBlock = 1;
|
|
INTEGER4 NumFaceConnections = 0;
|
|
INTEGER4 FaceNeighborMode = 1;
|
|
INTEGER4 SharConn = 0;
|
|
|
|
/* For this zone, the total number of face nodes is
|
|
* five times number of faces, because each face
|
|
* is a pentagon.
|
|
*/
|
|
INTEGER4 TotalNumFaceNodes = 5 * NumFaces;
|
|
|
|
/* This zone has no connected boundary faces.
|
|
*/
|
|
INTEGER4 TotalNumBndryFaces = 0;
|
|
INTEGER4 TotalNumBndryConns = 0;
|
|
|
|
I = TECZNE112((char*)"Dodecahedron", /* Name of the zone. */
|
|
&ZoneType,
|
|
&NumPts,
|
|
&NumElems,
|
|
&NumFaces,
|
|
&ICellMax,
|
|
&JCellMax,
|
|
&KCellMax,
|
|
&SolutionTime,
|
|
&StrandID,
|
|
&ParentZone,
|
|
&IsBlock,
|
|
&NumFaceConnections,
|
|
&FaceNeighborMode,
|
|
&TotalNumFaceNodes,
|
|
&TotalNumBndryFaces,
|
|
&TotalNumBndryConns,
|
|
NULL,
|
|
NULL, /* All nodal variables */
|
|
NULL,
|
|
&SharConn);
|
|
/* DOCEND */
|
|
|
|
/* DOCSTART:gridsolution_grid_tecdat.txt*/
|
|
/* TECDAT Parameters */
|
|
double Phi = 0.5 * (1.0 + sqrt(5.0));
|
|
double Pi = 3.141592653578;
|
|
double *X = new double[NumPts];
|
|
double *Y = new double[NumPts];
|
|
double *Z = new double[NumPts];
|
|
int Count = 0;
|
|
|
|
for(int J = 0; J <= 4; J++)
|
|
{
|
|
X[Count] = 2.0 * cos(2.0 / 5.0 * Pi * J);
|
|
Y[Count] = 2.0 * sin(2.0 / 5.0 * Pi * J);
|
|
Z[Count] = Phi + 1.0;
|
|
Count++;
|
|
|
|
X[Count] = -X[Count - 1];
|
|
Y[Count] = -Y[Count - 1];
|
|
Z[Count] = -Z[Count - 1];
|
|
Count++;
|
|
|
|
X[Count] = 2.0 * Phi * cos(2.0 / 5.0 * Pi * J);
|
|
Y[Count] = 2.0 * Phi * sin(2.0 / 5.0 * Pi * J);
|
|
Z[Count] = Phi - 1.0;
|
|
Count++;
|
|
|
|
X[Count] = -X[Count - 1];
|
|
Y[Count] = -Y[Count - 1];
|
|
Z[Count] = -Z[Count - 1];
|
|
Count++;
|
|
}
|
|
|
|
INTEGER4 IsDouble = 1;
|
|
|
|
I = TECDAT112(&NumPts, X, &IsDouble);
|
|
I = TECDAT112(&NumPts, Y, &IsDouble);
|
|
I = TECDAT112(&NumPts, Z, &IsDouble);
|
|
|
|
delete X;
|
|
delete Y;
|
|
delete Z;
|
|
/* DOCEND */
|
|
|
|
/* DOCSTART:gridsolution_grid_facenodes.txt*/
|
|
/* TecPolyFace Parameters */
|
|
|
|
/* Create a FaceNodes array, dimensioned by the total number
|
|
* of face nodes in the zone.
|
|
*/
|
|
INTEGER4 *FaceNodes = new INTEGER4[TotalNumFaceNodes];
|
|
int n = 0;
|
|
|
|
/* Face Nodes for face 1 of the dodecahedron */
|
|
FaceNodes[n++] = 2;
|
|
FaceNodes[n++] = 6;
|
|
FaceNodes[n++] = 10;
|
|
FaceNodes[n++] = 14;
|
|
FaceNodes[n++] = 18;
|
|
|
|
/* Face Nodes for face 2 */
|
|
FaceNodes[n++] = 6;
|
|
FaceNodes[n++] = 8;
|
|
FaceNodes[n++] = 19;
|
|
FaceNodes[n++] = 12;
|
|
FaceNodes[n++] = 10;
|
|
|
|
/* Face Nodes for face 3 */
|
|
FaceNodes[n++] = 3;
|
|
FaceNodes[n++] = 12;
|
|
FaceNodes[n++] = 10;
|
|
FaceNodes[n++] = 14;
|
|
FaceNodes[n++] = 16;
|
|
|
|
/* Face Nodes for face 4 */
|
|
FaceNodes[n++] = 7;
|
|
FaceNodes[n++] = 16;
|
|
FaceNodes[n++] = 14;
|
|
FaceNodes[n++] = 18;
|
|
FaceNodes[n++] = 20;
|
|
|
|
/* Face Nodes for face 5 */
|
|
FaceNodes[n++] = 2;
|
|
FaceNodes[n++] = 4;
|
|
FaceNodes[n++] = 11;
|
|
FaceNodes[n++] = 20;
|
|
FaceNodes[n++] = 18;
|
|
|
|
/* Face Nodes for face 6 */
|
|
FaceNodes[n++] = 2;
|
|
FaceNodes[n++] = 4;
|
|
FaceNodes[n++] = 15;
|
|
FaceNodes[n++] = 8;
|
|
FaceNodes[n++] = 6;
|
|
|
|
/* Face Nodes for face 7 */
|
|
FaceNodes[n++] = 1;
|
|
FaceNodes[n++] = 3;
|
|
FaceNodes[n++] = 12;
|
|
FaceNodes[n++] = 19;
|
|
FaceNodes[n++] = 17;
|
|
|
|
/* Face Nodes for face 8 */
|
|
FaceNodes[n++] = 1;
|
|
FaceNodes[n++] = 3;
|
|
FaceNodes[n++] = 16;
|
|
FaceNodes[n++] = 7;
|
|
FaceNodes[n++] = 5;
|
|
|
|
/* Face Nodes for face 9 */
|
|
FaceNodes[n++] = 5;
|
|
FaceNodes[n++] = 7;
|
|
FaceNodes[n++] = 20;
|
|
FaceNodes[n++] = 11;
|
|
FaceNodes[n++] = 9;
|
|
|
|
/* Face Nodes for face 10 */
|
|
FaceNodes[n++] = 4;
|
|
FaceNodes[n++] = 11;
|
|
FaceNodes[n++] = 9;
|
|
FaceNodes[n++] = 13;
|
|
FaceNodes[n++] = 15;
|
|
|
|
/* Face Nodes for face 11 */
|
|
FaceNodes[n++] = 8;
|
|
FaceNodes[n++] = 15;
|
|
FaceNodes[n++] = 13;
|
|
FaceNodes[n++] = 17;
|
|
FaceNodes[n++] = 19;
|
|
|
|
/* Face Nodes for face 12 */
|
|
FaceNodes[n++] = 1;
|
|
FaceNodes[n++] = 5;
|
|
FaceNodes[n++] = 9;
|
|
FaceNodes[n++] = 13;
|
|
FaceNodes[n++] = 17;
|
|
/* DOCEND */
|
|
|
|
/* Specify the number of nodes for each face, and the right and
|
|
* left neighboring elements. The neighboring elements can be
|
|
* determined using the right-hand rule. For each face, curl
|
|
* the fingers of your right hand in the direction of
|
|
* incrementing node numbers (i.e. from Node 1 to Node 2 and
|
|
* so on). Your thumb will point toward the right element.
|
|
* A value of zero indicates that there is no
|
|
* neighboring element on that side. A negative value
|
|
* indicates that the neighboring element is in another zone.
|
|
* In that case, the number is a pointer into the
|
|
* FaceBndryConnectionElems and FaceBndryConnectionZones arrays.
|
|
*/
|
|
|
|
/* DOCSTART:gridsolution_grid_tecpoly.txt*/
|
|
INTEGER4 *FaceNodeCounts = new INTEGER4[NumFaces];
|
|
INTEGER4 *FaceLeftElems = new INTEGER4[NumFaces];
|
|
INTEGER4 *FaceRightElems = new INTEGER4[NumFaces];
|
|
|
|
/* For this particular zone, each face has the 5 nodes. */
|
|
for(int J = 0; J < NumFaces; J++)
|
|
FaceNodeCounts[J] = 5;
|
|
|
|
/* Set the right and left elements for each face. */
|
|
FaceRightElems[0] = 1;
|
|
FaceRightElems[1] = 1;
|
|
FaceRightElems[2] = 0;
|
|
FaceRightElems[3] = 0;
|
|
FaceRightElems[4] = 0;
|
|
FaceRightElems[5] = 1;
|
|
FaceRightElems[6] = 1;
|
|
FaceRightElems[7] = 0;
|
|
FaceRightElems[8] = 0;
|
|
FaceRightElems[9] = 1;
|
|
FaceRightElems[10] = 1;
|
|
FaceRightElems[11] = 0;
|
|
|
|
FaceLeftElems[0] = 0;
|
|
FaceLeftElems[1] = 0;
|
|
FaceLeftElems[2] = 1;
|
|
FaceLeftElems[3] = 1;
|
|
FaceLeftElems[4] = 1;
|
|
FaceLeftElems[5] = 0;
|
|
FaceLeftElems[6] = 0;
|
|
FaceLeftElems[7] = 1;
|
|
FaceLeftElems[8] = 1;
|
|
FaceLeftElems[9] = 0;
|
|
FaceLeftElems[10] = 0;
|
|
FaceLeftElems[11] = 1;
|
|
|
|
I = TECPOLYFACE112(&NumFaces,
|
|
FaceNodeCounts,
|
|
FaceNodes,
|
|
FaceLeftElems,
|
|
FaceRightElems);
|
|
|
|
delete FaceNodes;
|
|
delete FaceLeftElems;
|
|
delete FaceRightElems;
|
|
/* DOCEND */
|
|
|
|
/* DOCSTART:gridsolution_grid_tecend.txt*/
|
|
I = TECEND112();
|
|
/* DOCEND */
|
|
|
|
/* DOCSTART:gridsolution_solution_tecini.txt*/
|
|
for(int J = 0; J < 5; J++)
|
|
{
|
|
char SolutionFileName[128];
|
|
sprintf(SolutionFileName, "solution%d.plt", J);
|
|
|
|
/* DOCSTART:gridsolution_solution_tecini.txt*/
|
|
FileType = 2; /* 1 = solution file. */
|
|
|
|
I = TECINI112((char*)"Example: Separate grid and solution files",
|
|
(char*)"P T", /* Defines the variables for the solution file.
|
|
* Note that these are different variables from
|
|
* the grid file.
|
|
*/
|
|
SolutionFileName,
|
|
(char*)".", /* scratch directory */
|
|
&FileType,
|
|
&Debug,
|
|
&VIsDouble);
|
|
/* DOCEND */
|
|
|
|
/* DOCSTART:gridsolution_solution_teczne.txt*/
|
|
/* TECZNE Parameters are mostly unchanged from creation of the grid file. */
|
|
TotalNumFaceNodes = 0;
|
|
SolutionTime = J;
|
|
|
|
char ZoneName[128];
|
|
sprintf(ZoneName, "Dodecahedron Time=%g", SolutionTime);
|
|
I = TECZNE112(ZoneName,
|
|
&ZoneType,
|
|
&NumPts,
|
|
&NumElems,
|
|
&NumFaces,
|
|
&ICellMax,
|
|
&JCellMax,
|
|
&KCellMax,
|
|
&SolutionTime,
|
|
&StrandID,
|
|
&ParentZone,
|
|
&IsBlock,
|
|
&NumFaceConnections,
|
|
&FaceNeighborMode,
|
|
&TotalNumFaceNodes,
|
|
&TotalNumBndryFaces,
|
|
&TotalNumBndryConns,
|
|
NULL,
|
|
NULL, /* All nodal variables */
|
|
NULL,
|
|
&SharConn);
|
|
/* DOCEND */
|
|
|
|
/* DOCSTART:gridsolution_solution_tecdat.txt*/
|
|
/* TECDAT Parameters */
|
|
double *P = new double[NumPts];
|
|
double *T = new double[NumPts];
|
|
|
|
for(int K = 0; K < NumPts; K++)
|
|
{
|
|
P[K] = (double)(K + J);
|
|
T[K] = 1.0 + K + K;
|
|
}
|
|
|
|
I = TECDAT112(&NumPts, P, &IsDouble);
|
|
I = TECDAT112(&NumPts, T, &IsDouble);
|
|
|
|
delete P;
|
|
delete T;
|
|
/* DOCEND */
|
|
|
|
/* DOCSTART:gridsolution_solution_tecend.txt*/
|
|
I = TECEND112();
|
|
/* DOCEND */
|
|
}
|
|
|
|
return 0;
|
|
}
|