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/pltview.cpp
2010-08-25 22:42:57 +01:00

559 lines
20 KiB
C++

/*
* NOTICE and LICENSE for Tecplot Input/Output Library (TecIO) - OpenFOAM
*
* Copyright (C) 1988-2009 Tecplot, Inc. All rights reserved worldwide.
*
* Tecplot hereby grants OpenCFD limited authority to distribute without
* alteration the source code to the Tecplot Input/Output library, known
* as TecIO, as part of its distribution of OpenFOAM and the
* OpenFOAM_to_Tecplot converter. Users of this converter are also hereby
* granted access to the TecIO source code, and may redistribute it for the
* purpose of maintaining the converter. However, no authority is granted
* to alter the TecIO source code in any form or manner.
*
* This limited grant of distribution does not supersede Tecplot, Inc.'s
* copyright in TecIO. Contact Tecplot, Inc. for further information.
*
* Tecplot, Inc.
* 3535 Factoria Blvd, Ste. 550
* Bellevue, WA 98006, USA
* Phone: +1 425 653 1200
* http://www.tecplot.com/
*
*/
/*
*****************************************************************
*****************************************************************
******* ********
****** (C) Copyright 2004-2006 by Tecplot, Inc. ********
****** (C) Copyright 1989-2003 by AMTEC ENGINEERING INC.********
******* All Rights Reserved. ********
******* ********
*****************************************************************
*****************************************************************
*/
/*
****************************************************************
****************** BEGIN DEVELOPMENT NOTES *********************
****************************************************************
BEGIN CODELOG PLTVIEW
V 09/04/98
V ****************************************************************
V * Build 1.0 9-04-98 *
V ****************************************************************
END CODELOG
*********************************************************************
* IMPORTANT NOTE: Only development notes for "pltview" stand-alone *
* belong in this file. See "ADDONVER.h" for changes *
* related to the add-on. *
*********************************************************************
****************************************************************
* V in column 1 marks date information. *
* C in column 1 marks notes on new changes. *
* B in column 1 marks notes on bug fixes. *
****************************************************************
****************************************************************
****************** END DEVELOPMENT NOTES ***********************
****************************************************************
*/
#if defined ADDON
#include "TECADDON.h"
#include "GUIDEFS.h"
#include "GUI.h"
#define READTEC TecUtilReadBinaryData
#define SHOWINFO(S) TecGUITextAppendString(Output_T_D1,S);
#define ERRMSG(S) TecUtilDialogErrMsg(S)
#define ALLOC_ARRAY(N,Type,S) (Type *)TecUtilStringAlloc((N)*sizeof(Type),"debug info")
#define FREE_ARRAY(N,S) TecUtilStringDealloc((char **)&N)
#define STRINGLISTGETSTRING(S,N) TecUtilStringListGetString(S,N)
#define STRINGLISTGETCOUNT(S) TecUtilStringListGetCount(S)
#define STRINGLISTDEALLOC(S) TecUtilStringListDealloc(S)
#else
#include "MASTER.h"
#include "GLOBAL.h"
#include "TASSERT.h"
#define ALLOC_ARRAY(N,Type,S) (Type *)TecAlloc((N)*sizeof(Type))
#define FREE_ARRAY(N,S) TecFree((void *)N)
#include "ARRLIST.h"
#include "STRLIST.h"
#include "DATAUTIL.h"
/*
#include "TECADDON.h"
#include "TECXXX.h"
#include "DATAUTIL.h"
#include "STRLIST.h"
*/
#define READTEC ReadTec
#define SHOWINFO(S) printf("%s",S);
#define ERRMSG(S) printf("Err: %s\n",S);
#define STRINGLISTGETSTRING(S,N) StringListGetString(S,(N)-1)
#define STRINGLISTGETCOUNT(S) StringListCount(S)
#define STRINGLISTDEALLOC(S) StringListDealloc(S)
#define MaxCharsUserRec 500
#endif
static int GetNumPtsPerCell(ZoneType_e ZoneType)
{
int NumPts = 0;
switch (ZoneType)
{
case ZoneType_FETriangle : NumPts = 3; break;
case ZoneType_FEQuad : NumPts = 4; break;
case ZoneType_FETetra : NumPts = 4; break;
case ZoneType_FEBrick : NumPts = 8; break;
default : NumPts = 0;
}
return (NumPts);
}
static int GetNumPts(ZoneType_e ZoneType,
LgIndex_t NumPtsI,
LgIndex_t NumPtsJ,
LgIndex_t NumPtsK)
{
int NumPts = 0;
switch (ZoneType)
{
case ZoneType_FETriangle :
case ZoneType_FEQuad :
case ZoneType_FETetra :
case ZoneType_FEBrick :
case ZoneType_FEPolygon :
case ZoneType_FEPolyhedron: NumPts = NumPtsI; break;
default : NumPts = NumPtsI*NumPtsJ*NumPtsK;
}
return (NumPts);
}
static void DeallocHeaderInfo(char **DataSetTitle,
StringList_pa *VarNames,
StringList_pa *ZoneNames,
LgIndex_t **NumPtsI,
LgIndex_t **NumPtsJ,
LgIndex_t **NumPtsK,
ZoneType_e **ZoneType,
StringList_pa *UserRec)
{
if (*DataSetTitle)
FREE_ARRAY(*DataSetTitle, "data set title");
if (*VarNames)
STRINGLISTDEALLOC(VarNames);
if (*ZoneNames)
STRINGLISTDEALLOC(ZoneNames);
if (*NumPtsI)
FREE_ARRAY(*NumPtsI, "NumPtsI Array");
if (*NumPtsJ)
FREE_ARRAY(*NumPtsJ, "NumPtsJ Array");
if (*NumPtsK)
FREE_ARRAY(*NumPtsK, "NumPtsK Array");
if (*ZoneType)
FREE_ARRAY(*ZoneType, "ZoneType Array");
if (*UserRec)
STRINGLISTDEALLOC(UserRec);
*DataSetTitle = NULL;
*VarNames = NULL;
*ZoneNames = NULL;
*NumPtsI = NULL;
*NumPtsJ = NULL;
*NumPtsK = NULL;
*ZoneType = NULL;
*UserRec = NULL;
}
#define MAXCHARSINFOLINE 5000
void ReportFileInfo(char *FName,
Boolean_t LoadRawData,
Boolean_t AllocateRawDataSpaceLocally)
{
short IVersion;
EntIndex_t NumZones;
EntIndex_t NumVars;
char *DataSetTitle = NULL;
StringList_pa VarNames = NULL;
StringList_pa ZoneNames = NULL;
LgIndex_t *NumPtsI = NULL;
LgIndex_t *NumPtsJ = NULL;
LgIndex_t *NumPtsK = NULL;
ZoneType_e *ZoneType = NULL;
StringList_pa UserRec = NULL;
int CZ, CV;
char InfoLine[MAXCHARSINFOLINE+1];
double **VDataBase = NULL;
NodeMap_t **NodeMap = NULL;
/*
* Load in the header information only.
*/
if (!READTEC(TRUE,
FName,
&IVersion,
&DataSetTitle,
&NumZones,
&NumVars,
&VarNames,
&ZoneNames,
&NumPtsI,
&NumPtsJ,
&NumPtsK,
&ZoneType,
&UserRec,
FALSE,
(NodeMap_t ***)NULL,
(double ***)NULL))
{
sprintf(InfoLine, "Cannot read file \"%s\"\nor file is not a Tecplot binary data file.\n", FName);
ERRMSG(InfoLine);
}
else
{
Boolean_t IsOk = TRUE;
if (LoadRawData)
{
if (AllocateRawDataSpaceLocally)
{
int NumPts;
VDataBase = ALLOC_ARRAY(NumZones * NumVars, double *, "vdatabase array");
for (CZ = 0; CZ < NumZones; CZ++)
for (CV = 0; CV < NumVars; CV++)
{
NumPts = GetNumPts(ZoneType[CZ], NumPtsI[CZ], NumPtsJ[CZ], NumPtsK[CZ]);
if (NumPts >= 1)
VDataBase[CZ*NumVars+CV] = ALLOC_ARRAY(NumPts, double, "vdatabase array");
else
VDataBase[CZ*NumVars+CV] = NULL;
}
NodeMap = ALLOC_ARRAY(NumZones, NodeMap_t *, "nodemap array");
for (CZ = 0; CZ < NumZones; CZ++)
{
if (ZoneType[CZ] == ZoneType_Ordered)
NodeMap[CZ] = NULL;
else
{
int PtsPerCell = GetNumPtsPerCell(ZoneType[CZ]);
NodeMap[CZ] = ALLOC_ARRAY(PtsPerCell * NumPtsJ[CZ],
NodeMap_t, "zone nodemap");
}
}
}
else
{
VDataBase = NULL;
NodeMap = NULL;
}
/*
* NOTE: If any of the above alloc's failed then no big deal. ReadTec
* itself "skips" vars if memory was not allocated for it.
*/
DeallocHeaderInfo(&DataSetTitle,
&VarNames,
&ZoneNames,
&NumPtsI,
&NumPtsJ,
&NumPtsK,
&ZoneType,
&UserRec);
/*
* Reread the datafile. This time load in the header AND the raw data
* Note that VDataBase may be preallocated or may be left up to ReadTec
* to allocate (See AllocateRawDataSpaceLocally above).
*/
if (!READTEC(FALSE,
FName,
&IVersion,
&DataSetTitle,
&NumZones,
&NumVars,
&VarNames,
&ZoneNames,
&NumPtsI,
&NumPtsJ,
&NumPtsK,
&ZoneType,
&UserRec,
AllocateRawDataSpaceLocally,
&NodeMap,
&VDataBase))
{
if (IVersion > 99)
{
sprintf(InfoLine,
"Error: ***\n"
" This add-on can only display raw nodal data\n"
" and it appears to contain cell centered data.\n");
SHOWINFO(InfoLine);
}
else
{
sprintf(InfoLine,
"Cannot Read File, %s.\n"
"File may not be a tecplot binary data file.",
FName);
ERRMSG(InfoLine);
}
IsOk = FALSE;
}
}
SHOWINFO("\n");
sprintf(InfoLine, "FileName : %s\n", FName);
SHOWINFO(InfoLine);
sprintf(InfoLine, "File Version: %3.1f\n", IVersion / 10.0);
SHOWINFO(InfoLine);
/* if the file contains filetype, then retrieve that separately since ReadTec should not be changed */
if (IVersion >= 109)
{
DataFileType_e FileType = DataFileType_Full;
char FileTypeStr[32];
FILE *F = NULL;
/* open the file and get the filetype */
F = fopen(FName, "rb");
if (F)
{
char Buffer[8];
Int32_t One;
Int32_t FileTypeInt;
/* 8 bytes for magic# and version and 4 bytes for Int32 */
fread(Buffer, sizeof(Buffer[0]), 8, F);
fread(&One, sizeof(One), 1, F);
fread(&FileTypeInt, sizeof(FileTypeInt), 1, F);
FileType = (DataFileType_e)FileTypeInt;
fclose(F);
F = NULL;
}
/* map the filetype */
switch (FileType)
{
case DataFileType_Full:
strcpy(FileTypeStr, "Full");
break;
case DataFileType_Grid:
strcpy(FileTypeStr, "Grid");
break;
case DataFileType_Solution:
strcpy(FileTypeStr, "Solution");
break;
default:
IsOk = FALSE;
CHECK(FALSE);
break;
}
sprintf(InfoLine, "File Type : %s\n", FileTypeStr);
SHOWINFO(InfoLine);
}
sprintf(InfoLine, "DataSetTitle: %s\n", DataSetTitle ? DataSetTitle : " ");
SHOWINFO(InfoLine);
sprintf(InfoLine, "NumZones : %d\n", (int)NumZones);
SHOWINFO(InfoLine);
sprintf(InfoLine, "NumVars : %d\n", (int)NumVars);
SHOWINFO(InfoLine);
if (IsOk && (NumZones > 0))
{
SHOWINFO("Var Names : ");
for (CZ = 0; CZ < NumVars; CZ++)
{
char *VarName = STRINGLISTGETSTRING(VarNames, CZ + 1);
sprintf(InfoLine, "%s", VarName ? VarName : "NULL");
if (CZ < NumVars - 1)
strcat(InfoLine, ",");
else
strcat(InfoLine, "\n\n");
SHOWINFO(InfoLine);
if (VarName)
FREE_ARRAY(VarName, "VarName array");
}
SHOWINFO("ZoneName IMax JMax KMax Node Face Elmt EType\n");
SHOWINFO("-------------------------------------------------------------------------------\n");
for (CZ = 0; CZ < NumZones; CZ++)
{
char *ZoneName = STRINGLISTGETSTRING(ZoneNames, CZ + 1);
if (ZoneType[CZ] != ZoneType_Ordered)
{
if (ZoneType[CZ] == ZoneType_FEPolygon ||
ZoneType[CZ] == ZoneType_FEPolyhedron)
sprintf(InfoLine, "%-20s --- --- --- %-8ld %-8ld %-8ld ",
(ZoneName ? ZoneName : "NULL"),
(long)NumPtsI[CZ],
(long)NumPtsK[CZ],
(long)NumPtsJ[CZ]);
else
sprintf(InfoLine, "%-20s --- --- --- %-8ld --- %-8ld ",
(ZoneName ? ZoneName : "NULL"),
(long)NumPtsI[CZ],
(long)NumPtsJ[CZ]);
SHOWINFO(InfoLine);
switch (ZoneType[CZ])
{
case ZoneType_FETriangle : SHOWINFO("Tri\n"); break;
case ZoneType_FEQuad : SHOWINFO("Quad\n"); break;
case ZoneType_FETetra : SHOWINFO("Tetra\n"); break;
case ZoneType_FEBrick : SHOWINFO("Brick\n"); break;
case ZoneType_FELineSeg : SHOWINFO("LineSeg\n"); break;
case ZoneType_FEPolygon : SHOWINFO("Polygon\n"); break;
case ZoneType_FEPolyhedron: SHOWINFO("Polyhed\n"); break;
default: CHECK(FALSE); break;
}
}
else
{
sprintf(InfoLine, "%-20s %-7ld %-7ld %-7ld --- --- --- ---\n",
(ZoneName ? ZoneName : "NULL"),
(long)NumPtsI[CZ],
(long)NumPtsJ[CZ],
(long)NumPtsK[CZ]);
SHOWINFO(InfoLine);
}
if (ZoneName)
FREE_ARRAY(ZoneName, "ZoneName Array");
}
}
if (IsOk)
{
for (CZ = 1; CZ <= STRINGLISTGETCOUNT(UserRec); CZ++)
{
char *S = STRINGLISTGETSTRING(UserRec, CZ);
if (S)
{
int L;
strcpy(InfoLine, "UserRec: ");
L = (int)strlen(InfoLine);
strncat(&InfoLine[L], S, MAXCHARSINFOLINE - L - 2);
strcat(&InfoLine[strlen(InfoLine)], "\n");
SHOWINFO(InfoLine);
FREE_ARRAY(S, "temp string");
}
}
if (LoadRawData)
{
for (CZ = 0; CZ < NumZones; CZ++)
{
int CV;
for (CV = 0; CV < NumVars; CV++)
if (VDataBase[CZ*NumVars+CV])
{
int I;
int NumPts = GetNumPts(ZoneType[CZ], NumPtsI[CZ], NumPtsJ[CZ], NumPtsK[CZ]);
int SLen = 0;
sprintf(InfoLine, "\n\nVariable data for zone %d, Var %d\n", CZ + 1, CV + 1);
SHOWINFO(InfoLine);
InfoLine[0] = '\0';
for (I = 0; I < NumPts; I++)
{
char PString[50];
if (SLen + 50 > MAXCHARSINFOLINE)
{
SHOWINFO(InfoLine);
InfoLine[0] = '\0';
SLen = 0;
}
sprintf(PString, "%lG ", VDataBase[CZ*NumVars+CV][I]);
strcat(InfoLine, PString);
SLen += (int)strlen(PString);
if ((I % 5) == 4)
{
strcat(InfoLine, "\n");
SLen++;
}
}
if (*InfoLine)
SHOWINFO(InfoLine);
FREE_ARRAY(VDataBase[CZ*NumVars+CV], "vdatabase double");
}
if (NodeMap[CZ])
{
int I, J;
int PtsPerCell = GetNumPtsPerCell(ZoneType[CZ]);
int SLen = 0;
SHOWINFO("\nConnectivity list:\n");
InfoLine[0] = '\0';
for (J = 0; J < NumPtsJ[CZ]; J++)
{
if (SLen + 200 > MAXCHARSINFOLINE)
{
SHOWINFO(InfoLine);
InfoLine[0] = '\0';
SLen = 0;
}
for (I = 0; I < PtsPerCell; I++)
{
char NString[20];
sprintf(NString, "%u ", (unsigned int)NodeMap[CZ][J*PtsPerCell+I] + 1);
strcat(InfoLine, NString);
SLen += (int)strlen(NString);
}
strcat(InfoLine, "\n");
SLen++;
}
if (*InfoLine)
SHOWINFO(InfoLine);
FREE_ARRAY(NodeMap[CZ], "nodemap");
}
}
FREE_ARRAY(NodeMap, "Nodemap base array");
FREE_ARRAY(VDataBase, "vdatabase base array");
}
}
SHOWINFO("\n\n");
DeallocHeaderInfo(&DataSetTitle,
&VarNames,
&ZoneNames,
&NumPtsI,
&NumPtsJ,
&NumPtsK,
&ZoneType,
&UserRec);
}
}
#if !defined ADDON
int main(int argc, char *(argv[]))
{
short CurFile;
if (argc == 1)
{
printf("Err: Need: pltview file1 [file2] ...\n");
exit(-1);
}
for (CurFile = 1; CurFile < argc; CurFile++)
ReportFileInfo(argv[CurFile], FALSE, FALSE);
return 0;
}
#endif