Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/ElmerGUI/netgen/libsrc/meshing/hprefinement.cpp
3206 views
1
#include <mystdlib.h>
2
#include "meshing.hpp"
3
#include "hprefinement.hpp"
4
5
namespace netgen
6
{
7
8
#include "hpref_segm.hpp"
9
#include "hpref_trig.hpp"
10
#include "hpref_quad.hpp"
11
#include "hpref_tet.hpp"
12
#include "hpref_prism.hpp"
13
#include "hpref_hex.hpp"
14
#include "hpref_pyramid.hpp"
15
#include "classifyhpel.hpp"
16
17
18
void HPRefElement :: Reset(void)
19
{
20
np = 8;
21
for (int i = 0; i < 8; i++)
22
{
23
pnums[i] = -1;
24
param[i][0] = param[i][1] = param[i][2] = 0;
25
domin=-1; domout=-1; // he:
26
}
27
}
28
29
HPRefElement :: HPRefElement ()
30
{
31
Reset();
32
}
33
34
HPRefElement :: HPRefElement(Element & el)
35
{
36
//Reset();
37
np = el.GetNV();
38
for (int i=0; i<np ; i++)
39
pnums[i] = el[i];
40
41
index = el.GetIndex();
42
const Point3d * points =
43
MeshTopology :: GetVertices (el.GetType());
44
for(int i=0;i<np;i++)
45
for(int l=0;l<3;l++)
46
param[i][l] = points[i].X(l+1);
47
type = HP_NONE;
48
domin=-1; domout=-1; // he: needed for segments
49
}
50
51
52
HPRefElement :: HPRefElement(Element2d & el)
53
{
54
//Reset();
55
np = el.GetNV();
56
57
for (int i=0; i<np ; i++)
58
pnums[i] = el[i];
59
60
index = el.GetIndex();
61
const Point3d * points =
62
MeshTopology :: GetVertices (el.GetType());
63
for(int i=0;i<np;i++)
64
for(int l=0;l<3;l++)
65
param[i][l] = points[i].X(l+1);
66
type = HP_NONE;
67
domin=-1; domout=-1; // he: needed for segments
68
}
69
70
HPRefElement :: HPRefElement(Segment & el)
71
{
72
//Reset();
73
np = 2;
74
for (int i=0; i<np ; i++)
75
pnums[i] = el[i];
76
const Point3d * points =
77
MeshTopology :: GetVertices (SEGMENT);
78
for(int i=0;i<np;i++)
79
for(int l=0;l<3;l++)
80
param[i][l] = points[i].X(l+1);
81
82
/*
83
for (int i=0; i<np; i++)
84
{
85
param[i][0] = i;
86
param[i][1] = -1; param[i][2] = -1;
87
}
88
*/
89
90
singedge_left = el.singedge_left;
91
singedge_right = el.singedge_right;
92
type = HP_NONE;
93
// he: needed for orientation!
94
domin = el.domin;
95
domout = el.domout;
96
}
97
98
HPRefElement :: HPRefElement(HPRefElement & el)
99
{
100
//Reset();
101
np = el.np;
102
for (int i=0; i<np ; i++)
103
{
104
pnums[i] = el[i];
105
for(int l=0; l<3; l++) param[i][l] = el.param[i][l];
106
}
107
index = el.index;
108
levelx = el.levelx;
109
levely = el.levely;
110
levelz = el.levelz;
111
type = el.type;
112
coarse_elnr = el.coarse_elnr;
113
singedge_left = el.singedge_left;
114
singedge_right = el.singedge_right;
115
domin = el.domin; // he: needed for segments
116
domout=el.domout;
117
118
}
119
120
void HPRefElement :: SetType( HPREF_ELEMENT_TYPE t)
121
{
122
type = t;
123
switch(type)
124
{
125
case HP_SEGM: np=2; break;
126
case HP_TRIG: np=3; break;
127
case HP_QUAD: np=4; break;
128
case HP_TET: np=4; break;
129
case HP_PRISM: np=6; break;
130
case HP_PYRAMID: np=5; break;
131
case HP_HEX: np=8; break;
132
}
133
for(int k=0;k<8;k++)
134
{
135
pnums[k]=0;
136
for(int l=0;l<3;l++) param[k][l]=0.;
137
}
138
}
139
140
141
HPRef_Struct * Get_HPRef_Struct (HPREF_ELEMENT_TYPE type)
142
{
143
HPRef_Struct * hps = NULL;
144
145
switch (type)
146
{
147
case HP_SEGM:
148
hps = &refsegm; break;
149
case HP_SEGM_SINGCORNERL:
150
hps = &refsegm_scl; break;
151
case HP_SEGM_SINGCORNERR:
152
hps = &refsegm_scr; break;
153
case HP_SEGM_SINGCORNERS:
154
hps = &refsegm_sc2; break;
155
156
case HP_TRIG:
157
hps = &reftrig; break;
158
case HP_TRIG_SINGCORNER:
159
hps = &reftrig_singcorner; break;
160
case HP_TRIG_SINGCORNER12:
161
hps = &reftrig_singcorner12; break;
162
case HP_TRIG_SINGCORNER123:
163
hps = &reftrig_singcorner123; break;
164
case HP_TRIG_SINGCORNER123_2D:
165
hps = &reftrig_singcorner123_2D; break;
166
case HP_TRIG_SINGEDGE:
167
hps = &reftrig_singedge; break;
168
case HP_TRIG_SINGEDGECORNER1:
169
hps = &reftrig_singedgecorner1; break;
170
case HP_TRIG_SINGEDGECORNER2:
171
hps = &reftrig_singedgecorner2; break;
172
case HP_TRIG_SINGEDGECORNER12:
173
hps = &reftrig_singedgecorner12; break;
174
case HP_TRIG_SINGEDGECORNER3:
175
hps = &reftrig_singedgecorner3; break;
176
case HP_TRIG_SINGEDGECORNER13:
177
hps = &reftrig_singedgecorner13; break;
178
case HP_TRIG_SINGEDGECORNER23:
179
hps = &reftrig_singedgecorner23; break;
180
case HP_TRIG_SINGEDGECORNER123:
181
hps = &reftrig_singedgecorner123; break;
182
case HP_TRIG_SINGEDGES:
183
hps = &reftrig_singedges; break;
184
case HP_TRIG_SINGEDGES2:
185
hps = &reftrig_singedges2; break;
186
case HP_TRIG_SINGEDGES3:
187
hps = &reftrig_singedges3; break;
188
case HP_TRIG_SINGEDGES23:
189
hps = &reftrig_singedges23; break;
190
case HP_TRIG_3SINGEDGES:
191
hps = &reftrig_3singedges; break;
192
193
194
case HP_QUAD:
195
hps = &refquad; break;
196
case HP_DUMMY_QUAD_SINGCORNER:
197
hps = &refdummyquad_singcorner; break;
198
case HP_QUAD_SINGCORNER:
199
hps = &refquad_singcorner; break;
200
case HP_QUAD_SINGEDGE:
201
hps = &refquad_singedge; break;
202
203
case HP_QUAD_0E_2VA:
204
hps = &refquad_0e_2va; break;
205
case HP_QUAD_0E_2VB:
206
hps = &refquad_0e_2vb; break;
207
208
case HP_QUAD_0E_3V:
209
hps = &refquad_0e_3v; break;
210
case HP_QUAD_0E_4V:
211
hps = &refquad_0e_4v; break;
212
213
case HP_QUAD_1E_1VA:
214
hps = &refquad_1e_1va; break;
215
case HP_QUAD_1E_1VB:
216
hps = &refquad_1e_1vb; break;
217
case HP_QUAD_1E_1VC:
218
hps = &refquad_1e_1vc; break;
219
case HP_QUAD_1E_1VD:
220
hps = &refquad_1e_1vd; break;
221
222
case HP_QUAD_1E_2VA:
223
hps = &refquad_1e_2va; break;
224
case HP_QUAD_1E_2VB:
225
hps = &refquad_1e_2vb; break;
226
case HP_QUAD_1E_2VC:
227
hps = &refquad_1e_2vc; break;
228
case HP_QUAD_1E_2VD:
229
hps = &refquad_1e_2vd; break;
230
case HP_QUAD_1E_2VE:
231
hps = &refquad_1e_2ve; break;
232
case HP_QUAD_1E_2VF:
233
hps = &refquad_1e_2vf; break;
234
235
case HP_QUAD_1E_3VA:
236
hps = &refquad_1e_3va; break;
237
case HP_QUAD_1E_3VB:
238
hps = &refquad_1e_3vb; break;
239
case HP_QUAD_1E_3VC:
240
hps = &refquad_1e_3vc; break;
241
case HP_QUAD_1E_3VD:
242
hps = &refquad_1e_3vd; break;
243
case HP_QUAD_1E_4V:
244
hps = &refquad_1e_4v; break;
245
246
247
case HP_QUAD_2E:
248
hps = &refquad_2e; break;
249
case HP_QUAD_2E_1VA:
250
hps = &refquad_2e_1va; break;
251
case HP_QUAD_2E_1VB:
252
hps = &refquad_2e_1vb; break;
253
case HP_QUAD_2E_1VC:
254
hps = &refquad_2e_1vc; break;
255
case HP_QUAD_2E_2VA:
256
hps = &refquad_2e_2va; break;
257
case HP_QUAD_2E_2VB:
258
hps = &refquad_2e_2vb; break;
259
case HP_QUAD_2E_2VC:
260
hps = &refquad_2e_2vc; break;
261
case HP_QUAD_2E_3V:
262
hps = &refquad_2e_3v; break;
263
264
case HP_QUAD_2EB_0V:
265
hps = &refquad_2eb_0v; break;
266
267
case HP_QUAD_2EB_1VA:
268
hps = &refquad_2eb_1va; break;
269
case HP_QUAD_2EB_1VB:
270
hps = &refquad_2eb_1vb; break;
271
272
273
case HP_QUAD_2EB_2VA:
274
hps = &refquad_2eb_2va; break;
275
case HP_QUAD_2EB_2VB:
276
hps = &refquad_2eb_2vb; break;
277
case HP_QUAD_2EB_2VC:
278
hps = &refquad_2eb_2vc; break;
279
case HP_QUAD_2EB_2VD:
280
hps = &refquad_2eb_2vd; break;
281
282
case HP_QUAD_2EB_3VA:
283
hps = &refquad_2eb_3va; break;
284
case HP_QUAD_2EB_3VB:
285
hps = &refquad_2eb_3vb; break;
286
287
case HP_QUAD_2EB_4V:
288
hps = &refquad_2eb_4v; break;
289
290
case HP_QUAD_3E:
291
hps = &refquad_3e; break;
292
case HP_QUAD_3E_3VA:
293
hps = &refquad_3e_3va; break;
294
case HP_QUAD_3E_3VB:
295
hps = &refquad_3e_3vb; break;
296
case HP_QUAD_3E_4V:
297
hps = &refquad_3e_4v; break;
298
299
300
case HP_QUAD_4E:
301
hps = &refquad_4e; break;
302
303
304
case HP_TET:
305
hps = &reftet; break;
306
case HP_TET_0E_1V:
307
hps = &reftet_0e_1v; break;
308
case HP_TET_0E_2V:
309
hps = &reftet_0e_2v; break;
310
case HP_TET_0E_3V:
311
hps = &reftet_0e_3v; break;
312
case HP_TET_0E_4V:
313
hps = &reftet_0e_4v; break;
314
315
case HP_TET_1E_0V:
316
hps = &reftet_1e_0v; break;
317
case HP_TET_1E_1VA:
318
hps = &reftet_1e_1va; break;
319
case HP_TET_1E_1VB:
320
hps = &reftet_1e_1vb; break;
321
322
case HP_TET_1E_2VA:
323
hps = &reftet_1e_2va; break;
324
case HP_TET_1E_2VB:
325
hps = &reftet_1e_2vb; break;
326
case HP_TET_1E_2VC:
327
hps = &reftet_1e_2vc; break;
328
case HP_TET_1E_2VD:
329
hps = &reftet_1e_2vd; break;
330
331
case HP_TET_1E_3VA:
332
hps = &reftet_1e_3va; break;
333
case HP_TET_1E_3VB:
334
hps = &reftet_1e_3vb; break;
335
case HP_TET_1E_4V:
336
hps = &reftet_1e_4v; break;
337
338
case HP_TET_2EA_0V:
339
hps = &reftet_2ea_0v; break;
340
case HP_TET_2EA_1VB:
341
hps = &reftet_2ea_1vb; break;
342
case HP_TET_2EA_1VC:
343
hps = &reftet_2ea_1vc; break;
344
case HP_TET_2EA_1VA:
345
hps = &reftet_2ea_1va; break;
346
case HP_TET_2EA_2VA:
347
hps = &reftet_2ea_2va; break;
348
case HP_TET_2EA_2VB:
349
hps = &reftet_2ea_2vb; break;
350
case HP_TET_2EA_2VC:
351
hps = &reftet_2ea_2vc; break;
352
case HP_TET_2EA_3V:
353
hps = &reftet_2ea_3v; break;
354
355
case HP_TET_2EB_0V:
356
hps = &reftet_2eb_0v; break;
357
case HP_TET_2EB_1V:
358
hps = &reftet_2eb_1v; break;
359
case HP_TET_2EB_2VA:
360
hps = &reftet_2eb_2va; break;
361
case HP_TET_2EB_2VB:
362
hps = &reftet_2eb_2vb; break;
363
case HP_TET_2EB_2VC:
364
hps = &reftet_2eb_2vc; break;
365
case HP_TET_2EB_3V:
366
hps = &reftet_2eb_3v; break;
367
case HP_TET_2EB_4V:
368
hps = &reftet_2eb_4v; break;
369
370
371
case HP_TET_3EA_0V:
372
hps = &reftet_3ea_0v; break;
373
case HP_TET_3EA_1V:
374
hps = &reftet_3ea_1v; break;
375
case HP_TET_3EA_2V:
376
hps = &reftet_3ea_2v; break;
377
case HP_TET_3EA_3V:
378
hps = &reftet_3ea_3v; break;
379
380
case HP_TET_3EB_0V:
381
hps = &reftet_3eb_0v; break;
382
case HP_TET_3EB_1V:
383
hps = &reftet_3eb_1v; break;
384
case HP_TET_3EB_2V:
385
hps = &reftet_3eb_2v; break;
386
case HP_TET_3EC_0V:
387
hps = &reftet_3ec_0v; break;
388
case HP_TET_3EC_1V:
389
hps = &reftet_3ec_1v; break;
390
case HP_TET_3EC_2V:
391
hps = &reftet_3ec_2v; break;
392
393
394
case HP_TET_1F_0E_0V:
395
hps = &reftet_1f_0e_0v; break;
396
case HP_TET_1F_0E_1VA:
397
hps = &reftet_1f_0e_1va; break;
398
case HP_TET_1F_0E_1VB:
399
hps = &reftet_1f_0e_1vb; break;
400
case HP_TET_1F_1EA_0V:
401
hps = &reftet_1f_1ea_0v; break;
402
case HP_TET_1F_1EB_0V:
403
hps = &reftet_1f_1eb_0v; break;
404
case HP_TET_2F_0E_0V:
405
hps = &reftet_2f_0e_0v; break;
406
407
408
case HP_PRISM:
409
hps = &refprism; break;
410
case HP_PRISM_SINGEDGE:
411
hps = &refprism_singedge; break;
412
// case HP_PRISM_SINGEDGE_H1:
413
// hps = &refprism_singedge_h1; break;
414
// case HP_PRISM_SINGEDGE_H12:
415
// hps = &refprism_singedge_h12; break;
416
case HP_PRISM_SINGEDGE_V12:
417
hps = &refprism_singedge_v12; break;
418
419
420
case HP_PRISM_1FA_0E_0V:
421
hps = &refprism_1fa_0e_0v; break;
422
case HP_PRISM_2FA_0E_0V:
423
hps = &refprism_2fa_0e_0v; break;
424
case HP_PRISM_1FB_0E_0V:
425
hps = &refprism_1fb_0e_0v; break;
426
case HP_PRISM_1FB_1EA_0V:
427
hps = &refprism_1fb_1ea_0v; break;
428
429
case HP_PRISM_1FA_1E_0V:
430
hps = &refprism_1fa_1e_0v; break;
431
case HP_PRISM_2FA_1E_0V:
432
hps = &refprism_2fa_1e_0v; break;
433
case HP_PRISM_1FA_1FB_0E_0V:
434
hps = &refprism_1fa_1fb_0e_0v; break;
435
case HP_PRISM_2FA_1FB_0E_0V:
436
hps = &refprism_2fa_1fb_0e_0v; break;
437
case HP_PRISM_1FA_1FB_1EA_0V:
438
hps = &refprism_1fa_1fb_1ea_0v; break;
439
case HP_PRISM_1FA_1FB_1EB_0V:
440
hps = &refprism_1fa_1fb_1eb_0v; break;
441
case HP_PRISM_2FA_1FB_1EA_0V:
442
hps = &refprism_2fa_1fb_1ea_0v; break;
443
case HP_PRISM_1FB_1EC_0V:
444
hps = &refprism_1fb_1ec_0v; break;
445
case HP_PRISM_1FA_1FB_1EC_0V:
446
hps = &refprism_1fa_1fb_1ec_0v; break;
447
case HP_PRISM_2FA_1FB_1EC_0V:
448
hps = &refprism_2fa_1fb_1ec_0v; break;
449
case HP_PRISM_1FB_2EA_0V:
450
hps = &refprism_1fb_2ea_0v; break;
451
case HP_PRISM_1FA_1FB_2EA_0V:
452
hps = &refprism_1fa_1fb_2ea_0v; break;
453
case HP_PRISM_2FA_1FB_2EA_0V:
454
hps = &refprism_2fa_1fb_2ea_0v; break;
455
case HP_PRISM_1FB_2EB_0V:
456
hps = &refprism_1fb_2eb_0v; break;
457
case HP_PRISM_1FA_1FB_2EB_0V:
458
hps = &refprism_1fa_1fb_2eb_0v; break;
459
case HP_PRISM_1FA_1FB_2EC_0V:
460
hps = &refprism_1fa_1fb_2ec_0v; break;
461
case HP_PRISM_2FA_1FB_2EB_0V:
462
hps = &refprism_2fa_1fb_2eb_0v; break;
463
case HP_PRISM_1FB_3E_0V:
464
hps = &refprism_1fb_3e_0v; break;
465
case HP_PRISM_1FA_1FB_3E_0V:
466
hps = &refprism_1fa_1fb_3e_0v; break;
467
case HP_PRISM_2FA_1FB_3E_0V:
468
hps = &refprism_2fa_1fb_3e_0v; break;
469
case HP_PRISM_2FB_0E_0V:
470
hps = &refprism_2fb_0e_0v; break;
471
case HP_PRISM_1FA_2FB_0E_0V:
472
hps = &refprism_1fa_2fb_0e_0v; break;
473
case HP_PRISM_2FA_2FB_0E_0V:
474
hps = &refprism_2fa_2fb_0e_0v; break;
475
case HP_PRISM_2FB_1EC_0V:
476
hps = &refprism_2fb_1ec_0v; break;
477
case HP_PRISM_1FA_2FB_1EC_0V:
478
hps = &refprism_1fa_2fb_1ec_0v; break;
479
case HP_PRISM_2FA_2FB_1EC_0V:
480
hps = &refprism_2fa_2fb_1ec_0v; break;
481
case HP_PRISM_1FA_2FB_1EB_0V:
482
hps = &refprism_1fa_2fb_1eb_0v; break;
483
case HP_PRISM_2FB_3E_0V:
484
hps = &refprism_2fb_3e_0v; break;
485
case HP_PRISM_1FA_2FB_3E_0V:
486
hps = &refprism_1fa_2fb_3e_0v; break;
487
case HP_PRISM_2FA_2FB_3E_0V:
488
hps = &refprism_2fa_2fb_3e_0v; break;
489
case HP_PRISM_1FA_2E_0V:
490
hps = &refprism_1fa_2e_0v; break;
491
case HP_PRISM_2FA_2E_0V:
492
hps = &refprism_2fa_2e_0v; break;
493
case HP_PRISM_3E_0V:
494
hps = &refprism_3e_0v; break;
495
case HP_PRISM_1FA_3E_0V:
496
hps = &refprism_1fa_3e_0v; break;
497
case HP_PRISM_2FA_3E_0V:
498
hps = &refprism_2fa_3e_0v; break;
499
case HP_PRISM_3FB_0V:
500
hps = &refprism_3fb_0v; break;
501
case HP_PRISM_1FA_3FB_0V:
502
hps = &refprism_1fa_3fb_0v; break;
503
case HP_PRISM_2FA_3FB_0V:
504
hps = &refprism_2fa_3fb_0v; break;
505
// case HP_PRISM_3E_4EH:
506
// hps = &refprism_3e_4eh; break;
507
508
509
/*case HP_PRISM_1FB_1EB_0V:
510
hps = &refprism_1fb_1eb_0v; break;
511
case HP_PRISM_2F_0E_0V:
512
hps = &refprism_2f_0e_0v; break;
513
*/
514
515
516
case HP_PYRAMID:
517
hps = &refpyramid; break;
518
case HP_PYRAMID_0E_1V:
519
hps = &refpyramid_0e_1v; break;
520
case HP_PYRAMID_EDGES:
521
hps = &refpyramid_edges; break;
522
case HP_PYRAMID_1FB_0E_1VA:
523
hps = &refpyramid_1fb_0e_1va; break;
524
525
526
case HP_HEX:
527
hps = &refhex; break;
528
case HP_HEX_0E_1V:
529
hps = &refhex_0e_1v; break;
530
case HP_HEX_1E_1V:
531
hps = &refhex_1e_1v; break;
532
case HP_HEX_1E_0V:
533
hps = &refhex_1e_0v; break;
534
case HP_HEX_3E_0V:
535
hps = &refhex_3e_0v; break;
536
537
case HP_HEX_1F_0E_0V:
538
hps = &refhex_1f_0e_0v; break;
539
case HP_HEX_1FA_1FB_0E_0V:
540
hps = &refhex_1fa_1fb_0e_0v; break;
541
}
542
543
/*
544
if (type != HP_TET_1E_4V && type != HP_TET_1E_2VD)
545
{
546
if (hps->geom == HP_TET)
547
hps = &reftet;
548
if (hps->geom == HP_TRIG)
549
hps = &reftrig;
550
}
551
*/
552
553
if (!hps)
554
{
555
cout << "Attention hps : hp-refinement not implemented for case " << type << endl;
556
PrintSysError ("hp-refinement not implemented for case ", type);
557
}
558
559
return hps;
560
}
561
562
bool CheckSingularities(Mesh & mesh, INDEX_2_HASHTABLE<int> & edges, INDEX_2_HASHTABLE<int> & edgepoiclt_dom,
563
BitArray & cornerpoint, BitArray & edgepoint, INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int> & face_edges,
564
INDEX_2_HASHTABLE<int> & surf_edges, ARRAY<int, PointIndex::BASE> & facepoint, int & levels, int & act_ref);
565
566
bool ClassifyHPElements (Mesh & mesh, ARRAY<HPRefElement> & elements, int & act_ref, int & levels);
567
568
569
void InitHPElements(Mesh & mesh, ARRAY<HPRefElement> & elements)
570
{
571
for(ElementIndex i=0;i<mesh.GetNE();i++)
572
{
573
HPRefElement hpel(mesh[i]);
574
hpel.coarse_elnr=i;
575
576
switch (mesh[i].GetType())
577
{
578
case PRISM:
579
hpel.type = HP_PRISM;
580
break;
581
case HEX:
582
hpel.type = HP_HEX;
583
break;
584
case TET:
585
hpel.type = HP_TET;
586
break;
587
case PYRAMID:
588
hpel.type = HP_PYRAMID;
589
break;
590
}
591
elements.Append(hpel);
592
}
593
594
for(SurfaceElementIndex i=0;i<mesh.GetNSE();i++)
595
{
596
HPRefElement hpel(mesh.SurfaceElement(i));
597
hpel.coarse_elnr = i;
598
switch(mesh.SurfaceElement(i).GetType())
599
{
600
case TRIG:
601
hpel.type = HP_TRIG;
602
break;
603
case QUAD:
604
hpel.type = HP_QUAD;
605
break;
606
}
607
elements.Append(hpel);
608
}
609
610
for(int i=1;i<=mesh.GetNSeg();i++)
611
{
612
Segment & seg = mesh.LineSegment(i);
613
HPRefElement hpel(seg);
614
hpel.coarse_elnr = i-1;
615
hpel.type = HP_SEGM;
616
hpel.index = seg.edgenr + 10000*seg.si;
617
if(seg.edgenr >= 10000)
618
{
619
throw NgException("assumption that seg.edgenr < 10000 is wrong");
620
}
621
elements.Append(hpel);
622
623
}
624
}
625
626
627
628
/* ******************************* DoRefinement *************************************** */
629
void DoRefinement (Mesh & mesh, ARRAY<HPRefElement> & elements,
630
Refinement * ref, double fac1)
631
{
632
elements.SetAllocSize (5 * elements.Size());
633
INDEX_2_HASHTABLE<int> newpts(elements.Size()+1);
634
INDEX_3_HASHTABLE<int> newfacepts(elements.Size()+1);
635
636
// prepare new points
637
638
fac1 = max(0.001,min(0.33,fac1));
639
cout << " in HP-REFINEMENT with fac1 " << fac1 << endl;
640
*testout << " in HP-REFINEMENT with fac1 " << fac1 << endl;
641
642
643
int oldelsize = elements.Size();
644
645
for (int i = 0; i < oldelsize; i++)
646
{
647
HPRefElement & el = elements[i];
648
HPRef_Struct * hprs = Get_HPRef_Struct (el.type);
649
650
if (!hprs)
651
{
652
cout << "Refinementstruct not defined for element " << el.type << endl;
653
continue;
654
}
655
656
int j = 0;
657
while (hprs->splitedges[j][0])
658
{
659
INDEX_2 i2(el.pnums[hprs->splitedges[j][0]-1],
660
el.pnums[hprs->splitedges[j][1]-1]);
661
if (!newpts.Used (i2))
662
{
663
Point<3> np;
664
for( int l=0;l<3;l++)
665
np(l) = (1-fac1)*mesh.Point(i2.I1())(l)
666
+ fac1 * mesh.Point(i2.I2())(l);
667
668
int npi = mesh.AddPoint (np);
669
newpts.Set (i2, npi);
670
}
671
j++;
672
}
673
674
j = 0;
675
if (hprs->splitfaces)
676
while (hprs->splitfaces[j][0])
677
{
678
INDEX_3 i3(el.pnums[hprs->splitfaces[j][0]-1],
679
el.pnums[hprs->splitfaces[j][1]-1],
680
el.pnums[hprs->splitfaces[j][2]-1]);
681
682
if (i3.I2() > i3.I3()) Swap (i3.I2(), i3.I3());
683
684
if (!newfacepts.Used (i3))
685
{
686
Point<3> np;
687
for( int l=0;l<3;l++)
688
np(l) = (1-2*fac1)*mesh.Point(i3.I1())(l)
689
+ fac1*mesh.Point(i3.I2())(l) + fac1*mesh.Point(i3.I3())(l);
690
int npi = mesh.AddPoint (np);
691
newfacepts.Set (i3, npi);
692
}
693
j++;
694
}
695
}
696
697
for (int i = 0; i < oldelsize; i++)
698
{
699
HPRefElement el = elements[i];
700
HPRef_Struct * hprs = Get_HPRef_Struct (el.type);
701
int newlevel = el.levelx + 1;
702
703
int oldnp(0);
704
switch (hprs->geom)
705
{
706
case HP_SEGM: oldnp = 2; break;
707
case HP_TRIG: oldnp = 3; break;
708
case HP_QUAD: oldnp = 4; break;
709
case HP_TET: oldnp = 4; break;
710
case HP_PYRAMID: oldnp = 5; break;
711
case HP_PRISM: oldnp = 6; break;
712
case HP_HEX: oldnp = 8; break;
713
}
714
715
716
if (el.type == HP_SEGM ||
717
el.type == HP_TRIG ||
718
el.type == HP_QUAD ||
719
el.type == HP_TET ||
720
el.type == HP_PRISM ||
721
el.type == HP_HEX ||
722
el.type == HP_PYRAMID)
723
newlevel = el.levelx;
724
725
if (!hprs) continue;
726
727
int newpnums[64];
728
double newparam[64][3];
729
730
int j;
731
for (j = 0; j < oldnp; j++)
732
{
733
newpnums[j] = el.pnums[j];
734
for (int l = 0; l < 3; l++)
735
newparam[j][l] = el.param[j][l];
736
}
737
738
// split edges, incl. transferring curvature
739
j = 0;
740
while (hprs->splitedges[j][0])
741
{
742
INDEX_2 i2(el.pnums[hprs->splitedges[j][0]-1],
743
el.pnums[hprs->splitedges[j][1]-1]);
744
745
int npi = newpts.Get(i2);
746
newpnums[hprs->splitedges[j][2]-1] = npi;
747
748
for (int l = 0; l < 3; l++)
749
newparam[hprs->splitedges[j][2]-1][l] =
750
(1-fac1) * el.param[hprs->splitedges[j][0]-1][l] +
751
fac1 * el.param[hprs->splitedges[j][1]-1][l];
752
753
j++;
754
}
755
756
// split faces
757
j = 0;
758
if (hprs->splitfaces)
759
while (hprs->splitfaces[j][0])
760
{
761
INDEX_3 i3(el.pnums[hprs->splitfaces[j][0]-1],
762
el.pnums[hprs->splitfaces[j][1]-1],
763
el.pnums[hprs->splitfaces[j][2]-1]);
764
if (i3.I2() > i3.I3())
765
Swap (i3.I2(), i3.I3());
766
int npi = newfacepts.Get(i3);
767
newpnums[hprs->splitfaces[j][3]-1] = npi;
768
769
770
for (int l = 0; l < 3; l++)
771
newparam[hprs->splitfaces[j][3]-1][l] =
772
(1-2*fac1) * el.param[hprs->splitfaces[j][0]-1][l] +
773
fac1 * el.param[hprs->splitfaces[j][1]-1][l] +
774
fac1 * el.param[hprs->splitfaces[j][2]-1][l];
775
j++;
776
}
777
// split elements
778
j = 0;
779
if (hprs->splitelements)
780
while (hprs->splitelements[j][0])
781
{
782
//int pi1 = el.pnums[hprs->splitelements[j][0]-1];
783
Point<3> np;
784
for( int l=0;l<3;l++)
785
np(l) = (1-3*fac1)* mesh.Point(el.pnums[hprs->splitelements[j][0]-1])(l)
786
+ fac1* mesh.Point(el.pnums[hprs->splitelements[j][1]-1])(l)
787
+ fac1* mesh.Point(el.pnums[hprs->splitelements[j][2]-1])(l)
788
+ fac1* mesh.Point(el.pnums[hprs->splitelements[j][3]-1])(l);
789
790
int npi = mesh.AddPoint (np);
791
792
newpnums[hprs->splitelements[j][4]-1] = npi;
793
794
795
for (int l = 0; l < 3; l++)
796
newparam[hprs->splitelements[j][4]-1][l] =
797
(1-3*fac1) * el.param[hprs->splitelements[j][0]-1][l] +
798
fac1 * el.param[hprs->splitelements[j][1]-1][l] +
799
fac1 * el.param[hprs->splitelements[j][2]-1][l] +
800
fac1 * el.param[hprs->splitelements[j][3]-1][l];
801
802
j++;
803
}
804
805
j = 0;
806
807
/*
808
*testout << " newpnums = ";
809
for (int hi = 0; hi < 64; hi++)
810
*testout << newpnums[hi] << " ";
811
*testout << endl;
812
*/
813
814
while (hprs->neweltypes[j])
815
{
816
HPRef_Struct * hprsnew = Get_HPRef_Struct (hprs->neweltypes[j]);
817
HPRefElement newel(el);
818
819
newel.type = hprs->neweltypes[j];
820
821
// newel.index = elements[i].index;
822
// newel.coarse_elnr = elements[i].coarse_elnr;
823
newel.levelx = newel.levely = newel.levelz = newlevel;
824
switch(hprsnew->geom)
825
{
826
case HP_SEGM: newel.np=2; break;
827
case HP_QUAD: newel.np=4; break;
828
case HP_TRIG: newel.np=3; break;
829
case HP_HEX: newel.np=8; break;
830
case HP_PRISM: newel.np=6; break;
831
case HP_TET: newel.np=4; break;
832
case HP_PYRAMID: newel.np=5; break;
833
}
834
835
for (int k = 0; k < newel.np; k++)
836
newel.pnums[k] = newpnums[hprs->newels[j][k]-1];
837
838
/*
839
*testout << " newel pnums " ;
840
for (int k = 0; k < newel.np; k++)
841
*testout << newel.pnums[k] << "\t";
842
*testout << endl;
843
*/
844
845
for (int k = 0; k < newel.np; k++)
846
{
847
for (int l = 0; l < 3; l++)
848
{
849
newel.param[k][l] = newparam[hprs->newels[j][k]-1][l];
850
// *testout << newel.param[k][l] << " \t ";
851
}
852
// *testout << endl;
853
}
854
855
if (j == 0)
856
elements[i] = newel; // overwrite old element
857
else
858
elements.Append (newel);
859
j++;
860
}
861
}
862
}
863
864
865
866
867
868
869
/* ************************** DoRefineDummies ******************************** */
870
871
void DoRefineDummies (Mesh & mesh, ARRAY<HPRefElement> & elements,
872
Refinement * ref)
873
{
874
int oldelsize = elements.Size();
875
876
for (int i = 0; i < oldelsize; i++)
877
{
878
HPRefElement el = elements[i];
879
880
HPRef_Struct * hprs = Get_HPRef_Struct (el.type);
881
if (!hprs) continue;
882
883
if (el.type != HP_DUMMY_QUAD_SINGCORNER &&
884
el.type != HP_PYRAMID_EDGES &&
885
el.type != HP_PYRAMID_0E_1V &&
886
el.type != HP_HEX_0E_1V &&
887
el.type != HP_HEX_1E_1V &&
888
el.type != HP_HEX_1E_0V &&
889
el.type != HP_HEX_3E_0V
890
) continue;
891
892
int newlevel = el.levelx;
893
894
int newpnums[8];
895
int j;
896
for (j = 0; j < 8; j++)
897
newpnums[j] = el.pnums[j];
898
899
double newparam[8][3];
900
for (j = 0; j < 8; j++)
901
for (int k = 0; k < 3; k++)
902
newparam[j][k] = el.param[j][k];
903
904
j = 0;
905
while (hprs->neweltypes[j])
906
{
907
HPRef_Struct * hprsnew = Get_HPRef_Struct (hprs->neweltypes[j]);
908
HPRefElement newel(el);
909
switch(hprsnew->geom)
910
{
911
case HP_SEGM: newel.np=2; break;
912
case HP_QUAD: newel.np=4; break;
913
case HP_TRIG: newel.np=3; break;
914
case HP_HEX: newel.np=8; break;
915
case HP_PRISM: newel.np=6; break;
916
case HP_TET: newel.np=4; break;
917
case HP_PYRAMID: newel.np=5; break;
918
}
919
newel.type = hprs->neweltypes[j];
920
for (int k = 0; k < 8; k++)
921
newel.pnums[k] = newpnums[hprs->newels[j][k]-1];
922
newel.index = el.index;
923
newel.coarse_elnr = el.coarse_elnr;
924
newel.levelx = newel.levely = newel.levelz = newlevel;
925
926
for (int k = 0; k < 8; k++)
927
for (int l = 0; l < 3; l++)
928
newel.param[k][l] = newparam[hprs->newels[j][k]-1][l];
929
930
if (j == 0)
931
elements[i] = newel;
932
else
933
elements.Append (newel);
934
j++;
935
}
936
}
937
}
938
939
940
941
942
943
944
945
void SubdivideDegeneratedHexes (Mesh & mesh, ARRAY<HPRefElement> & elements, double fac1)
946
{
947
int oldne = elements.Size();
948
for (int i = 0; i < oldne; i++)
949
if (Get_HPRef_Struct (elements[i].type)->geom == HP_HEX)
950
{
951
bool common = 0;
952
for (int j = 0; j < 8; j++)
953
for (int k = 0; k < j; k++)
954
if (elements[i].pnums[j] == elements[i].pnums[k])
955
common = 1;
956
if (common)
957
{
958
959
960
cout << " Degenerate Hex found " << endl;
961
*testout << " Degenerate Hex found " << endl;
962
HPRefElement el = elements[i];
963
HPRefElement newel = el;
964
965
Point<3> center(0,0,0);
966
double newparam[3] = { 0, 0, 0 };
967
968
for (int j = 0; j < 8; j++)
969
{
970
971
972
center += 0.125 * Vec<3>(mesh[el.pnums[j]]);
973
// 0.125 originates form 8 points not from fac1;
974
975
for (int l = 0; l < 3; l++)
976
newparam[l] += 0.125 * el.param[j][l];
977
978
}
979
980
int npi = mesh.AddPoint (center);
981
982
const ELEMENT_FACE * faces = MeshTopology::GetFaces (HEX);
983
984
for (int j = 0; j < 6; j++)
985
{
986
ARRAY<int> pts;
987
for (int k = 0; k < 4; k++)
988
{
989
bool same = 0;
990
for (int l = 0; l < pts.Size(); l++)
991
if (el.pnums[pts[l]] == el.pnums[faces[j][k]-1])
992
same = 1;
993
if (!same)
994
pts.Append (faces[j][k]-1);
995
996
}
997
998
999
if (pts.Size() == 3) // TrigFace -> TET
1000
{
1001
1002
for (int k = 0; k < 3; k++)
1003
{
1004
newel.pnums[k] = el.pnums[pts[2-k]];
1005
for (int l = 0; l < 3; l++)
1006
newel.param[k][l] = el.param[pts[2-k]][l];
1007
}
1008
newel.pnums[3] = npi;
1009
for (int l = 0; l < 3; l++)
1010
newel.param[3][l] = newparam[l];
1011
1012
newel.type = HP_TET;
1013
newel.np = 4;
1014
}
1015
else
1016
{
1017
for (int k = 0; k < 4; k++)
1018
{
1019
newel.pnums[k] = el.pnums[pts[3-k]];
1020
for (int l = 0; l < 3; l++)
1021
newel.param[k][l] = el.param[pts[3-k]][l];
1022
}
1023
1024
newel.pnums[4] = npi;
1025
for (int l = 0; l < 3; l++)
1026
newel.param[4][l] = newparam[l];
1027
1028
newel.type = HP_PYRAMID;
1029
newel.np = 5;
1030
}
1031
1032
if (j == 0)
1033
elements[i] = newel;
1034
else
1035
elements.Append (newel);
1036
1037
1038
}
1039
1040
/* const ELEMENT_EDGE * edges = MeshTopology::GetEdges (HEX);
1041
1042
for(int k=0;k<12;k++)
1043
{
1044
int e[2];
1045
for(int l=0;l<2;l++) e[l] = edges[k][l]-1;
1046
if(el.PNum(e[0]+1)!=el.PNum(e[1]+1))
1047
{
1048
newel.SetType(HP_SEGM);
1049
for(int l=0;l<2;l++)
1050
{
1051
newel.pnums[0] = el.PNum(e[l]+1);
1052
newel.pnums[1] = npi;
1053
for(int j=0;j<3;j++)
1054
{
1055
// newel.param[0][j] = el.param[e[l]][j];
1056
// newel.param[1][j] = newparam[j];
1057
}
1058
1059
elements.Append(newel);
1060
}
1061
newel.SetType(HP_TRIG);
1062
newel.pnums[0] = el.PNum(e[0]+1);
1063
newel.pnums[1] = el.PNum(e[1]+1);
1064
newel.pnums[2] = npi;
1065
1066
*testout << "DEGHEX TRIG :: newpnums " << newel.pnums[0] << "\t" << newel.pnums[1] << "\t" << newel.pnums[2] << endl;
1067
cout << "DEGHEX TRIG :: newpnums " << newel.pnums[0] << "\t" << newel.pnums[1] << "\t" << newel.pnums[2] << endl;
1068
for(int j=0;j<3;j++)
1069
{
1070
// newel.param[0][j] = el.param[e[0]][j];
1071
// newel.param[1][j] = el.param[e[1]][j];
1072
// newel.param[2][j] = newparam[j];
1073
}
1074
1075
elements.Append(newel);
1076
}
1077
1078
}*/
1079
}
1080
}
1081
}
1082
1083
1084
void CalcStatistics (ARRAY<HPRefElement> & elements)
1085
{
1086
return;
1087
#ifdef ABC
1088
int i, p;
1089
int nsegm = 0, ntrig = 0, nquad = 0;
1090
int nhex = 0, nprism = 0, npyramid = 0, ntet = 0;
1091
int maxlevel = 0;
1092
1093
for (i = 1; i <= elements.Size(); i++)
1094
{
1095
const HPRefElement & el = elements.Get(i);
1096
maxlevel = max2 (el.level, maxlevel);
1097
switch (Get_HPRef_Struct (el.type)->geom)
1098
{
1099
case HP_SEGM:
1100
1101
{
1102
nsegm++;
1103
break;
1104
}
1105
case HP_TRIG:
1106
{
1107
ntrig ++;
1108
break;
1109
}
1110
case HP_QUAD:
1111
{
1112
nquad++;
1113
break;
1114
}
1115
case HP_TET:
1116
{
1117
ntet++;
1118
break;
1119
}
1120
1121
case HP_PRISM:
1122
{
1123
nprism++;
1124
break;
1125
}
1126
1127
case HP_PYRAMID:
1128
{
1129
npyramid++;
1130
break;
1131
}
1132
1133
case HP_HEX:
1134
{
1135
nhex++;
1136
break;
1137
}
1138
1139
default:
1140
{
1141
cerr << "statistics error, unknown element type" << endl;
1142
}
1143
}
1144
}
1145
1146
cout << "level = " << maxlevel << endl;
1147
cout << "nsegm = " << nsegm << endl;
1148
cout << "ntrig = " << ntrig << ", nquad = " << nquad << endl;
1149
cout << "ntet = " << ntet << ", npyr = " << npyramid
1150
<< ", nprism = " << nprism << ", nhex = " << nhex << endl;
1151
1152
return;
1153
1154
double memcost = 0, cpucost = 0;
1155
for (p = 1; p <= 20; p++)
1156
{
1157
memcost = (ntet + nprism + nhex) * pow (static_cast<double>(p), 6.0);
1158
cpucost = (ntet + nprism + nhex) * pow (static_cast<double>(p), 9.0);
1159
cout << "costs for p = " << p << ": mem = " << memcost << ", cpu = " << cpucost << endl;
1160
}
1161
1162
double memcosttet = 0;
1163
double memcostprism = 0;
1164
double memcosthex = 0;
1165
double memcostsctet = 0;
1166
double memcostscprism = 0;
1167
double memcostschex = 0;
1168
double cpucosttet = 0;
1169
double cpucostprism = 0;
1170
double cpucosthex = 0;
1171
1172
for (i = 1; i <= elements.Size(); i++)
1173
{
1174
const HPRefElement & el = elements.Get(i);
1175
switch (el.type)
1176
{
1177
case HP_TET:
1178
case HP_TET_0E_1V:
1179
case HP_TET_1E_0V:
1180
case HP_TET_1E_1VA:
1181
{
1182
int p1 = maxlevel - el.level + 1;
1183
(*testout) << "p1 = " << p1 << ", P1^6 = " << pow (static_cast<double>(p1), 6.0)
1184
<< " (p1-3)^6 = " << pow ( static_cast<double>(max2(p1-3, 0)), 6.0)
1185
<< " p1^3 = " << pow ( static_cast<double>(p1), 3.0)
1186
<< " (p1-3)^3 = " << pow ( static_cast<double>(p1-3), 3.0)
1187
<< " [p1^3-(p1-3)^3]^2 = " << sqr (pow (static_cast<double>(p1),3.0) - pow ( static_cast<double>(p1-3), 3.0))
1188
<< endl;
1189
1190
p1 /= 2 +1;
1191
memcosttet += pow (static_cast<double>(p1), 6.0);
1192
memcostsctet += pow (static_cast<double>(p1), 6.0) - pow ( static_cast<double>(max2(p1-3, 1)), 6.0);
1193
cpucosttet += pow (static_cast<double>(p1), 9.0);
1194
break;
1195
}
1196
case HP_PRISM:
1197
case HP_PRISM_SINGEDGE:
1198
{
1199
int p1 = maxlevel - el.level + 1;
1200
p1 /= 2 +1;
1201
memcostprism += pow (static_cast<double>(p1), 6.0);
1202
memcostscprism += pow (static_cast<double>(p1), 6.0) - pow ( static_cast<double>(max2(p1-3, 1)), 6.0);
1203
cpucostprism += pow (static_cast<double>(p1), 9.0);
1204
break;
1205
}
1206
case HP_HEX:
1207
{
1208
int p1 = maxlevel - el.level + 1;
1209
int p2 = maxlevel;
1210
p1 /= 2 +1;
1211
p2 /= 2 +1;
1212
memcosthex += pow (static_cast<double>(p1), 4.0) * pow (static_cast<double>(p2), 2.0);
1213
memcostschex += pow (static_cast<double>(p1), 6.0) - pow ( static_cast<double>(max2(p1-2, 0)), 6.0);
1214
cpucosthex += pow (static_cast<double>(p1), 6.0) * pow (static_cast<double>(p2), 3.0);
1215
break;
1216
}
1217
default:
1218
;
1219
}
1220
}
1221
cout << "TET: hp-memcost = " << memcosttet
1222
<< ", scmemcost = " << memcostsctet
1223
<< ", cpucost = " << cpucosttet
1224
<< endl;
1225
cout << "PRI: hp-memcost = " << memcostprism
1226
<< ", scmemcost = " << memcostscprism
1227
<< ", cpucost = " << cpucostprism << endl;
1228
cout << "HEX: hp-memcost = " << memcosthex
1229
<< ", scmemcost = " << memcostschex
1230
<< ", cpucost = " << cpucosthex << endl;
1231
#endif
1232
}
1233
1234
1235
1236
void ReorderPoints (Mesh & mesh, ARRAY<HPRefElement> & hpelements)
1237
{
1238
ARRAY<int, 1> map (mesh.GetNP());
1239
1240
for (int i = 1; i <= mesh.GetNP(); i++)
1241
map[i] = i;
1242
1243
int nwrong(0), nright(0);
1244
for (int k = 0; k < 5; k++)
1245
{
1246
nwrong = nright = 0;
1247
for (int i = 0; i < hpelements.Size(); i++)
1248
{
1249
const HPRefElement & hpel = hpelements[i];
1250
1251
if (Get_HPRef_Struct (hpel.type) -> geom == HP_PRISM)
1252
{
1253
int minbot = 0, mintop = 0;
1254
for (int j = 0; j < 3; j++)
1255
{
1256
if (map[hpel.pnums[j]] < map[hpel.pnums[minbot]]) minbot = j;
1257
if (map[hpel.pnums[j+3]] < map[hpel.pnums[mintop+3]]) mintop = j;
1258
}
1259
if (minbot != mintop)
1260
nwrong++;
1261
else
1262
nright++;
1263
1264
if (minbot != mintop)
1265
{
1266
if (map[hpel.pnums[minbot]] < map[hpel.pnums[mintop+3]])
1267
swap (map[hpel.pnums[3+minbot]], map[hpel.pnums[3+mintop]]);
1268
else
1269
swap (map[hpel.pnums[minbot]], map[hpel.pnums[mintop]]);
1270
}
1271
}
1272
}
1273
// cout << nwrong << " wrong prisms, " << nright << " right prisms" << endl;
1274
}
1275
1276
cout << nwrong << " wrong prisms, " << nright << " right prisms" << endl;
1277
1278
1279
ARRAY<MeshPoint, 1> hpts(mesh.GetNP());
1280
1281
for (int i = 1; i <= mesh.GetNP(); i++)
1282
hpts[map[i]] = mesh.Point(i);
1283
1284
for (int i = 1; i <= mesh.GetNP(); i++)
1285
mesh.Point(i) = hpts[i];
1286
1287
for (int i = 0; i < hpelements.Size(); i++)
1288
{
1289
HPRefElement & hpel = hpelements[i];
1290
for (int j = 0; j < hpel.np; j++)
1291
hpel.pnums[j] = map[hpel.pnums[j]];
1292
}
1293
}
1294
1295
1296
1297
/* ***************************** HPRefinement ********************************** */
1298
1299
void HPRefinement (Mesh & mesh, Refinement * ref, int levels, double fac1, bool setorders, bool reflevels)
1300
{
1301
PrintMessage (1, "HP Refinement called, levels = ", levels);
1302
1303
1304
NgLock mem_lock (mem_mutex,1);
1305
1306
mesh.coarsemesh = new Mesh;
1307
*mesh.coarsemesh = mesh;
1308
1309
#ifdef CURVEDELEMS_NEW
1310
const_cast<CurvedElements&> (mesh.coarsemesh->GetCurvedElements() ).
1311
BuildCurvedElements (ref, mesh.GetCurvedElements().GetOrder());
1312
#endif
1313
1314
1315
delete mesh.hpelements;
1316
mesh.hpelements = new ARRAY<HPRefElement>;
1317
1318
ARRAY<HPRefElement> & hpelements = *mesh.hpelements;
1319
1320
InitHPElements(mesh,hpelements);
1321
1322
ARRAY<int> nplevel;
1323
nplevel.Append (mesh.GetNP());
1324
1325
int act_ref=1;
1326
bool sing = ClassifyHPElements(mesh,hpelements, act_ref, levels);
1327
1328
sing = true; // iterate at least once
1329
while(sing)
1330
{
1331
cout << " Start new hp-refinement: step " << act_ref << endl;
1332
1333
DoRefinement (mesh, hpelements, ref, fac1);
1334
DoRefineDummies (mesh, hpelements, ref);
1335
1336
nplevel.Append (mesh.GetNP());
1337
CalcStatistics (hpelements);
1338
1339
SubdivideDegeneratedHexes (mesh, hpelements,fac1);
1340
1341
ReorderPoints (mesh, hpelements);
1342
1343
mesh.ClearSegments();
1344
mesh.ClearSurfaceElements();
1345
mesh.ClearVolumeElements();
1346
1347
for (int i = 0; i < hpelements.Size(); i++)
1348
{
1349
HPRefElement & hpel = hpelements[i];
1350
if (Get_HPRef_Struct (hpel.type))
1351
switch (Get_HPRef_Struct (hpel.type) -> geom)
1352
{
1353
case HP_SEGM:
1354
{
1355
Segment seg;
1356
seg.p1 = hpel.pnums[0];
1357
seg.p2 = hpel.pnums[1];
1358
// NOTE: only for less than 10000 elements (HACK) !!!
1359
seg.edgenr = hpel.index % 10000;
1360
seg.si = hpel.index / 10000;
1361
1362
/*
1363
seg.epgeominfo[0].dist = hpel.param[0][0]; // he: war hpel.param[0][0]
1364
seg.epgeominfo[1].dist = hpel.param[1][0]; // he: war hpel.param[1][0]
1365
*/
1366
1367
const Segment & coarseseg = mesh.coarsemesh->LineSegment(hpel.coarse_elnr+1);
1368
double d1 = coarseseg.epgeominfo[0].dist;
1369
double d2 = coarseseg.epgeominfo[1].dist;
1370
1371
// seg.epgeominfo[0].dist = hpel.param[0][0]; // he: war hpel.param[0][0]
1372
// seg.epgeominfo[1].dist = hpel.param[1][0]; // he: war hpel.param[1][0]
1373
1374
seg.epgeominfo[0].dist = d1 + hpel.param[0][0] * (d2-d1); // JS, June 08
1375
seg.epgeominfo[1].dist = d1 + hpel.param[1][0] * (d2-d1);
1376
1377
1378
seg.epgeominfo[0].edgenr = seg.edgenr;
1379
seg.epgeominfo[1].edgenr = seg.edgenr;
1380
seg.domin = hpel.domin; seg.domout=hpel.domout; // he: needed for segments!
1381
seg.hp_elnr = i;
1382
seg.singedge_left = hpel.singedge_left;
1383
seg.singedge_right = hpel.singedge_right;
1384
mesh.AddSegment (seg);
1385
break;
1386
}
1387
1388
case HP_TRIG:
1389
case HP_QUAD:
1390
{
1391
Element2d el(hpel.np);
1392
for(int j=0;j<hpel.np;j++)
1393
el.PNum(j+1) = hpel.pnums[j];
1394
el.hp_elnr = i;
1395
el.SetIndex(hpel.index);
1396
if(setorders)
1397
el.SetOrder(act_ref+1,act_ref+1,0);
1398
mesh.AddSurfaceElement(el);
1399
break;
1400
}
1401
case HP_HEX:
1402
case HP_TET:
1403
case HP_PRISM:
1404
case HP_PYRAMID:
1405
{
1406
Element el(hpel.np);
1407
for(int j=0;j<hpel.np;j++)
1408
el.PNum(j+1) = hpel.pnums[j];
1409
el.SetIndex(hpel.index);
1410
el.hp_elnr = i;
1411
if(setorders)
1412
el.SetOrder(act_ref+1,act_ref+1,act_ref+1);
1413
mesh.AddVolumeElement(el);
1414
break;
1415
}
1416
1417
default:
1418
PrintSysError ("hpref, backconversion failed for element ",
1419
int(Get_HPRef_Struct (hpel.type) -> geom));
1420
}
1421
}
1422
cout << " Start with Update Topology " << endl;
1423
mesh.UpdateTopology();
1424
cout << " Mesh Update Topology done " << endl;
1425
1426
act_ref++;
1427
1428
sing = ClassifyHPElements(mesh,hpelements, act_ref, levels);
1429
}
1430
1431
cout << " HP-Refinement done with " << --act_ref << " refinement steps." << endl;
1432
1433
if(act_ref>=1)
1434
{
1435
for(ElementIndex i=0;i<mesh.GetNE(); i++)
1436
{
1437
Element el = mesh[i] ;
1438
HPRefElement & hpel = hpelements[mesh[i].hp_elnr];
1439
const ELEMENT_EDGE * edges = MeshTopology::GetEdges (mesh[i].GetType());
1440
double dist[3] = {0,0,0};
1441
int ord_dir[3] = {0,0,0};
1442
int edge_dir[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
1443
int ned = 4;
1444
1445
switch (mesh[i].GetType())
1446
{
1447
case TET:
1448
/* cout << " TET " ;
1449
for(int k=0;k<4;k++) cout << el[k] << "\t" ;
1450
cout << endl; */
1451
break;
1452
case PRISM:
1453
/* cout << " PRISM " ;
1454
for(int k=0;k<6;k++) cout << el[k] << "\t" ;
1455
cout << endl; */
1456
for(int l=6;l<9;l++) edge_dir[l] = 2;
1457
ord_dir[2] = 2;
1458
ned = 9;
1459
break;
1460
case HEX:
1461
/* cout << " HEX " ;
1462
for(int k=0;k<8;k++) cout << el[k] << "\t" ;
1463
cout << endl; */
1464
for(int l=8;l<12; l++) edge_dir[l] = 2;
1465
edge_dir[2] = edge_dir[3] = edge_dir[6] = edge_dir[7] = 1;
1466
ord_dir[1] = 1;
1467
ord_dir[2] = 2;
1468
ned = 12;
1469
break;
1470
case PYRAMID:
1471
/* cout << " PYRAMID " ;
1472
for(int k=0;k<5;k++) cout << el[k] << "\t" ;
1473
cout << endl; */
1474
for(int l=4;l<8;l++) edge_dir[l] = 2;
1475
edge_dir[2] = edge_dir[3] = 1;
1476
ord_dir[1] = 1;
1477
ord_dir[2] = 2;
1478
ned = 8;
1479
break;
1480
}
1481
1482
for (int j=0;j<ned;j++)
1483
{
1484
1485
Vec<3> v(hpel.param[edges[j][0]-1][0]-hpel.param[edges[j][1]-1][0],
1486
hpel.param[edges[j][0]-1][1]-hpel.param[edges[j][1]-1][1],
1487
hpel.param[edges[j][0]-1][2]-hpel.param[edges[j][1]-1][2]);
1488
dist[edge_dir[j]] = max(v.Length(),dist[edge_dir[j]]);
1489
}
1490
1491
int refi[3];
1492
for(int j=0;j<3;j++)
1493
refi[j] = int(max(double(floor(log(dist[ord_dir[j]]/sqrt(2.))/log(fac1))),0.));
1494
1495
// cout << " ref " << refi[0] << "\t" << refi[1] << "\t" << refi[2] << endl;
1496
// cout << " order " << act_ref +1 - refi[0] << "\t" << act_ref +1 - refi[1] << "\t" << act_ref +1 - refi[2] << endl;
1497
1498
if(setorders)
1499
mesh[i].SetOrder(act_ref+1-refi[0],act_ref+1-refi[1],act_ref+1-refi[2]);
1500
}
1501
for(SurfaceElementIndex i=0;i<mesh.GetNSE(); i++)
1502
{
1503
Element2d el = mesh[i] ;
1504
HPRefElement & hpel = hpelements[mesh[i].hp_elnr];
1505
const ELEMENT_EDGE * edges = MeshTopology::GetEdges (mesh[i].GetType());
1506
double dist[3] = {0,0,0};
1507
int ord_dir[3] = {0,0,0};
1508
int edge_dir[4] = {0,0,0,0} ;
1509
int ned = 3;
1510
1511
if(mesh[i].GetType() == QUAD)
1512
{
1513
/* cout << " QUAD " ;
1514
for(int k=0;k<4;k++) cout << el[k] << "\t" ;
1515
cout << endl; */
1516
1517
edge_dir[2] = edge_dir[3] = 1;
1518
ord_dir[1] = 1;
1519
ned = 4;
1520
}
1521
/* else
1522
{
1523
cout << " TRIG " ;
1524
for(int k=0;k<3;k++) cout << el[k] << "\t" ;
1525
cout << endl;
1526
} */
1527
1528
for (int j=0;j<ned;j++)
1529
{
1530
Vec<3> v(hpel.param[edges[j][0]-1][0]-hpel.param[edges[j][1]-1][0],
1531
hpel.param[edges[j][0]-1][1]-hpel.param[edges[j][1]-1][1],
1532
hpel.param[edges[j][0]-1][2]-hpel.param[edges[j][1]-1][2]);
1533
dist[edge_dir[j]] = max(v.Length(),dist[edge_dir[j]]);
1534
}
1535
1536
int refi[3];
1537
for(int j=0;j<3;j++)
1538
refi[j] = int(max(double(floor(log(dist[ord_dir[j]]/sqrt(2.))/log(fac1))),0.));
1539
1540
if(setorders)
1541
mesh[i].SetOrder(act_ref+1-refi[0],act_ref+1-refi[1],act_ref+1-refi[2]);
1542
1543
// cout << " ref " << refi[0] << "\t" << refi[1] << endl;
1544
// cout << " order " << act_ref +1 - refi[0] << "\t" << act_ref +1 - refi[1] << endl;
1545
}
1546
}
1547
}
1548
1549
bool CheckSingularities(Mesh & mesh, INDEX_2_HASHTABLE<int> & edges, INDEX_2_HASHTABLE<int> & edgepoint_dom,
1550
BitArray & cornerpoint, BitArray & edgepoint, INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int> & face_edges,
1551
INDEX_2_HASHTABLE<int> & surf_edges, ARRAY<int, PointIndex::BASE> & facepoint, int & levels, int & act_ref)
1552
{
1553
bool sing=0;
1554
if (mesh.GetDimension() == 3)
1555
{
1556
/*
1557
// check, if point has as least 3 different surfs:
1558
1559
ARRAY<INDEX_3, PointIndex::BASE> surfonpoint(mesh.GetNP());
1560
surfonpoint = INDEX_3(0,0,0);
1561
1562
for (SurfaceElementIndex sei = 0; sei < mesh.GetNSE(); sei++)
1563
{
1564
const Element2d & el = mesh[sei];
1565
int ind = el.GetIndex();
1566
for (int j = 0; j < el.GetNP(); j++)
1567
{
1568
INDEX_3 & i3 = surfonpoint[el[j]];
1569
if (ind != i3.I1() && ind != i3.I2() && ind != i3.I3())
1570
{
1571
i3.I1() = i3.I2();
1572
i3.I2() = i3.I3();
1573
i3.I3() = ind;
1574
}
1575
}
1576
}
1577
for (int i = 1; i <= mesh.GetNP(); i++)
1578
if (surfonpoint.Get(i).I1())
1579
cornerpoint.Set(i);
1580
*/
1581
cornerpoint.Clear();
1582
1583
for (int i = 1; i <= mesh.GetNP(); i++)
1584
{
1585
if (mesh.Point(i).Singularity() * levels >= act_ref)
1586
{
1587
cornerpoint.Set(i);
1588
sing = 1;
1589
}
1590
}
1591
cout << endl;
1592
1593
for (int i = 1; i <= mesh.GetNSeg(); i++)
1594
if (mesh.LineSegment(i).singedge_left * levels >= act_ref)
1595
{
1596
INDEX_2 i2 (mesh.LineSegment(i).p1,
1597
mesh.LineSegment(i).p2);
1598
1599
/*
1600
// before
1601
edges.Set (i2, 1);
1602
i2.Sort();
1603
INDEX_2 i2s(i2.I2(), i2.I1());
1604
edges.Set (i2s, 1);
1605
*/
1606
1607
edges.Set (i2, 1);
1608
INDEX_2 i2s(i2.I2(), i2.I1());
1609
edges.Set (i2s, 1);
1610
1611
1612
edgepoint.Set (i2.I1());
1613
edgepoint.Set (i2.I2());
1614
sing = 1;
1615
}
1616
1617
// if 2 adjacent edges of an element are singular, the
1618
// commen point must be a singular point
1619
for (int i = 1; i <= mesh.GetNE(); i++)
1620
{
1621
const Element & el = mesh.VolumeElement(i);
1622
const ELEMENT_EDGE * eledges = MeshTopology::GetEdges (el.GetType());
1623
int nedges = MeshTopology::GetNEdges (el.GetType());
1624
for (int j = 0; j < nedges; j++)
1625
for (int k = 0; k < nedges; k++)
1626
if (j != k)
1627
{
1628
INDEX_2 ej(el.PNum(eledges[j][0]), el.PNum(eledges[j][1]));
1629
ej.Sort();
1630
INDEX_2 ek(el.PNum(eledges[k][0]), el.PNum(eledges[k][1]));
1631
ek.Sort();
1632
if (edges.Used(ej) && edges.Used(ek))
1633
{
1634
if (ej.I1() == ek.I1()) cornerpoint.Set (ek.I1());
1635
if (ej.I1() == ek.I2()) cornerpoint.Set (ek.I2());
1636
if (ej.I2() == ek.I1()) cornerpoint.Set (ek.I1());
1637
if (ej.I2() == ek.I2()) cornerpoint.Set (ek.I2());
1638
}
1639
}
1640
}
1641
1642
edgepoint.Or (cornerpoint);
1643
(*testout) << "cornerpoint = " << endl << cornerpoint << endl;
1644
(*testout) << "edgepoint = " << endl << edgepoint << endl;
1645
1646
facepoint = 0;
1647
for (SurfaceElementIndex sei = 0; sei < mesh.GetNSE(); sei++)
1648
{
1649
const Element2d & el = mesh[sei];
1650
const FaceDescriptor & fd = mesh.GetFaceDescriptor (el.GetIndex());
1651
1652
int domnr = 0;
1653
if (fd.domin_singular * levels < act_ref && fd.domout_singular * levels < act_ref)
1654
{ domnr=0; continue;}
1655
1656
if (fd.domin_singular * levels >= act_ref)
1657
{
1658
domnr = fd.DomainIn();
1659
sing = 1;
1660
}
1661
if (fd.domout_singular * levels >= act_ref)
1662
{
1663
domnr = fd.DomainOut();
1664
sing = 1;
1665
}
1666
if (fd.domin_singular * levels >= act_ref
1667
&& fd.domout_singular * levels >= act_ref)
1668
{
1669
domnr = -1;
1670
sing = 1;
1671
}
1672
1673
INDEX_3 i3;
1674
if (el.GetNP() == 3)
1675
i3 = INDEX_3::Sort (el[0], el[1], el[2]);
1676
else
1677
{
1678
INDEX_4 i4 (el[0], el[1], el[2], el[3]);
1679
i4.Sort();
1680
i3 = INDEX_3(i4.I1(), i4.I2(), i4.I3());
1681
}
1682
faces.Set (i3, domnr);
1683
1684
for (int j = 0; j < el.GetNP(); j++)
1685
{
1686
face_edges.Set (INDEX_2::Sort (el[j], el[(j+1)%el.GetNP()]), domnr);
1687
1688
surf_edges.Set (INDEX_2::Sort (el[j], el[(j+1)%el.GetNP()]), fd.SurfNr()+1);
1689
1690
facepoint[el[j]] = domnr;
1691
}
1692
1693
}
1694
(*testout) << "singular faces = " << faces << endl;
1695
(*testout) << "singular faces_edges = " << face_edges << endl;
1696
}
1697
else
1698
{
1699
// 2D case
1700
1701
// check, if point has as least 3 different surfs:
1702
ARRAY<INDEX_3, PointIndex::BASE> surfonpoint(mesh.GetNP());
1703
1704
for (int i = 1; i <= mesh.GetNP(); i++)
1705
surfonpoint.Elem(i) = INDEX_3(0,0,0);
1706
1707
for (int i = 1; i <= mesh.GetNSeg(); i++)
1708
{
1709
const Segment & seg = mesh.LineSegment(i);
1710
int ind = seg.edgenr;
1711
1712
1713
if (seg.singedge_left * levels >= act_ref)
1714
{
1715
INDEX_2 i2 (mesh.LineSegment(i).p1,
1716
mesh.LineSegment(i).p2);
1717
edges.Set(i2,1);
1718
edgepoint.Set(i2.I1());
1719
edgepoint.Set(i2.I2());
1720
*testout << " singleft " << endl;
1721
*testout << " mesh.LineSegment(i).domout " << mesh.LineSegment(i).domout << endl;
1722
*testout << " mesh.LineSegment(i).domin " << mesh.LineSegment(i).domin << endl;
1723
edgepoint_dom.Set (INDEX_2(mesh.LineSegment(i).domin, i2.I1()), 1);
1724
edgepoint_dom.Set (INDEX_2(mesh.LineSegment(i).domin, i2.I2()), 1);
1725
sing = 1;
1726
1727
}
1728
1729
if (seg.singedge_right * levels >= act_ref)
1730
{
1731
INDEX_2 i2 (mesh.LineSegment(i).p2,
1732
mesh.LineSegment(i).p1);
1733
edges.Set (i2, 1);
1734
edgepoint.Set(i2.I1());
1735
edgepoint.Set(i2.I2());
1736
1737
*testout << " singright " << endl;
1738
*testout << " mesh.LineSegment(i).domout " << mesh.LineSegment(i).domout << endl;
1739
*testout << " mesh.LineSegment(i).domin " << mesh.LineSegment(i).domin << endl;
1740
1741
edgepoint_dom.Set (INDEX_2(mesh.LineSegment(i).domout, i2.I1()), 1);
1742
edgepoint_dom.Set (INDEX_2(mesh.LineSegment(i).domout, i2.I2()), 1);
1743
sing = 1;
1744
}
1745
1746
// (*testout) << "seg = " << ind << ", " << seg.p1 << "-" << seg.p2 << endl;
1747
1748
1749
if (seg.singedge_left * levels >= act_ref
1750
|| seg.singedge_right* levels >= act_ref)
1751
{
1752
for (int j = 0; j < 2; j++)
1753
{
1754
int pi = (j == 0) ? seg.p1 : seg.p2;
1755
INDEX_3 & i3 = surfonpoint.Elem(pi);
1756
if (ind != i3.I1() &&
1757
ind != i3.I2())
1758
{
1759
i3.I1() = i3.I2();
1760
i3.I2() = ind;
1761
}
1762
}
1763
}
1764
}
1765
1766
1767
for (int i = 1; i <= mesh.GetNP(); i++)
1768
{
1769
// mark points for refinement that are in corners between two anisotropic edges
1770
if (surfonpoint.Get(i).I1())
1771
{
1772
cornerpoint.Set(i);
1773
edgepoint.Set(i);
1774
}
1775
1776
// mark points for refinement that are explicity specified in input file
1777
if (mesh.Point(i).Singularity()*levels >= act_ref)
1778
{
1779
cornerpoint.Set(i);
1780
edgepoint.Set(i);
1781
sing = 1;
1782
}
1783
}
1784
1785
edgepoint.Or (cornerpoint);
1786
1787
(*testout) << "2d sing edges: " << endl << edges << endl;
1788
(*testout) << "2d cornerpoints: " << endl << cornerpoint << endl
1789
<< "2d edgepoints: " << endl << edgepoint << endl;
1790
1791
facepoint = 0;
1792
}
1793
1794
if (!sing)
1795
{
1796
cout << "PrepareElements no more to do for actual refinement " << act_ref << endl;
1797
return(sing);
1798
}
1799
return(sing);
1800
}
1801
1802
1803
1804
bool ClassifyHPElements (Mesh & mesh, ARRAY<HPRefElement> & elements, int & act_ref, int & levels)
1805
{
1806
1807
INDEX_2_HASHTABLE<int> edges(mesh.GetNSeg()+1);
1808
BitArray edgepoint(mesh.GetNP());
1809
INDEX_2_HASHTABLE<int> edgepoint_dom(mesh.GetNSeg()+1);
1810
1811
edgepoint.Clear();
1812
BitArray cornerpoint(mesh.GetNP());
1813
cornerpoint.Clear();
1814
1815
// value = nr > 0 ... refine elements in domain nr
1816
// value = -1 ..... refine elements in any domain
1817
INDEX_3_HASHTABLE<int> faces(mesh.GetNSE()+1);
1818
INDEX_2_HASHTABLE<int> face_edges(mesh.GetNSE()+1);
1819
INDEX_2_HASHTABLE<int> surf_edges(mesh.GetNSE()+1);
1820
ARRAY<int, PointIndex::BASE> facepoint(mesh.GetNP());
1821
1822
bool sing = CheckSingularities(mesh, edges, edgepoint_dom,
1823
cornerpoint, edgepoint, faces, face_edges,
1824
surf_edges, facepoint, levels, act_ref);
1825
1826
if(sing==0) return(sing);
1827
1828
int cnt_undef = 0, cnt_nonimplement = 0;
1829
ARRAY<int> misses(10000);
1830
misses = 0;
1831
1832
(*testout) << "edgepoint_dom = " << endl << edgepoint_dom << endl;
1833
1834
for( int i = 0; i<elements.Size(); i++)
1835
{
1836
// *testout << "classify element " << i << endl;
1837
1838
HPRefElement & hpel = elements[i];
1839
HPRef_Struct * hprs = Get_HPRef_Struct (hpel.type);
1840
HPRefElement old_el = elements[i];
1841
int dd=3;
1842
1843
1844
if(act_ref !=1 && (hpel.type == HP_HEX || hpel.type == HP_PRISM || hpel.type == HP_TET
1845
|| hpel.type == HP_PYRAMID || hpel.type == HP_QUAD || hpel.type == HP_TRIG || hpel.type == HP_SEGM))
1846
continue;
1847
1848
sing = 1;
1849
switch (hprs->geom)
1850
{
1851
case HP_TET:
1852
{
1853
hpel.type = ClassifyTet(hpel, edges, edgepoint_dom, cornerpoint, edgepoint, faces,face_edges, surf_edges, facepoint);
1854
break;
1855
}
1856
case HP_PRISM:
1857
{
1858
hpel.type = ClassifyPrism(hpel, edges, edgepoint_dom, cornerpoint, edgepoint, faces,
1859
face_edges, surf_edges, facepoint);
1860
1861
1862
break;
1863
}
1864
case HP_HEX:
1865
{
1866
hpel.type = hpel.type = ClassifyHex(hpel, edges, edgepoint_dom, cornerpoint, edgepoint, faces,
1867
face_edges, surf_edges, facepoint);
1868
break;
1869
}
1870
case HP_TRIG:
1871
{
1872
int dim = mesh.GetDimension();
1873
const FaceDescriptor & fd = mesh.GetFaceDescriptor (hpel.GetIndex());
1874
1875
hpel.type = ClassifyTrig(hpel, edges, edgepoint_dom, cornerpoint, edgepoint,
1876
faces, face_edges, surf_edges, facepoint, dim, fd);
1877
1878
dd = 2;
1879
break;
1880
}
1881
case HP_QUAD:
1882
{
1883
int dim = mesh.GetDimension();
1884
const FaceDescriptor & fd = mesh.GetFaceDescriptor (hpel.GetIndex());
1885
hpel.type = ClassifyQuad(hpel, edges, edgepoint_dom, cornerpoint, edgepoint,
1886
faces, face_edges, surf_edges, facepoint, dim, fd);
1887
1888
dd = 2;
1889
break;
1890
}
1891
case HP_SEGM:
1892
{
1893
hpel.type = ClassifySegm(hpel, edges, edgepoint_dom, cornerpoint, edgepoint,
1894
faces, face_edges, surf_edges, facepoint);
1895
dd = 1;
1896
break;
1897
}
1898
case HP_PYRAMID:
1899
{
1900
hpel.type = ClassifyPyramid(hpel, edges, edgepoint_dom, cornerpoint, edgepoint, faces,
1901
face_edges, surf_edges, facepoint);
1902
1903
cout << " ** Pyramid classified " << hpel.type << endl;
1904
break;
1905
}
1906
default:
1907
{
1908
cout << "illegal element type for hp-prepare elements " << hpel.type << endl;
1909
throw NgException ("hprefinement.cpp: don't know how to set parameters");
1910
}
1911
}
1912
1913
if(hpel.type == HP_NONE)
1914
cnt_undef++;
1915
1916
//else
1917
//cout << "elem " << i << " classified type " << hpel.type << endl;
1918
1919
1920
1921
if (!Get_HPRef_Struct (hpel.type))
1922
{
1923
(*testout) << "hp-element-type " << hpel.type << " not implemented " << endl;
1924
(*testout) << " elType " << hprs->geom << endl;
1925
(cout) << " elType " << hprs->geom << endl;
1926
cnt_nonimplement++;
1927
misses[hpel.type]++;
1928
}
1929
1930
1931
for(int j=0; j<hpel.np; j++)
1932
{
1933
for( int k=0; k<hpel.np; k++)
1934
if(hpel[j] == old_el.pnums[k])
1935
{
1936
for(int l=0;l<dd;l++)
1937
hpel.param[j][l] = old_el.param[k][l];
1938
break;
1939
}
1940
}
1941
1942
}
1943
1944
1945
cout << "undefined elements update classification: " << cnt_undef << endl;
1946
cout << "non-implemented in update classification: " << cnt_nonimplement << endl;
1947
1948
for (int i = 0; i < misses.Size(); i++)
1949
if (misses[i])
1950
cout << " in update classification missing case " << i << " occured " << misses[i] << " times" << endl;
1951
1952
return(sing);
1953
}
1954
}
1955
1956
1957