Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/post/src/elements/elements.h
3203 views
1
/*****************************************************************************
2
*
3
* Elmer, A Finite Element Software for Multiphysical Problems
4
*
5
* Copyright 1st April 1995 - , CSC - IT Center for Science Ltd., Finland
6
*
7
* This program is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU General Public License
9
* as published by the Free Software Foundation; either version 2
10
* of the License, or (at your option) any later version.
11
*
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
16
*
17
* You should have received a copy of the GNU General Public License
18
* along with this program (in file fem/GPL-2); if not, write to the
19
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20
* Boston, MA 02110-1301, USA.
21
*
22
*****************************************************************************/
23
24
/*******************************************************************************
25
*
26
* Element model type definitions etc.
27
*
28
*******************************************************************************
29
*
30
* Author: Juha Ruokolainen
31
*
32
* Address: CSC - IT Center for Science Ltd.
33
* Keilaranta 14, P.O. BOX 405
34
* 02101 Espoo, Finland
35
* Tel. +358 0 457 2723
36
* Telefax: +358 0 457 2302
37
* EMail: [email protected]
38
*
39
* Date: 20 Sep 1995
40
*
41
* Modification history:
42
*
43
* 28 Sep 1995, modified element_defs_t and element_type_t structures to hold
44
* list of element_types instead of an array
45
* Juha R
46
*
47
*******************************************************************************/
48
49
#if !defined(ELEMENTS_H)
50
51
#define ELEMENTS_H
52
53
#define TRUE 1
54
#define FALSE 0
55
56
#ifdef MODULE_ELEMENTS
57
#define ELM_EXT
58
#else
59
#define ELM_EXT extern
60
#endif
61
62
#define AEPS 1.0E-12
63
64
#define ELM_NULL_ELEMENT -1
65
66
#define ELM_MAX_ELEMENT_TYPES 100
67
#define ELM_MAX_ELEMENT_CODE 999
68
69
#define ELM_MAX_ELEMENT_NODES 27 /* TODO: FIX THIS WHEN YOU'VE GOT MORE... */
70
71
#define MAX_GROUP_IDS 8
72
73
typedef struct element_s
74
{
75
struct element_type_s *ElementType;
76
signed char DisplayFlag;
77
int *Topology;
78
signed char GroupIds[MAX_GROUP_IDS];
79
} element_t;
80
81
typedef struct element_model_s
82
{
83
double *NodeArray;
84
element_t *Elements;
85
86
group_t *Groups;
87
88
int NofNodes, NofElements, NofTimesteps;
89
} element_model_t;
90
91
ELM_EXT element_model_t ElementModel;
92
ELM_EXT element_t *Elements;
93
94
typedef struct element_type_s
95
{
96
struct element_type_s *Next;
97
98
char *ElementName; /* One line description of the element */
99
int ElementCode; /* Numeric code for the element */
100
101
double *NodeU; /* node u coordinates */
102
double *NodeV; /* node v coordinates */
103
double *NodeW; /* node w coordinates */
104
105
int NumberOfNodes; /* number of nodes */
106
107
/*
108
* function to give value of a variable (f), given coordinates (u,v,w)
109
*/
110
double (*FunctionValue)( double *f,double u,double v,double w );
111
112
/*
113
* function to give value of first partial derivate in (u) of a variable (f),
114
* given coordinates (u,v,w)
115
*/
116
double (*PartialU)( double *f,double u,double v,double w );
117
118
/*
119
* function to give value of first partial derivate in (v) of a variable (f),
120
* given coordinates (u,v,w)
121
*/
122
double (*PartialV)( double *f,double u,double v,double w );
123
124
/*
125
* function to give value of first partial derivate in (w) of a variable (f),
126
* given coordinates (u,v,w)
127
*/
128
double (*PartialW)( double *f,double u,double v,double w );
129
130
/*
131
* function to give value of second partial derivates of a variable (f),
132
* given coordinates (u,v,w)
133
*/
134
double (*SecondPartials)( double *f,double u,double v,double w,double *Values );
135
136
/*
137
* Trianglulate the element given node coordinates. Return value is 1 for
138
* success, 0 for failure.
139
*/
140
int (*Triangulate)( geometry_t *,element_t *,element_t * );
141
142
/*
143
* Check if a point is inside element boundaries, and return element coordinates
144
* of the point if it is.
145
*/
146
int (*PointInside)
147
(
148
double *nodex, double *nodey, double *nodez,
149
double x, double y, double z, double *u,double *v,double *w
150
);
151
152
/*
153
* Isoline extraction for an element.
154
*/
155
int (*IsoLine)
156
(
157
double K, double *F, double *C, double *nx, double *ny, double *nz, line_t *line
158
);
159
160
/*
161
* Isosurface extraction for element.
162
*/
163
int (*IsoSurface)
164
(
165
double K, double *F, double *C, double *nx, double *ny,double *nz,
166
double *nu,double *nv,double *nw,polygon_t *poly
167
);
168
169
} element_type_t;
170
171
/*
172
* Element type definitions
173
*/
174
typedef struct element_defs_s
175
{
176
element_type_t *ElementTypes;
177
int NumberOfTypes;
178
} element_defs_t;
179
180
ELM_EXT element_defs_t ElementDefs;
181
182
#ifdef MODULE_ELEMENTS
183
184
int ElmBrickFace[6][9] =
185
{
186
{ 0,1,2,3, 8, 9,10,11,20 },
187
{ 4,5,6,7,16,17,18,19,21 },
188
{ 0,1,5,4, 8,13,16,12,22 },
189
{ 3,2,6,7,10,14,18,15,24 },
190
{ 0,3,7,4,11,15,19,12,25 },
191
{ 1,2,6,5, 9,14,17,13,23 }
192
};
193
194
int ElmWedgeFace[5][8] =
195
{
196
{ 0, 1, 4, 3, 6, 13, 9, 12 },
197
{ 0, 2, 5, 3, 8, 14, 11, 12 },
198
{ 1, 2, 5, 4, 7, 14, 10, 13 },
199
{ 0, 1, 2, 6, 7, 8, 0, 0 },
200
{ 3, 4, 5, 9, 10, 11, 0, 0 }
201
};
202
203
int ElmTetraFace[4][7] =
204
{
205
{ 0, 1, 2, 4, 5, 6, 10 },
206
{ 0, 1, 3, 4, 8, 7, 11 },
207
{ 1, 2, 3, 5, 9, 8, 12 },
208
{ 0, 2, 3, 6, 9, 7, 13 }
209
};
210
211
int ElmTetraFaceCubic[4][10] =
212
{
213
{ 0, 1, 2, 4, 5, 6, 7, 8, 9,16 },
214
{ 0, 1, 3, 4, 5,11,14,13,10,17 },
215
{ 1, 2, 3, 6, 7,12,15,14,11,18 },
216
{ 0, 2, 3, 9, 8,12,15,13,10,19 }
217
};
218
219
#else
220
221
extern int ElmBrickFace[6][9];
222
extern int ElmWedgeFace[5][8];
223
extern int ElmTetraFace[4][7];
224
extern int ElmTetraFaceCubic[4][10];
225
226
#endif
227
228
void lu_mtrinv( double *, int );
229
int elm_initialize_element_types();
230
#endif
231
232