This repository has been archived on 2023-11-20. You can view files and clone it, but cannot push or open issues or pull requests.
foam-extend4.1-coherent-io/applications/utilities/postProcessing/dataConversion/foamToTecplot360/tecio/examples/multiplepolygons/multiplepolygons.cpp

568 lines
18 KiB
C++
Raw Normal View History

/* This example illustrates using TecPolyFace and TecPolyBConn to create
* two polygonal zones. The first zone contains six hexagons, and the
* second zone contains a hexagon and an octagon. Refer to the Data
* Format Guide for a picture of the configuration, including node
* and face numbers.
*/
#include "TECIO.h"
#include "MASTER.h" /* for defintion of NULL */
int main()
{
/* DOCSTART:hexagons_tecini.txt*/
INTEGER4 I; /* use to check return values */
INTEGER4 Debug = 1;
INTEGER4 VIsDouble = 0;
INTEGER4 FileType = 0;
I = TECINI112((char*)"Example: Multiple polygonal zones",
(char*)"X Y P", /* 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*)"HexagonsAndOctagon.plt",
(char*)".", /* scratch directory */
&FileType,
&Debug,
&VIsDouble);
/* DOCEND */
/* DOCSTART:hexagons_zone1_teczne.txt*/
/* TECZNE Parameters */
INTEGER4 ZoneType = 6; /* FE Polygon */
INTEGER4 NumPts_Z1 = 13; /* the number of unique
* nodes in the zone.
*/
INTEGER4 NumElems_Z1 = 3;
INTEGER4 NumFaces_Z1 = 15; /* 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 = 0;
INTEGER4 ParentZone = 0;
INTEGER4 IsBlock = 1;
INTEGER4 NumFaceConnections = 0;
INTEGER4 FaceNeighborMode = 1;
INTEGER4 SharConn = 0;
INTEGER4 ValueLocation[3] = { 1, 1, 0 };
/* For a polygonal zone, the total number of face nodes is
* twice the total number of faces. This is because each face
* is composed of exactly two nodes.
*/
INTEGER4 TotalNumFaceNodes_Z1 = 2 * NumFaces_Z1;
/* A boundary face is a face that is neighbored by an element
* or elements in another zone or zone(s). In Zone 1, Face 9,
* Face 10 and Face 12 have a neighbor in Zone 2. Therefore,
* the total number of boundary faces is <EFBFBD>3<EFBFBD>.
*/
INTEGER4 TotalNumBndryFaces_Z1 = 3;
/* Each boundary face has one or more boundary connections. A
* boundary connection is defined as another element in another
* zone. Face 9 has a boundary connection with Element 1 in
* Zone 2. In this example, each boundary face is connected to
* one other element, so the total number of boundary
* connections is equivalent to the total number of boundary
* faces (3).
*/
INTEGER4 TotalNumBndryConns_Z1 = 3;
I = TECZNE112((char*)"Zone 1: 3 Hexagons", /* Specifies the name of
* the entire dataset. When
* the file is loaded into
* Tecplot, the value is
* available via the Data
* Set Info dialog.
*/
&ZoneType,
&NumPts_Z1,
&NumElems_Z1,
&NumFaces_Z1,
&ICellMax,
&JCellMax,
&KCellMax,
&SolutionTime,
&StrandID,
&ParentZone,
&IsBlock,
&NumFaceConnections,
&FaceNeighborMode,
&TotalNumFaceNodes_Z1,
&TotalNumBndryFaces_Z1,
&TotalNumBndryConns_Z1,
NULL,
ValueLocation,
NULL,
&SharConn);
/* DOCEND */
/* DOCSTART:hexagons_zone1_tecdat.txt*/
/* TECDAT Parameters */
double *X_Z1 = new double[NumPts_Z1];
double *Y_Z1 = new double[NumPts_Z1];
X_Z1[0] = 1;
Y_Z1[0] = 6;
X_Z1[1] = 2;
Y_Z1[1] = 6;
X_Z1[2] = 3;
Y_Z1[2] = 5;
X_Z1[3] = 2;
Y_Z1[3] = 4;
X_Z1[4] = 1;
Y_Z1[4] = 4;
X_Z1[5] = 0;
Y_Z1[5] = 5;
X_Z1[6] = 4;
Y_Z1[6] = 5;
X_Z1[7] = 5;
Y_Z1[7] = 4;
X_Z1[8] = 4;
Y_Z1[8] = 3;
X_Z1[9] = 3;
Y_Z1[9] = 3;
X_Z1[10] = 2;
Y_Z1[10] = 2;
X_Z1[11] = 1;
Y_Z1[11] = 2;
X_Z1[12] = 0;
Y_Z1[12] = 3;
double *P_Z1 = new double[NumElems_Z1];
P_Z1[0] = 2;
P_Z1[1] = 4;
P_Z1[2] = 5;
INTEGER4 IsDouble = 1;
I = TECDAT112(&NumPts_Z1, X_Z1, &IsDouble);
I = TECDAT112(&NumPts_Z1, Y_Z1, &IsDouble);
I = TECDAT112(&NumElems_Z1, P_Z1, &IsDouble);
delete X_Z1;
delete Y_Z1;
delete P_Z1;
/* DOCEND */
/* DOCSTART:hexagons_zone1_facenodes.txt*/
/* TecPolyFace Parameters */
/* Create a FaceNodes array, dimensioned by the total number
* of face nodes in the zone.
*/
INTEGER4 *FaceNodes_Z1 = new INTEGER4[TotalNumFaceNodes_Z1];
/* Face Nodes for Element 1 */
FaceNodes_Z1[0] = 1;
FaceNodes_Z1[1] = 2;
FaceNodes_Z1[2] = 2;
FaceNodes_Z1[3] = 3;
FaceNodes_Z1[4] = 3;
FaceNodes_Z1[5] = 4;
FaceNodes_Z1[6] = 4;
FaceNodes_Z1[7] = 5;
FaceNodes_Z1[8] = 5;
FaceNodes_Z1[9] = 6;
FaceNodes_Z1[10] = 6;
FaceNodes_Z1[11] = 1;
/* Face Nodes for Element 2 */
FaceNodes_Z1[12] = 3;
FaceNodes_Z1[13] = 7;
FaceNodes_Z1[14] = 7;
FaceNodes_Z1[15] = 8;
FaceNodes_Z1[16] = 8;
FaceNodes_Z1[17] = 9;
FaceNodes_Z1[18] = 9;
FaceNodes_Z1[19] = 10;
FaceNodes_Z1[20] = 10;
FaceNodes_Z1[21] = 4;
/* Face Nodes for Element 3 */
FaceNodes_Z1[22] = 10;
FaceNodes_Z1[23] = 11;
FaceNodes_Z1[24] = 11;
FaceNodes_Z1[25] = 12;
FaceNodes_Z1[26] = 12;
FaceNodes_Z1[27] = 13;
FaceNodes_Z1[28] = 13;
FaceNodes_Z1[29] = 5;
/* DOCEND */
/* Specify the right and left neighboring elements.
* The neighboring elements can be determined using the
* right-hand rule. For each face, place your right-hand along
* the face with your fingers pointing the direction of
* incrementing node numbers (i.e. from Node 1 to Node 2). The
* right side of your hand will indicate the right element,
* and the left side of your hand will indicate the left
* 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.
* The number is a pointer into the FaceBndryConnectionElems
* and FaceBndryConnectionZones arrays.
*/
/* DOCSTART:hexagons_zone1_neighbors.txt*/
INTEGER4 *FaceLeftElems_Z1 = new INTEGER4[NumFaces_Z1];
INTEGER4 *FaceRightElems_Z1 = new INTEGER4[NumFaces_Z1];
/* Left Face Elems for Element 1 */
FaceLeftElems_Z1[0] = 0;
FaceLeftElems_Z1[1] = 0;
FaceLeftElems_Z1[2] = 2;
FaceLeftElems_Z1[3] = 3;
FaceLeftElems_Z1[4] = 0;
/* Left Face Elems for Element 2 */
FaceLeftElems_Z1[5] = 0;
FaceLeftElems_Z1[6] = 0;
FaceLeftElems_Z1[7] = 0;
FaceLeftElems_Z1[8] = -1;
FaceLeftElems_Z1[9] = -2;
FaceLeftElems_Z1[10] = 3;
/* Left Face Elems for Element 3 */
FaceLeftElems_Z1[11] = -3;
FaceLeftElems_Z1[12] = 0;
FaceLeftElems_Z1[13] = 0;
FaceLeftElems_Z1[14] = 0;
/* Set Right Face Elems. Because of the way we numbered the
* nodes and faces, the right element for every face is the
* element itself.
*/
for (INTEGER4 ii = 0; ii < 6; ii++)
FaceRightElems_Z1[ii] = 1;
for (INTEGER4 ii = 6; ii < 11; ii++)
FaceRightElems_Z1[ii] = 2;
for (INTEGER4 ii = 11; ii <= 14; ii++)
FaceRightElems_Z1[ii] = 3;
I = TECPOLYFACE112(&NumFaces_Z1,
NULL, /* Not used for polygon zones */
FaceNodes_Z1,
FaceLeftElems_Z1,
FaceRightElems_Z1);
delete FaceNodes_Z1;
delete FaceLeftElems_Z1;
delete FaceRightElems_Z1;
/* DOCEND */
/* DOCSTART:hexagons_zone1_tecpoly.txt */
/* TecPolyBConn Parameters */
/* The FaceBndryConnectionCounts array is used to define the
* number of boundary connections for each face that has a
* boundary connection. For example, if a zone has three
* boundary connections in total (NumConnectedBoundaryFaces),
* two of those boundary connections are in one face, and the
* remaining boundary connection is in a second face, the
* FaceBndryConnectionCounts array would be: [2 1].
*
* In this example, the total number of connected boundary
* faces (specified via TECZNE) is equal to three. Each
* boundary face is connected to only one other element,
* so the FaceBoundaryConnectionCounts array is (1, 1, 1).
*/
INTEGER4 FaceBndryConnectionCounts_Z1[3] = {1, 1, 1};
/* The value(s) in the FaceBndryConnectionElems and
* FaceBndryConnectionZones arrays specifies the element number
* and zone number, respectively, that a given boundary
* connection is connected to. In this case, the first
* boundary connection face is connected to Element 1 in Zone 2
* and the remaining connection is to Element 2 in Zone 2.
*/
INTEGER4 FaceBndryConnectionElems_Z1[3] = {1, 2, 2};
INTEGER4 FaceBndryConnectionZones_Z1[3] = {2, 2, 2};
I = TECPOLYBCONN112(&TotalNumBndryFaces_Z1,
FaceBndryConnectionCounts_Z1,
FaceBndryConnectionElems_Z1,
FaceBndryConnectionZones_Z1);
/* DOCEND */
/* Define Zone 2. Zone 2 contains an octagon and a hexagon. */
/* TECZNE Parameters */
/* DOCSTART:hexagons_zone2_teczne.txt*/
INTEGER4 NumPts_Z2 = 12; /* number of unique
* nodes in the zone
*/
INTEGER4 NumElems_Z2 = 2;
INTEGER4 NumFaces_Z2 = 13; /* number of unique
* faces in the zone
*/
INTEGER4 NumFaceConnections_Z2 = 0;
/* In polygonal zones, each face has exactly two nodes */
INTEGER4 TotalNumFaceNodes_Z2 = NumFaces_Z2 * 2;
/* A boundary face is a face that is neighbored by an element or
* elements from another zone or zone(s). In Zone 2, Face 6,
* Face 7 and Face 13 have a neighbor in Zone 1. Therefore, the
* total number of boundary faces is <EFBFBD>3<EFBFBD>.
*/
INTEGER4 TotalNumBndryFaces_Z2 = 3;
/* Each boundary face has one or more boundary connections. In
* this example, each boundary face is connected to one other
* element (i.e. the number of boundary faces and the number of
* boundary connections is one-to-one).
*/
INTEGER4 TotalNumBndryConns_Z2 = 3;
I = TECZNE112((char*)"Zone 2: 1 Hexagon and 1 Octagon",
&ZoneType,
&NumPts_Z2,
&NumElems_Z2,
&NumFaces_Z2,
&ICellMax,
&JCellMax,
&KCellMax,
&SolutionTime,
&StrandID,
&ParentZone,
&IsBlock,
&NumFaceConnections_Z2,
&FaceNeighborMode,
&TotalNumFaceNodes_Z2,
&TotalNumBndryFaces_Z2,
&TotalNumBndryConns_Z2,
NULL,
ValueLocation,
NULL,
&SharConn);
/* DOCEND */
/* TECDAT Parameters */
/* DOCSTART:hexagons_zone2_tecdat.txt*/
double *X_Z2 = new double[NumPts_Z2];
double *Y_Z2 = new double[NumPts_Z2];
X_Z2[0] = 5;
Y_Z2[0] = 4;
X_Z2[1] = 6;
Y_Z2[1] = 4;
X_Z2[2] = 7;
Y_Z2[2] = 3;
X_Z2[3] = 6;
Y_Z2[3] = 2;
X_Z2[4] = 5;
Y_Z2[4] = 2;
X_Z2[5] = 4;
Y_Z2[5] = 3;
X_Z2[6] = 3;
Y_Z2[6] = 3;
X_Z2[7] = 5;
Y_Z2[7] = 1;
X_Z2[8] = 4;
Y_Z2[8] = 0;
X_Z2[9] = 3;
Y_Z2[9] = 0;
X_Z2[10] = 2;
Y_Z2[10] = 1;
X_Z2[11] = 2;
Y_Z2[11] = 2;
/* In the call to TecZne, P was set to a cell centered variable.
* As such, only two values need to be defined.
*/
double *P_Z2 = new double[NumPts_Z2];
P_Z2[0] = 8;
P_Z2[1] = 6;
I = TECDAT112(&NumPts_Z2, X_Z2, &IsDouble);
I = TECDAT112(&NumPts_Z2, Y_Z2, &IsDouble);
I = TECDAT112(&NumElems_Z2, P_Z2, &IsDouble);
delete X_Z2;
delete Y_Z2;
delete P_Z2;
/* DOCEND */
/* TecPolyFace Parameters */
/* DOCSTART:hexagons_zone2_facemap.txt*/
INTEGER4 *FaceNodes_Z2;
FaceNodes_Z2 = new INTEGER4[TotalNumFaceNodes_Z2];
/* Face Nodes for Element 1 */
FaceNodes_Z2[0] = 1;
FaceNodes_Z2[1] = 2;
FaceNodes_Z2[2] = 2;
FaceNodes_Z2[3] = 3;
FaceNodes_Z2[4] = 3;
FaceNodes_Z2[5] = 4;
FaceNodes_Z2[6] = 4;
FaceNodes_Z2[7] = 5;
FaceNodes_Z2[8] = 5;
FaceNodes_Z2[9] = 6;
FaceNodes_Z2[10] = 6;
FaceNodes_Z2[11] = 1;
/* Face Nodes for Element 2 */
FaceNodes_Z2[12] = 7;
FaceNodes_Z2[13] = 6;
FaceNodes_Z2[14] = 5;
FaceNodes_Z2[15] = 8;
FaceNodes_Z2[16] = 8;
FaceNodes_Z2[17] = 9;
FaceNodes_Z2[18] = 9;
FaceNodes_Z2[19] = 10;
FaceNodes_Z2[20] = 10;
FaceNodes_Z2[21] = 11;
FaceNodes_Z2[22] = 11;
FaceNodes_Z2[23] = 12;
FaceNodes_Z2[24] = 12;
FaceNodes_Z2[25] = 7;
/* DOCEND */
/* DOCSTART:hexagons_zone2_tecpolyface.txt*/
/* Specify the right and left neighboring elements.
* The neighboring elements can be determined using the
* right-hand rule. For each face, place your right-hand along
* the face with your fingers pointing the direction of
* incrementing node numbers (i.e. from Node 1 to Node 2). The
* right side of your hand will indicate the right element,
* and the left side of your hand will indicate the left
* 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.
* The number is a pointer into the FaceBndryConnectionElems
* and FaceBndryConnectionZones arrays.
*/
INTEGER4 *FaceLeftElems_Z2 = new INTEGER4[NumFaces_Z2];
INTEGER4 *FaceRightElems_Z2 = new INTEGER4[NumFaces_Z2];
/* Left Face Elems for Element 1 */
FaceLeftElems_Z2[0] = 0;
FaceLeftElems_Z2[1] = 0;
FaceLeftElems_Z2[2] = 0;
FaceLeftElems_Z2[3] = 0;
FaceLeftElems_Z2[4] = 2;
FaceLeftElems_Z2[5] = -1;
/* Left Face Elems for Element 2 */
FaceLeftElems_Z2[6] = -2;
FaceLeftElems_Z2[7] = 0;
FaceLeftElems_Z2[8] = 0;
FaceLeftElems_Z2[9] = 0;
FaceLeftElems_Z2[10] = 0;
FaceLeftElems_Z2[11] = 0;
FaceLeftElems_Z2[12] = -3;
/* Set Right Face Elems. Because of the way we numbered the
* nodes and faces, the right element for every face is the
* element itself. */
for (INTEGER4 ii = 0; ii < 6; ii++)
FaceRightElems_Z2[ii] = 1;
for (INTEGER4 ii = 6; ii < 13; ii++)
FaceRightElems_Z2[ii] = 2;
I = TECPOLYFACE112(&NumFaces_Z2,
NULL,
FaceNodes_Z2,
FaceLeftElems_Z2,
FaceRightElems_Z2);
delete FaceNodes_Z2;
delete FaceLeftElems_Z2;
delete FaceRightElems_Z2;
/* DOCEND */
/* DOCSTART:hexagons_zone2_tecpoly.txt*/
/* The FaceBndryConnectionCounts array is used to define the
* number of boundary connections for each face that has a
* boundary connection. In this example, the total number of
* connected boundary faces (specified via TECZNE) is equal to
* three. Each boundary face is connected to only one other
* element, so the FaceBoundaryConnectionCounts array is
* (1, 1, 1).
*/
INTEGER4 FaceBndryConnectionCounts_Z2[3] = {1, 1, 1};
/* The value(s) in the FaceBndryConnectionElems and
* FaceBndryConnectionZones arrays specifies that element
* number and zone number, respectively, that a given boundary
* connection is connected to. In this case, the first boundary
* connection face is connected to Element 2 in Zone 1 and the
* remaining connections are Element 3 in Zone 1.
*/
INTEGER4 FaceBndryConnectionElems_Z2[3] = {2, 3, 3};
INTEGER4 FaceBndryConnectionZones_Z2[3] = {1, 1, 1};
I = TECPOLYBCONN112(&TotalNumBndryFaces_Z2,
FaceBndryConnectionCounts_Z2,
FaceBndryConnectionElems_Z2,
FaceBndryConnectionZones_Z2);
/* DOCEND */
/* DOCSTART:hexagons_tecend.txt*/
I = TECEND112();
/* DOCEND */
return 0;
}