Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/ElmerGUI/netgen/libsrc/meshing/hprefinement.hpp
3206 views
1
#ifndef FILE_HPREFINEMENT
2
#define FILE_HPREFINEMENT
3
4
/**************************************************************************/
5
/* File: hprefinement.hh */
6
/* Author: Joachim Schoeberl */
7
/* Date: 27. Oct. 2000 */
8
/**************************************************************************/
9
10
/*
11
HP Refinement
12
*/
13
14
15
16
17
enum HPREF_ELEMENT_TYPE {
18
HP_NONE=0,
19
20
HP_SEGM = 1,
21
HP_SEGM_SINGCORNERL,
22
HP_SEGM_SINGCORNERR,
23
HP_SEGM_SINGCORNERS,
24
25
HP_TRIG = 10,
26
HP_TRIG_SINGCORNER,
27
HP_TRIG_SINGCORNER12,
28
HP_TRIG_SINGCORNER123,
29
HP_TRIG_SINGCORNER123_2D, // not rotational symmetric
30
HP_TRIG_SINGEDGE = 20,
31
HP_TRIG_SINGEDGECORNER1, // E = 100, V = 100
32
HP_TRIG_SINGEDGECORNER2, // E = 100, V = 010
33
HP_TRIG_SINGEDGECORNER12, // E = 100, V = 110
34
HP_TRIG_SINGEDGECORNER3,
35
HP_TRIG_SINGEDGECORNER13,
36
HP_TRIG_SINGEDGECORNER23,
37
HP_TRIG_SINGEDGECORNER123,
38
HP_TRIG_SINGEDGES = 30,
39
HP_TRIG_SINGEDGES2,
40
HP_TRIG_SINGEDGES3,
41
HP_TRIG_SINGEDGES23,
42
HP_TRIG_3SINGEDGES = 40,
43
44
HP_QUAD = 50,
45
HP_QUAD_SINGCORNER,
46
HP_DUMMY_QUAD_SINGCORNER,
47
HP_QUAD_SINGEDGE,
48
HP_QUAD_0E_2VA, // V = 1100
49
HP_QUAD_0E_2VB, // V = 1010
50
HP_QUAD_0E_3V,
51
HP_QUAD_0E_4V,
52
53
// one edge: marked edge is always edge from vertex 1 to vertex 2 (E = 1000)
54
HP_QUAD_1E_1VA, // vertex on beginning of edge: V = 1000
55
HP_QUAD_1E_1VB, // vertex on end of edge: V = 0100
56
HP_QUAD_1E_1VC, // V = 0010
57
HP_QUAD_1E_1VD, // V = 0001
58
59
HP_QUAD_1E_2VA, // V = 1100
60
HP_QUAD_1E_2VB, // V = 1010
61
HP_QUAD_1E_2VC, // V = 1001
62
HP_QUAD_1E_2VD, // V = 0110
63
HP_QUAD_1E_2VE, // V = 0101
64
HP_QUAD_1E_2VF, // V = 0011
65
66
HP_QUAD_1E_3VA, // V = 1110
67
HP_QUAD_1E_3VB, // V = 1101
68
HP_QUAD_1E_3VC, // V = 1011
69
HP_QUAD_1E_3VD, // V = 0111
70
71
HP_QUAD_1E_4V, // V = 1111
72
73
74
HP_QUAD_2E, // E = 1001, V = 1000
75
HP_QUAD_2E_1VA, // E = 1001, V = 1100
76
HP_QUAD_2E_1VB, // E = 1001, V = 1010
77
HP_QUAD_2E_1VC, // E = 1001, V = 1001
78
HP_QUAD_2E_2VA, // E = 1001, V = 1110
79
HP_QUAD_2E_2VB, // E = 1001, V = 1101
80
HP_QUAD_2E_2VC, // E = 1001, V = 1011
81
HP_QUAD_2E_3V, // E = 1001, V = 1111
82
83
HP_QUAD_2EB_0V, // E = 1010, V = 0000
84
HP_QUAD_2EB_1VA, // E = 1010, V = 1000
85
HP_QUAD_2EB_1VB, // E = 1010, V = 0100
86
HP_QUAD_2EB_2VA, // E = 1010, V = 1100
87
HP_QUAD_2EB_2VB, // E = 1010, V = 1010
88
HP_QUAD_2EB_2VC, // E = 1010, V = 1001
89
HP_QUAD_2EB_2VD, // E = 1010, V = 0101
90
HP_QUAD_2EB_3VA, // E = 1010, V = 1110
91
HP_QUAD_2EB_3VB, // E = 1010, V = 1101
92
93
HP_QUAD_2EB_4V,
94
95
96
HP_QUAD_3E, // E = 1101, V = 1100
97
HP_QUAD_3E_3VA, // E = 1101, V = 1110
98
HP_QUAD_3E_3VB, // E = 1101, V = 1101
99
HP_QUAD_3E_4V, // E = 1101, V = 1111
100
101
HP_QUAD_4E,
102
103
104
HP_TET = 100, // no singular vertex/edge
105
HP_TET_0E_1V, // V1
106
HP_TET_0E_2V, // V1,2
107
HP_TET_0E_3V, // V1,2,3
108
HP_TET_0E_4V, // V1,2,3,4
109
HP_TET_1E_0V = 200, // E1-2
110
HP_TET_1E_1VA, // V1
111
HP_TET_1E_1VB, // V3
112
HP_TET_1E_2VA, // V1,2
113
HP_TET_1E_2VB, // V1,3
114
HP_TET_1E_2VC, // V1,4
115
HP_TET_1E_2VD, // V3,4
116
HP_TET_1E_3VA, // V1,2,3
117
HP_TET_1E_3VB, // V1,3,4
118
HP_TET_1E_4V, // V1,2,3,4
119
120
121
// 2 connected edges, additonally marked Vs
122
HP_TET_2EA_0V = 220, // E1-2, E1-3
123
HP_TET_2EA_1VA, // V2
124
HP_TET_2EA_1VB, // V3
125
HP_TET_2EA_1VC, // V4
126
HP_TET_2EA_2VA, // V2,3
127
HP_TET_2EA_2VB, // V2,4
128
HP_TET_2EA_2VC, // V3,4
129
HP_TET_2EA_3V, // V2,3,4
130
131
// 2 opposite edges
132
HP_TET_2EB_0V = 230, // E1-2, E3-4
133
HP_TET_2EB_1V, // V1
134
HP_TET_2EB_2VA, // V1,2
135
HP_TET_2EB_2VB, // V1,3
136
HP_TET_2EB_2VC, // V1,4
137
HP_TET_2EB_3V, // V1,2,3
138
HP_TET_2EB_4V, // V1,2,3,4
139
140
HP_TET_3EA_0V = 400, // E1-2, E1-3, E1-4, 3 edges connected
141
HP_TET_3EA_1V, // V2
142
HP_TET_3EA_2V, // V2,3
143
HP_TET_3EA_3V, // V2,3,4
144
145
HP_TET_3EB_0V = 420, // E1-2, E1-4, E2-3 3 edges chain
146
HP_TET_3EB_1V, //
147
HP_TET_3EB_2V, //
148
HP_TET_3EC_0V = 430, // 3 edges chain, alter
149
HP_TET_3EC_1V, // 3 edges chain, alter
150
HP_TET_3EC_2V, // 3 edges chain, alter
151
152
153
HP_TET_1F_0E_0V = 500, // 1 singular face
154
HP_TET_1F_0E_1VA, // 1 sing vertex in face (V2)
155
HP_TET_1F_0E_1VB, // 1 sing vertex not in face (V1)
156
HP_TET_1F_1EA_0V, // 1 sing edge not in face
157
HP_TET_1F_1EB_0V, // 1 sing edge in face
158
HP_TET_2F_0E_0V = 600, // 2 singular faces
159
160
HP_PRISM = 1000,
161
HP_PRISM_SINGEDGE,
162
HP_PRISM_SINGEDGE_V12,
163
HP_PRISM_SINGEDGE_H1,
164
HP_PRISM_SINGEDGE_H12,
165
166
HP_PRISM_1FA_0E_0V, // 1 singular trig face
167
HP_PRISM_2FA_0E_0V, // 2 singular trig faces
168
HP_PRISM_1FB_0E_0V, // 1 singular quad face 1-2-4-5
169
170
HP_PRISM_1FB_1EA_0V, // 1 singular quad face, edge is 1-2
171
HP_PRISM_1FA_1E_0V,
172
HP_PRISM_2FA_1E_0V,
173
HP_PRISM_1FA_1FB_0E_0V,
174
HP_PRISM_2FA_1FB_0E_0V,
175
HP_PRISM_1FA_1FB_1EA_0V,
176
HP_PRISM_1FA_1FB_1EB_0V,
177
HP_PRISM_2FA_1FB_1EA_0V,
178
HP_PRISM_1FB_1EC_0V,
179
HP_PRISM_1FA_1FB_1EC_0V,
180
HP_PRISM_2FA_1FB_1EC_0V,
181
HP_PRISM_1FB_2EA_0V,
182
HP_PRISM_1FA_1FB_2EA_0V,
183
HP_PRISM_2FA_1FB_2EA_0V,
184
HP_PRISM_1FB_2EB_0V,
185
HP_PRISM_1FA_1FB_2EB_0V,
186
HP_PRISM_1FA_1FB_2EC_0V,
187
HP_PRISM_2FA_1FB_2EB_0V,
188
HP_PRISM_1FB_3E_0V,
189
HP_PRISM_1FA_1FB_3E_0V,
190
HP_PRISM_2FA_1FB_3E_0V,
191
HP_PRISM_2FB_0E_0V,
192
HP_PRISM_1FA_2FB_0E_0V,
193
HP_PRISM_2FA_2FB_0E_0V,
194
HP_PRISM_2FB_1EC_0V,
195
HP_PRISM_1FA_2FB_1EC_0V,
196
HP_PRISM_1FA_2FB_1EB_0V,
197
HP_PRISM_2FA_2FB_1EC_0V,
198
HP_PRISM_2FB_3E_0V,
199
HP_PRISM_1FA_2FB_3E_0V,
200
HP_PRISM_2FA_2FB_3E_0V,
201
HP_PRISM_1FA_2E_0V,
202
HP_PRISM_2FA_2E_0V,
203
HP_PRISM_3E_0V,
204
HP_PRISM_1FA_3E_0V,
205
HP_PRISM_2FA_3E_0V,
206
HP_PRISM_3FB_0V,
207
HP_PRISM_1FA_3FB_0V,
208
HP_PRISM_2FA_3FB_0V,
209
HP_PRISM_3E_4EH,
210
211
212
213
/* HP_PRISM_1FB_1EA_0V, // 1 singular quad face, edge is 1-4
214
HP_PRISM_1FB_1EB_0V, // 1 singular quad face, edge is 2-5
215
HP_PRISM_2F_0E_0V, // 2 singular quad faces
216
*/
217
218
HP_PYRAMID = 2000,
219
HP_PYRAMID_0E_1V,
220
HP_PYRAMID_EDGES,
221
HP_PYRAMID_1FB_0E_1VA, // 1 trig face, top vertex
222
223
HP_HEX = 3000,
224
HP_HEX_0E_1V,
225
HP_HEX_1E_1V,
226
HP_HEX_1E_0V,
227
HP_HEX_3E_0V,
228
HP_HEX_1F_0E_0V,
229
HP_HEX_1FA_1FB_0E_0V,
230
};
231
232
233
234
struct HPRef_Struct {
235
HPREF_ELEMENT_TYPE geom;
236
int (*splitedges)[3];
237
int (*splitfaces)[4];
238
int (*splitelements)[5];
239
HPREF_ELEMENT_TYPE * neweltypes;
240
int (*newels)[8];
241
};
242
243
244
245
246
class HPRefElement
247
{
248
private:
249
void Reset(void);
250
251
public:
252
HPRefElement ();
253
HPRefElement(Element & el);
254
HPRefElement(Element2d & el);
255
HPRefElement(Segment & el);
256
HPRefElement(HPRefElement & el);
257
258
void SetType( HPREF_ELEMENT_TYPE t);
259
// HPRefElement(HPRefElement & el, HPREF_ELEMENT_TYPE t);
260
261
/* HPRefElement(HPRefElement & el, HPREF_ELEMENT_TYPE t)
262
{
263
type = t;
264
HPRef_Struct * hprs = Get_HPRef_Struct(t);
265
for (int i=0; i<np ; i++)
266
{
267
pnums[i] = el[i];
268
for(int l=0; l<np; l++) param[i][l] = el.param[i][l];
269
}
270
switch(hprs->geom)
271
{
272
case HP_SEGM: np=2; sing_edge_left=0; sing_edge_right=0; break;
273
case HP_QUAD: np=4; break;
274
case HP_TRIG: np=3; break;
275
case HP_HEX: np=8; break;
276
case HP_PRISM: np=6; break;
277
case HP_TET: np=4; break;
278
case HP_PYRAMID: np=5; break;
279
}
280
index = el.index;
281
levelx = el.levelx;
282
levely = el.levely;
283
levelz = el.levelz;
284
type = el.type;
285
coarse_elnr = el.coarse_elnr;
286
singedge_left = el.singedge_left;
287
singedge_right = el.singedge_left;
288
} */
289
290
HPREF_ELEMENT_TYPE type;
291
PointIndex pnums[8];
292
double param[8][3];
293
int index;
294
int levelx;
295
int levely;
296
int levelz;
297
int np;
298
int coarse_elnr;
299
int domin, domout; // he: needed for segment!! in 3d there should be surf1, surf2!!
300
// int coarse_hpelnr;
301
PointIndex & operator[](int i) { return(pnums[i]);}
302
PointIndex & PNumMod(int i) { return pnums[(i-1) % np]; };
303
PointIndex & PNum(int i) {return pnums[(i-1)]; };
304
int GetIndex () const { return index; };
305
double singedge_left, singedge_right;
306
307
308
// EdgePointGeomInfo epgeominfo[2];
309
310
};
311
312
313
314
extern void HPRefinement (Mesh & mesh, Refinement * ref, int levels,
315
double fac1=0.125, bool setorders=true, bool ref_level = false);
316
317
318
#endif
319
320
321