00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef INC_FINLEY_REFERENCEELEMENTS
00022 #define INC_FINLEY_REFERENCEELEMENTS
00023
00024
00025
00026
00027 #include "Finley.h"
00028 #include "ShapeFunctions.h"
00029 #include "Quadrature.h"
00030
00031
00032
00033
00034
00035 #define MAX_numNodes 64
00036 #define MAX_numSubElements 8
00037 #define MAX_numSides 2
00038
00039 typedef enum {
00040 Finley_Point1,
00041 Finley_Line2,
00042 Finley_Line3,
00043 Finley_Line4,
00044 Finley_Tri3,
00045 Finley_Tri6,
00046 Finley_Tri9,
00047 Finley_Tri10,
00048 Finley_Rec4,
00049 Finley_Rec8,
00050 Finley_Rec9,
00051 Finley_Rec12,
00052 Finley_Rec16,
00053 Finley_Tet4,
00054 Finley_Tet10,
00055 Finley_Tet16,
00056 Finley_Hex8,
00057 Finley_Hex20,
00058 Finley_Hex27,
00059 Finley_Hex32,
00060 Finley_Line2Face,
00061 Finley_Line3Face,
00062 Finley_Line4Face,
00063 Finley_Tri3Face,
00064 Finley_Tri6Face,
00065 Finley_Tri9Face,
00066 Finley_Tri10Face,
00067 Finley_Rec4Face,
00068 Finley_Rec8Face,
00069 Finley_Rec9Face,
00070 Finley_Rec12Face,
00071 Finley_Rec16Face,
00072 Finley_Tet4Face,
00073 Finley_Tet10Face,
00074 Finley_Tet16Face,
00075 Finley_Hex8Face,
00076 Finley_Hex20Face,
00077 Finley_Hex27Face,
00078 Finley_Hex32Face,
00079 Finley_Point1_Contact,
00080 Finley_Line2_Contact,
00081 Finley_Line3_Contact,
00082 Finley_Line4_Contact,
00083 Finley_Tri3_Contact,
00084 Finley_Tri6_Contact,
00085 Finley_Tri9_Contact,
00086 Finley_Tri10_Contact,
00087 Finley_Rec4_Contact,
00088 Finley_Rec8_Contact,
00089 Finley_Rec9_Contact,
00090 Finley_Rec12_Contact,
00091 Finley_Rec16_Contact,
00092 Finley_Line2Face_Contact,
00093 Finley_Line3Face_Contact,
00094 Finley_Line4Face_Contact,
00095 Finley_Tri3Face_Contact,
00096 Finley_Tri6Face_Contact,
00097 Finley_Tri9Face_Contact,
00098 Finley_Tri10Face_Contact,
00099 Finley_Rec4Face_Contact,
00100 Finley_Rec8Face_Contact,
00101 Finley_Rec9Face_Contact,
00102 Finley_Rec12Face_Contact,
00103 Finley_Rec16Face_Contact,
00104 Finley_Tet4Face_Contact,
00105 Finley_Tet10Face_Contact,
00106 Finley_Tet16Face_Contact,
00107 Finley_Hex8Face_Contact,
00108 Finley_Hex20Face_Contact,
00109 Finley_Hex27Face_Contact,
00110 Finley_Hex32Face_Contact,
00111 Finley_Line3Macro,
00112 Finley_Tri6Macro,
00113 Finley_Rec9Macro,
00114 Finley_Tet10Macro,
00115 Finley_Hex27Macro,
00116 Finley_NoRef
00117 } Finley_ElementTypeId;
00118
00119
00120
00121
00122
00123 typedef struct Finley_ReferenceElementInfo {
00124 Finley_ElementTypeId TypeId;
00125 char* Name;
00126 dim_t numNodes;
00127 dim_t numSubElements;
00128 dim_t numSides;
00129
00130
00131
00132 index_t offsets[MAX_numSides+1];
00133
00134
00135 Finley_ElementTypeId LinearTypeId;
00136
00137 index_t linearNodes[MAX_numNodes*MAX_numSides];
00138
00139 Finley_QuadTypeId Quadrature;
00140 Finley_ShapeFunctionTypeId Parametrization;
00141 Finley_ShapeFunctionTypeId BasisFunctions;
00142
00143 index_t subElementNodes[MAX_numNodes*MAX_numSides*MAX_numSubElements];
00144
00145
00146 dim_t numRelevantGeoNodes;
00147
00148
00149 index_t relevantGeoNodes[MAX_numNodes];
00150
00151
00152 dim_t numNodesOnFace;
00153
00154 index_t faceNodes[MAX_numNodes];
00155 index_t shiftNodes[MAX_numNodes];
00156 index_t reverseNodes[MAX_numNodes];
00157
00158 } Finley_ReferenceElementInfo;
00159
00160
00161
00162
00163
00164
00165 typedef struct Finley_ReferenceElement {
00166 Finley_ReferenceElementInfo* Type;
00167 Finley_ReferenceElementInfo* LinearType;
00168 index_t reference_counter;
00169 dim_t integrationOrder;
00170 dim_t numNodes;
00171 dim_t numLocalDim;
00172 dim_t numLinearNodes;
00173 Finley_ShapeFunction* Parametrization;
00174 Finley_ShapeFunction* BasisFunctions;
00175 Finley_ShapeFunction* LinearBasisFunctions;
00176 double* DBasisFunctionDv;
00177 bool_t DBasisFunctionDvShared;
00178
00179 } Finley_ReferenceElement;
00180
00181
00182
00183
00184
00185 Finley_ReferenceElement* Finley_ReferenceElement_alloc(Finley_ElementTypeId,int);
00186 void Finley_ReferenceElement_dealloc(Finley_ReferenceElement*);
00187 Finley_ElementTypeId Finley_ReferenceElement_getTypeId(char*);
00188 Finley_ReferenceElement* Finley_ReferenceElement_reference(Finley_ReferenceElement* in);
00189 Finley_ReferenceElementInfo* Finley_ReferenceElement_getInfo(Finley_ElementTypeId id);
00190
00191
00192 #define Finley_ReferenceElement_getNumNodes(__in__) (__in__)->Type->numNodes
00193
00194 #endif
00195