405 lines
16 KiB
C
405 lines
16 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/
|
||
|
*
|
||
|
*/
|
||
|
#if defined EXTERN
|
||
|
#undef EXTERN
|
||
|
#endif
|
||
|
#if defined DATASET0MODULE
|
||
|
#define EXTERN
|
||
|
#else
|
||
|
#define EXTERN extern
|
||
|
#endif
|
||
|
|
||
|
/*
|
||
|
******************************************************************
|
||
|
******************************************************************
|
||
|
******* ********
|
||
|
****** (C) 1988-2008 Tecplot, Inc. *******
|
||
|
******* ********
|
||
|
******************************************************************
|
||
|
******************************************************************
|
||
|
*/
|
||
|
|
||
|
namespace tecplot
|
||
|
{
|
||
|
namespace io
|
||
|
{
|
||
|
class File;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
EXTERN void OutOfMemoryMsg(void);
|
||
|
|
||
|
/*
|
||
|
* Turn on DEBUG_FIELDVALUES by default in any build with assertions on
|
||
|
* (including checked builds), but allow turning this off with
|
||
|
* NO_DEBUG_FIELDVALUES
|
||
|
*/
|
||
|
#if !defined NO_ASSERTS && !defined NO_DEBUG_FIELDVALUES && !defined DEBUG_FIELDVALUES
|
||
|
#define DEBUG_FIELDVALUES
|
||
|
#endif
|
||
|
|
||
|
/* FieldData_a is intentionally not defined to further
|
||
|
* deter usage of this private structure */
|
||
|
struct _FieldData_a
|
||
|
{
|
||
|
void *Data; /* ...placed first in the structure for fastest access */
|
||
|
# if defined TECPLOTKERNEL
|
||
|
/* CORE SOURCE CODE REMOVED */
|
||
|
# else
|
||
|
void *GetValueCallback[1]; /* ...this field is for TecIO only */
|
||
|
void *SetValueCallback[1]; /* ...this field is for TecIO only */
|
||
|
# endif
|
||
|
|
||
|
/* PRIVATE */
|
||
|
FieldDataType_e Type;
|
||
|
ValueLocation_e ValueLocation;
|
||
|
LgIndex_t RefCount;
|
||
|
LgIndex_t VarShareRefCount;
|
||
|
LgIndex_t NumValues;
|
||
|
# if defined TECPLOTKERNEL /* TecIO doesn't require these features yet. */
|
||
|
/* CORE SOURCE CODE REMOVED */
|
||
|
# endif
|
||
|
};
|
||
|
|
||
|
|
||
|
/* *
|
||
|
* * NOTE: "FieldData_pa" here is an "abstract type".
|
||
|
* * Any routines dealing with the internals workings
|
||
|
* * of FieldData_pa must be in the same file as these
|
||
|
* * routines
|
||
|
* */
|
||
|
|
||
|
#if defined USE_MACROS_FOR_FUNCTIONS
|
||
|
#define USE_MACROS_FOR_FIELD_DATA_FUNCTIONS
|
||
|
#endif
|
||
|
|
||
|
/*
|
||
|
* These are low-level (private) FD manipulation functions. In
|
||
|
* most cases, you should use some higher-level function. These
|
||
|
* macros are supplied for the dataset functions to use.
|
||
|
*/
|
||
|
#if defined USE_MACROS_FOR_FIELD_DATA_FUNCTIONS
|
||
|
#define GetFieldDataType GetFieldDataType_MACRO
|
||
|
#define GetFieldDataGetFunction GetFieldDataGetFunction_MACRO
|
||
|
#define GetFieldDataSetFunction GetFieldDataSetFunction_MACRO
|
||
|
#define GetFieldDataNumValues GetFieldDataNumValues_MACRO
|
||
|
#define GetFieldDataValueLocation GetFieldDataValueLocation_MACRO
|
||
|
#define IsFieldDataDirectAccessAllowed IsFieldDataDirectAccessAllowed_MACRO
|
||
|
#else
|
||
|
#define GetFieldDataType GetFieldDataType_FUNC
|
||
|
#define GetFieldDataGetFunction GetFieldDataGetFunction_FUNC
|
||
|
#define GetFieldDataSetFunction GetFieldDataSetFunction_FUNC
|
||
|
#define GetFieldDataNumValues GetFieldDataNumValues_FUNC
|
||
|
#define GetFieldDataValueLocation GetFieldDataValueLocation_FUNC
|
||
|
#define IsFieldDataDirectAccessAllowed IsFieldDataDirectAccessAllowed_FUNC
|
||
|
#endif
|
||
|
|
||
|
#define GetFieldDataType_MACRO(FieldData) ((FieldData)->Type)
|
||
|
#if defined TECPLOTKERNEL
|
||
|
/* CORE SOURCE CODE REMOVED */
|
||
|
#else /* ...for TecIO only */
|
||
|
#define GetFieldDataGetFunction_MACRO(FieldData) ((FieldValueGetFunction_pf)(FieldData)->GetValueCallback[0])
|
||
|
#define GetFieldDataSetFunction_MACRO(FieldData) ((FieldValueSetFunction_pf)(FieldData)->SetValueCallback[0])
|
||
|
#endif
|
||
|
#define GetFieldDataNumValues_MACRO(FieldData) ((FieldData)->NumValues)
|
||
|
#define GetFieldDataValueLocation_MACRO(FieldData) ((FieldData)->ValueLocation)
|
||
|
|
||
|
EXTERN double STDCALL GetFieldValueForFloat(const FieldData_pa fd, LgIndex_t pt);
|
||
|
EXTERN double STDCALL GetFieldValueForDouble(const FieldData_pa fd, LgIndex_t pt);
|
||
|
EXTERN double STDCALL GetFieldValueForInt32(const FieldData_pa fd, LgIndex_t pt);
|
||
|
EXTERN double STDCALL GetFieldValueForInt16(const FieldData_pa fd, LgIndex_t pt);
|
||
|
EXTERN double STDCALL GetFieldValueForByte(const FieldData_pa fd, LgIndex_t pt);
|
||
|
EXTERN double STDCALL GetFieldValueForBit(const FieldData_pa fd, LgIndex_t pt);
|
||
|
|
||
|
#if defined TECPLOTKERNEL
|
||
|
/* CORE SOURCE CODE REMOVED */
|
||
|
#else
|
||
|
#define IsFieldDataDirectAccessAllowed_MACRO(FieldData) ((FieldData)->Data != NULL)
|
||
|
#endif
|
||
|
|
||
|
#if !defined USE_MACROS_FOR_FIELD_DATA_FUNCTIONS
|
||
|
EXTERN FieldDataType_e GetFieldDataType_FUNC(FieldData_pa FieldData);
|
||
|
EXTERN FieldValueGetFunction_pf GetFieldDataGetFunction_FUNC(FieldData_pa FieldData);
|
||
|
EXTERN FieldValueSetFunction_pf GetFieldDataSetFunction_FUNC(FieldData_pa FieldData);
|
||
|
EXTERN LgIndex_t GetFieldDataNumValues_FUNC(FieldData_pa FieldData);
|
||
|
EXTERN ValueLocation_e GetFieldDataValueLocation_FUNC(FieldData_pa FieldData);
|
||
|
EXTERN Boolean_t IsFieldDataDirectAccessAllowed_FUNC(FieldData_pa FieldData);
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Use separate types for reversed byte data than unreversed data so we
|
||
|
* have better compiler checking.
|
||
|
*/
|
||
|
typedef UInt32_t FloatRev_t;
|
||
|
typedef UInt64_t DoubleRev_t;
|
||
|
typedef UInt16_t Int16Rev_t;
|
||
|
typedef UInt32_t Int32Rev_t;
|
||
|
typedef UInt64_t Int64Rev_t;
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Note: there are so many GetFieldData*Ptr functions because we
|
||
|
* want a bunch of error checking. The Type and TypeRev check
|
||
|
* for that type. The Byte, 2Byte, etc. just make sure it is
|
||
|
* that type.
|
||
|
* GetFieldDataVoidPtr checks nothing, and thus should only be
|
||
|
* used with extreme caution (that is, checking the alignment
|
||
|
* and byte order by hand).
|
||
|
*/
|
||
|
#if defined USE_MACROS_FOR_FIELD_DATA_FUNCTIONS
|
||
|
#define GetFieldDataFloatPtr GetFieldDataFloatPtr_MACRO
|
||
|
#define GetFieldDataFloatRevPtr GetFieldDataFloatRevPtr_MACRO
|
||
|
#define GetFieldDataDoublePtr GetFieldDataDoublePtr_MACRO
|
||
|
#define GetFieldDataDoubleRevPtr GetFieldDataDoubleRevPtr_MACRO
|
||
|
#define GetFieldDataInt64Ptr GetFieldDataInt64Ptr_MACRO
|
||
|
#define GetFieldDataInt64RevPtr GetFieldDataInt64RevPtr_MACRO
|
||
|
#define GetFieldDataInt32Ptr GetFieldDataInt32Ptr_MACRO
|
||
|
#define GetFieldDataInt32RevPtr GetFieldDataInt32RevPtr_MACRO
|
||
|
#define GetFieldDataInt16Ptr GetFieldDataInt16Ptr_MACRO
|
||
|
#define GetFieldDataInt16RevPtr GetFieldDataInt16RevPtr_MACRO
|
||
|
#define GetFieldDataBytePtr GetFieldDataBytePtr_MACRO
|
||
|
#define GetFieldData2BytePtr GetFieldData2BytePtr_MACRO
|
||
|
#define GetFieldData4BytePtr GetFieldData4BytePtr_MACRO
|
||
|
#define GetFieldData8BytePtr GetFieldData8BytePtr_MACRO
|
||
|
#define GetFieldDataVoidPtr GetFieldDataVoidPtr_MACRO /*danger:see above*/
|
||
|
#else
|
||
|
#define GetFieldDataFloatPtr GetFieldDataFloatPtr_FUNC
|
||
|
#define GetFieldDataFloatRevPtr GetFieldDataFloatRevPtr_FUNC
|
||
|
#define GetFieldDataDoublePtr GetFieldDataDoublePtr_FUNC
|
||
|
#define GetFieldDataDoubleRevPtr GetFieldDataDoubleRevPtr_FUNC
|
||
|
#define GetFieldDataInt64Ptr GetFieldDataInt64Ptr_FUNC
|
||
|
#define GetFieldDataInt64RevPtr GetFieldDataInt64RevPtr_FUNC
|
||
|
#define GetFieldDataInt32Ptr GetFieldDataInt32Ptr_FUNC
|
||
|
#define GetFieldDataInt32RevPtr GetFieldDataInt32RevPtr_FUNC
|
||
|
#define GetFieldDataInt16Ptr GetFieldDataInt16Ptr_FUNC
|
||
|
#define GetFieldDataInt16RevPtr GetFieldDataInt16RevPtr_FUNC
|
||
|
#define GetFieldDataBytePtr GetFieldDataBytePtr_FUNC
|
||
|
#define GetFieldData2BytePtr GetFieldData2BytePtr_FUNC
|
||
|
#define GetFieldData4BytePtr GetFieldData4BytePtr_FUNC
|
||
|
#define GetFieldData8BytePtr GetFieldData8BytePtr_FUNC
|
||
|
#define GetFieldDataVoidPtr GetFieldDataVoidPtr_FUNC /*danger:see above*/
|
||
|
#endif
|
||
|
|
||
|
#define GetFieldDataFloatPtr_MACRO(FieldData) ((float *)((FieldData)->Data))
|
||
|
#define GetFieldDataFloatRevPtr_MACRO(FieldData) ((FloatRev_t *)((FieldData)->Data))
|
||
|
#define GetFieldDataDoublePtr_MACRO(FieldData) ((double *)((FieldData)->Data))
|
||
|
#define GetFieldDataDoubleRevPtr_MACRO(FieldData) ((DoubleRev_t *)((FieldData)->Data))
|
||
|
#define GetFieldDataInt64Ptr_MACRO(FieldData) ((Int64_t *)((FieldData)->Data))
|
||
|
#define GetFieldDataInt64RevPtr_MACRO(FieldData) ((Int64Rev_t *)((FieldData)->Data))
|
||
|
#define GetFieldDataInt32Ptr_MACRO(FieldData) ((Int32_t *)((FieldData)->Data))
|
||
|
#define GetFieldDataInt32RevPtr_MACRO(FieldData) ((Int32Rev_t *)((FieldData)->Data))
|
||
|
#define GetFieldDataInt16Ptr_MACRO(FieldData) ((Int16_t *)((FieldData)->Data))
|
||
|
#define GetFieldDataInt16RevPtr_MACRO(FieldData) ((Int16Rev_t *)((FieldData)->Data))
|
||
|
#define GetFieldDataBytePtr_MACRO(FieldData) ((Byte_t *)((FieldData)->Data))
|
||
|
#define GetFieldData2BytePtr_MACRO(FieldData) ((UInt16_t *)((FieldData)->Data))
|
||
|
#define GetFieldData4BytePtr_MACRO(FieldData) ((UInt32_t *)((FieldData)->Data))
|
||
|
#define GetFieldData8BytePtr_MACRO(FieldData) ((UInt64_t *)((FieldData)->Data))
|
||
|
#define GetFieldDataVoidPtr_MACRO(FieldData) ((void *)((FieldData)->Data)) /*danger:see above*/
|
||
|
|
||
|
#if !defined USE_MACROS_FOR_FIELD_DATA_FUNCTIONS
|
||
|
EXTERN float *GetFieldDataFloatPtr_FUNC(FieldData_pa fd);
|
||
|
EXTERN FloatRev_t *GetFieldDataFloatRevPtr_FUNC(FieldData_pa fd);
|
||
|
EXTERN double *GetFieldDataDoublePtr_FUNC(FieldData_pa fd);
|
||
|
EXTERN DoubleRev_t *GetFieldDataDoubleRevPtr_FUNC(FieldData_pa fd);
|
||
|
EXTERN Int64_t *GetFieldDataInt64Ptr_FUNC(FieldData_pa fd);
|
||
|
EXTERN Int64Rev_t *GetFieldDataInt64RevPtr_FUNC(FieldData_pa fd);
|
||
|
EXTERN Int32_t *GetFieldDataInt32Ptr_FUNC(FieldData_pa fd);
|
||
|
EXTERN Int32Rev_t *GetFieldDataInt32RevPtr_FUNC(FieldData_pa fd);
|
||
|
EXTERN Int16_t *GetFieldDataInt16Ptr_FUNC(FieldData_pa fd);
|
||
|
EXTERN Int16Rev_t *GetFieldDataInt16RevPtr_FUNC(FieldData_pa fd);
|
||
|
EXTERN Byte_t *GetFieldDataBytePtr_FUNC(FieldData_pa fd);
|
||
|
EXTERN UInt16_t *GetFieldData2BytePtr_FUNC(FieldData_pa fd);
|
||
|
EXTERN UInt32_t *GetFieldData4BytePtr_FUNC(FieldData_pa fd);
|
||
|
EXTERN UInt64_t *GetFieldData8BytePtr_FUNC(FieldData_pa fd);
|
||
|
EXTERN void *GetFieldDataVoidPtr_FUNC(FieldData_pa fd); /*danger:see above*/
|
||
|
#endif
|
||
|
|
||
|
/**
|
||
|
*/
|
||
|
EXTERN FieldData_pa AllocScratchNodalFieldDataPtr(LgIndex_t NumValues,
|
||
|
FieldDataType_e Type,
|
||
|
Boolean_t ShowErrMsg);
|
||
|
|
||
|
/**
|
||
|
*/
|
||
|
EXTERN void DeallocScratchNodalFieldDataPtr(FieldData_pa *ScratchFieldData);
|
||
|
|
||
|
/**
|
||
|
* Assume that indexrange has already been converted to the actual indices.
|
||
|
*/
|
||
|
EXTERN void CalcFieldDataMinMaxUsingRange(FieldData_pa field_data,
|
||
|
double *min_ptr,
|
||
|
double *max_ptr,
|
||
|
LgIndex_t startindex,
|
||
|
IndexRange_s *indexrange);
|
||
|
|
||
|
#if defined TECPLOTKERNEL
|
||
|
/* CORE SOURCE CODE REMOVED */
|
||
|
#endif
|
||
|
|
||
|
#if defined TECPLOTKERNEL
|
||
|
/* CORE SOURCE CODE REMOVED */
|
||
|
#endif
|
||
|
|
||
|
#if defined TECPLOTKERNEL
|
||
|
/* CORE SOURCE CODE REMOVED */
|
||
|
#endif
|
||
|
|
||
|
#if defined TECPLOTKERNEL
|
||
|
/* CORE SOURCE CODE REMOVED */
|
||
|
#endif
|
||
|
|
||
|
/**
|
||
|
*/
|
||
|
EXTERN void CopyTypedValueArray(FieldDataType_e ValueType,
|
||
|
void *DstArray,
|
||
|
LgIndex_t DstStart,
|
||
|
void *SrcArray,
|
||
|
LgIndex_t SrcStart,
|
||
|
LgIndex_t SrcEnd);
|
||
|
|
||
|
EXTERN void SwapBytesInTypedValueArray(FieldDataType_e ValueType,
|
||
|
void *SrcArray,
|
||
|
LgIndex_t SrcStart,
|
||
|
LgIndex_t SrcEnd,
|
||
|
LgIndex_t SrcSkip);
|
||
|
|
||
|
EXTERN void SwapBytesInUnalignedTypedValueArray(FieldDataType_e ValueType,
|
||
|
void *SrcArray,
|
||
|
LgIndex_t SrcStart,
|
||
|
LgIndex_t SrcEnd,
|
||
|
LgIndex_t SrcSkip);
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Copies values from "src" to "dst". "src" or "dst" may
|
||
|
* be differing types. Either or both may be V3D data pointers.
|
||
|
*/
|
||
|
EXTERN void CopyFieldDataRange(FieldData_pa dst,
|
||
|
LgIndex_t dst_start,
|
||
|
FieldData_pa src,
|
||
|
LgIndex_t src_start,
|
||
|
LgIndex_t src_end); /* -1 means last point */
|
||
|
|
||
|
/*
|
||
|
* Copy all values in field data
|
||
|
*/
|
||
|
EXTERN void CopyFieldData(FieldData_pa dst,
|
||
|
FieldData_pa src);
|
||
|
|
||
|
/*
|
||
|
* Like CopyFieldData except for single value.
|
||
|
*/
|
||
|
EXTERN void CopyFieldValue(FieldData_pa dst,
|
||
|
LgIndex_t dstindex,
|
||
|
FieldData_pa src,
|
||
|
LgIndex_t srcindex);
|
||
|
|
||
|
|
||
|
#if defined TECPLOTKERNEL
|
||
|
/* CORE SOURCE CODE REMOVED */
|
||
|
#endif
|
||
|
|
||
|
#if defined TECPLOTKERNEL
|
||
|
/* CORE SOURCE CODE REMOVED */
|
||
|
#endif
|
||
|
|
||
|
#if defined TECPLOTKERNEL
|
||
|
/* CORE SOURCE CODE REMOVED */
|
||
|
#endif
|
||
|
|
||
|
#if defined TECPLOTKERNEL
|
||
|
/* CORE SOURCE CODE REMOVED */
|
||
|
#endif
|
||
|
|
||
|
/*
|
||
|
* Sets all values in the field data pointer "field_data"
|
||
|
* to zero.
|
||
|
*/
|
||
|
EXTERN void SetFieldDataPtrToAllZeros(FieldData_pa field_data);
|
||
|
|
||
|
/*
|
||
|
* GetFieldValue macro
|
||
|
*/
|
||
|
#if !defined GET_FIELD_VALUE_BY_VIRTUAL_FUNCTION && \
|
||
|
!defined GET_FIELD_VALUE_BY_FLOAT_ONLY_MACRO && \
|
||
|
!defined GET_FIELD_VALUE_BY_DOUBLE_ONLY_MACRO && \
|
||
|
!defined GET_FIELD_VALUE_BY_FLOAT_AND_DOUBLE_MACRO
|
||
|
#if !defined NO_ASSERTS || defined DEBUG_FIELDVALUES
|
||
|
#define GET_FIELD_VALUE_BY_VIRTUAL_FUNCTION
|
||
|
#else
|
||
|
#define GET_FIELD_VALUE_BY_FLOAT_AND_DOUBLE_MACRO
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
#if defined GET_FIELD_VALUE_BY_VIRTUAL_FUNCTION
|
||
|
#define GetFieldValue(fd,pt) ((GetFieldDataGetFunction(fd))((fd),(pt)))
|
||
|
#elif defined GET_FIELD_VALUE_BY_FLOAT_ONLY_MACRO
|
||
|
#define GetFieldValue(fd,pt) (GetFieldDataGetFunction(fd)==GetFieldValueForFloat \
|
||
|
?GetFieldDataFloatPtr(fd)[(pt)] \
|
||
|
:(GetFieldDataGetFunction(fd))((fd),(pt)))
|
||
|
#elif defined GET_FIELD_VALUE_BY_DOUBLE_ONLY_MACRO
|
||
|
#define GetFieldValue(fd,pt) (GetFieldDataGetFunction(fd)==GetFieldValueForDouble \
|
||
|
?GetFieldDataDoublePtr(fd)[(pt)] \
|
||
|
:(GetFieldDataGetFunction(fd))((fd),(pt)))
|
||
|
#elif defined GET_FIELD_VALUE_BY_FLOAT_AND_DOUBLE_MACRO
|
||
|
#define GetFieldValue(fd,pt) (GetFieldDataGetFunction(fd)==GetFieldValueForFloat \
|
||
|
?GetFieldDataFloatPtr(fd)[(pt)] \
|
||
|
:GetFieldDataGetFunction(fd)==GetFieldValueForDouble \
|
||
|
?GetFieldDataDoublePtr(fd)[(pt)] \
|
||
|
:(GetFieldDataGetFunction(fd))((fd),(pt)))
|
||
|
#else
|
||
|
#error "Need to define one of FIELD_VALUE_MACRO constants"
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/*
|
||
|
* SetFieldValue macro
|
||
|
*/
|
||
|
#define SetFieldValue(fd,pt,val) ((GetFieldDataSetFunction(fd))((fd),(pt),(val)))
|
||
|
|
||
|
|
||
|
#if defined TECPLOTKERNEL
|
||
|
/* CORE SOURCE CODE REMOVED */
|
||
|
#endif /* TECPLOTKERNEL */
|
||
|
|
||
|
#if defined _DEBUG
|
||
|
#define USEFUNCTIONSFORNODEVALUES
|
||
|
#endif
|
||
|
|
||
|
#if defined TECPLOTKERNEL
|
||
|
/* CORE SOURCE CODE REMOVED */
|
||
|
#if !defined NO_ASSERTS
|
||
|
#endif
|
||
|
#endif /* TECPLOTKERNEL */
|
||
|
|
||
|
#if defined TECPLOTKERNEL
|
||
|
/* CORE SOURCE CODE REMOVED */
|
||
|
#endif /* TECPLOTKERNEL */
|
||
|
|
||
|
#if defined TECPLOTKERNEL
|
||
|
/* CORE SOURCE CODE REMOVED */
|
||
|
#endif
|