KASKADE 7 development version
amiramesh.hh
Go to the documentation of this file.
1#ifndef AMIRAMESH_HH
2#define AMIRAMESH_HH
3
4#include <stdio.h>
5
6#include <vector>
7#include <map>
8
9#include <amiramesh/AmiraMesh.h>
10
11extern int ComputeBoundary(int nPoints, int nTet, int *tets, int *bounds);
12extern void SetMaterialsIds(int nPoints, int *newIds, int nUsedPoints,
13 int nBndTr, int *bndTrI, unsigned char *bndIds,
14 int nUsedBndTr, int *usedBndTrI, unsigned char *usedBndIds);
15
16template <int dim, int worldDim, class Grid>
18
19public:
20 typedef double DoubleCoord[worldDim];
21 typedef float FloatCoord[worldDim];
22 typedef int TetrahedraIndices[4];
23 typedef int TriangleIndices[3];
24
25private:
26 AmiraMesh* mesh;
27 HxParamBundle* materials, *boundaryIds;
28
29 int nPoints, nTet, nBndTr, parSize, nMaterials, nBoundaryIds;
30 FloatCoord *floatCoords;
31 DoubleCoord *doubleCoords;
33 TriangleIndices *bndTrI;
34 unsigned char *matIds;
35 unsigned char *bndIds;
36 unsigned char *tetBndIds;
37 int *newIds;
38 int *renumberedUGIds, *revRenumberedUGIds;
39
40 bool selected[256];
41 unsigned int cnts[256];
42 int nUsedPoints, nUsedTet, nUsedBndTr;
43 FloatCoord *usedFloatCoords;
44 TetrahedraIndices *usedTetI;
45 TetrahedraIndices *usedBounds;
46 TriangleIndices *usedBndTrI;
47 unsigned char *usedMatIds;
48 unsigned char *usedBndIds;
49 unsigned char *usedBndCharId;
50 std::map<std::string,int> matsMap;
51 std::map<std::string,int> bIdsMap;
52
53public:
54 DuneAmiraMesh(const char *fileName)
55 : floatCoords(0), doubleCoords(0), tetI(0), bndTrI(0), matIds(0), bndIds(0), tetBndIds(0),
56 newIds(0), renumberedUGIds(0), revRenumberedUGIds(0),
57 nUsedPoints(0), nUsedTet(0), nUsedBndTr(0),
58 usedFloatCoords(0), usedTetI(0), usedBounds(0), usedBndTrI(0)
59 {
60 mesh = AmiraMesh::read(fileName);
61 if (mesh==0)
62 {
63 std::cerr << "Failed to read " << fileName << '\n';
64 throw -34101;
65 }
66 nPoints = mesh->nElements("Vertices");
67 if (nPoints <= 0 )
68 nPoints = mesh->nElements("Nodes");
69 nTet = mesh->nElements("Tetrahedra");
70 nBndTr = mesh->nElements("BoundaryTriangles");
71 for (int k = 0; k<256; k++)
72 {
73 selected[k] = false;
74 cnts[k] = 0;
75 }
76 parSize = mesh->parameters.size();
77 materials = mesh->parameters.materials();
78 nMaterials = materials->nBundles();
79 boundaryIds = mesh->parameters.boundaryIds();
80 nBoundaryIds = boundaryIds->nBundles();
81
82 int k, id;
83 const char *str;
84
85 for (k=0; k<nMaterials; k++)
86 {
87 materials->bundle(k)->findNum("Id", id);
88 str = materials->bundle(k)->name();
89 matsMap[str] = id;
90 }
91 for (k=0; k<nBoundaryIds; k++)
92 {
93 boundaryIds->bundle(k)->findNum("Id", id);
94 boundaryIds->bundle(k)->findString("Info", str);
95 bIdsMap[str] = id;
96 }
97 newIds = new int[nPoints];
98 };
99
101 {
102 if (usedFloatCoords)
103 delete[] usedFloatCoords;
104 if (usedTetI)
105 delete[] usedTetI;
106 if (usedBounds)
107 delete[] usedBounds;
108 if (newIds)
109 delete[] newIds;
110 };
111
112 void Info(FILE *f)
113 {
114 mesh->info(f);
115 };
116
117 int GetNMatrials() { return nMaterials; };
118 int GetMaterialId(const char *name) { return matsMap[name]; };
119 const char *GetMaterialName(int id)
120 {
121 std::map<std::string,int>::iterator iter;
122 for (iter=matsMap.begin(); iter!=matsMap.end(); iter++)
123 if (iter->second==id)
124 return iter->first.c_str();
125 return 0;
126 };
127 int GetNBoundaryIds() { return nBoundaryIds; };
128 int GetBoundaryId(const char *name) { return bIdsMap[name]; };
129 const char *GetBoundaryIdName(int id)
130 {
131 std::map<std::string,int>::iterator iter;
132 for (iter=bIdsMap.begin(); iter!=bIdsMap.end(); iter++)
133 if (iter->second==id)
134 return iter->first.c_str();
135 return 0;
136 };
137
138 int GetNPoints() { return nPoints; };
139 int GetNTet() { return nTet; };
140 int GetNBdrTr() { return nBndTr; };
141
143 {
144 if (floatCoords==0)
145 {
146 AmiraMesh::Data* coordinateData = mesh->findData("Nodes", HxFLOAT, 3, "Coordinates");
147 if (coordinateData==0)
148 {
149 throw -34104;
150 }
151 floatCoords = (FloatCoord*) coordinateData->dataPtr();
152 }
153 return floatCoords;
154 };
155
157 {
158 if (tetI==0)
159 {
160 AmiraMesh::Data* tetrahedronData = mesh->findData("Tetrahedra", HxINT32, 4, "Nodes");
161 if (tetrahedronData==0)
162 {
163 throw -34105;
164 }
165 tetI = (TetrahedraIndices*) tetrahedronData->dataPtr();
166 for (int k=0; k<nTet; k++)
167 for (int i=0; i<4; i++)
168 tetI[k][i]--;
169 }
170 return tetI;
171 };
173 {
174 if (bndTrI==0)
175 {
176 AmiraMesh::Data* triangleData = mesh->findData("BoundaryTriangles", HxINT32, 3, "Nodes");
177 if (triangleData==0)
178 {
179 throw -34106;
180 }
181 bndTrI = (TriangleIndices*) triangleData->dataPtr();
182 for (int k=0; k<nBndTr; k++)
183 for (int i=0; i<3; i++)
184 bndTrI[k][i]--;
185 }
186 return bndTrI;
187 };
188 unsigned char *GetMatIds()
189 {
190 if (matIds==0)
191 {
192 AmiraMesh::Data *matIdsData = mesh->findData("Tetrahedra", HxBYTE, 1, "Materials");
193 if (matIdsData)
194 matIds = (unsigned char *)matIdsData->dataPtr();
195 }
196 return matIds;
197 }
198 unsigned char *GetBndIds()
199 {
200 if (bndIds==0)
201 {
202 AmiraMesh::Data *bndIdsData = mesh->findData("BoundaryTriangles", HxBYTE, 1, "Id");
203 if (bndIdsData)
204 bndIds = (unsigned char *)bndIdsData->dataPtr();
205 }
206 return bndIds;
207 }
208 unsigned char *GetMatBndIds()
209 {
210 if (tetBndIds==0)
211 {
212 AmiraMesh::Data *tetrahedronBndIds = mesh->findData("Tetrahedra", HxBYTE, 5, "BndIds");
213 if (tetrahedronBndIds)
214 tetBndIds = (unsigned char *)tetrahedronBndIds->dataPtr();
215 }
216 return tetBndIds;
217 }
218 void SelectAll() { for (int k=0; k<256; k++) selected[k] = true; };
219 void UnSelectAll() { for (int k=0; k<256; k++) selected[k] = false; };
220 bool Select(unsigned int k)
221 {
222 if (k>255)
223 throw -34102;
224 bool rc = selected[k];
225 selected[k] = true;
226 return rc;
227 };
228 void CountTet(FILE *f = 0)
229 {
230 if (matIds==0)
231 GetMatIds();
232
233 int k;
234 for (k=0; k<256; k++)
235 cnts[k] = 0;
236 for (k=0; k<nTet; k++)
237 cnts[matIds[k]]++;
238 if (f!=0)
239 for (k=0; k<256; k++)
240 if (cnts[k]>0)
241 fprintf(f, "%3d %6d/%d %c\n", k, cnts[k], nTet, selected[k]?'*':'-');
242 };
243 void CountUsedTet(FILE *f = 0)
244 {
245 if (usedMatIds==0)
246 throw -34103;
247
248 int k;
249 for (k=0; k<256; k++)
250 cnts[k] = 0;
251 for (k=0; k<nUsedTet; k++)
252 cnts[usedMatIds[k]]++;
253 if (f!=0)
254 for (k=0; k<256; k++)
255 if (cnts[k]>0)
256 fprintf(f, "%3d %6d/%d\n", k, cnts[k], nUsedTet);
257 };
258 void CountUsedTr(FILE *f = 0)
259 {
260 if (usedBndIds==0)
261 throw -34104;
262
263 int i, k;
264 int magic[] = {1,2,3,0};
265 for (k=0; k<256; k++)
266 cnts[k] = 0;
267// for (k=0; k<nUsedBndTr; k++)
268// cnts[usedBndIds[k]]++;
269 for (k=0; k<nUsedTet; k++)
270 for (i=0; i<4; i++)
271 if (usedBounds[k][i]==-1)
272 {
273 cnts[usedBndCharId[k*5+magic[i]+1]]++;
274 }
275
276 if (f!=0)
277 for (k=0; k<256; k++)
278 if (cnts[k]>0)
279 fprintf(f, "%3d %6d/%d\n", k, cnts[k], nUsedBndTr);
280 };
281 void Restrict()
282 {
283 if (floatCoords==0)
285 if (tetI==0)
287 if (matIds==0)
288 GetMatIds();
289// if (bndTrI==0)
290// GetBoundaryTriangleIndices();
291 if (bndIds==0)
292 GetBndIds();
293
294 int i, j, k, count;
295 std::vector<unsigned int> newId(nPoints);
296 std::vector<bool> used(nPoints);
297 for (k=0; k<nPoints; k++)
298 {
299 used[k] = false;
300 newId[k] = 9999999;
301 }
302 nUsedTet = 0;
303 for (k=0; k<nTet; k++)
304 {
305 if (selected[matIds[k]])
306 {
307 for (i=0; i<4; i++)
308 {
309 if ((tetI[k][i]<0)||(tetI[k][i]>=nPoints))
310 {
311 printf("Ojeh: k=%d, i=%d, index=%d\n", k, i, tetI[k][i]);
312 throw -34103;
313 }
314 used[tetI[k][i]] = true;
315 }
316 nUsedTet++;
317 }
318 }
319 nUsedPoints = 0;
320 for (k=0; k<nPoints; k++)
321 {
322 if (used[k])
323 {
324 newId[k] = nUsedPoints++;
325 }
326 }
327
328 if (usedFloatCoords)
329 delete[] usedFloatCoords;
330 usedFloatCoords = new FloatCoord[nUsedPoints];
331
332 count = 0;
333 for (k=0; k<nPoints; k++)
334 {
335 newIds[k] = -1;
336 if (used[k])
337 {
338 for (i=0; i<3; i++)
339 usedFloatCoords[count][i] = floatCoords[k][i];
340 newIds[k] = count;
341 count++;
342 }
343 }
344
345 if (usedTetI)
346 delete[] usedTetI;
347 usedTetI = new TetrahedraIndices[nUsedTet];
348 usedMatIds = new unsigned char[nUsedTet];
349 if (usedBounds)
350 delete[] usedBounds;
351 usedBounds = new TetrahedraIndices[nUsedTet];
352
353 count = 0;
354 for (k=0; k<nTet; k++)
355 {
356 if (selected[matIds[k]])
357 {
358 for (i=0; i<4; i++)
359 {
360 usedTetI[count][i] = newId[tetI[k][i]];
361 usedBounds[count][i] = 0;
362 }
363 usedMatIds[count] = matIds[k];
364 count++;
365 }
366 }
367 nUsedBndTr = ComputeBoundary(nUsedPoints, nUsedTet, &usedTetI[0][0], &usedBounds[0][0]);
368
369 usedBndTrI = new TriangleIndices[nUsedBndTr];
370 usedBndIds = new unsigned char[nUsedBndTr];
371
372 count = 0;
373 for (k=0; k<nUsedTet; k++)
374 {
375 for (i=0; i<4; i++)
376 {
377 if (usedBounds[k][i]==-1)
378 {
379 int pos = 0;
380 for (j=0; j<4; j++)
381 {
382 if (j!=i)
383 usedBndTrI[count][pos++] = usedTetI[k][j];
384 }
385 count++;
386 }
387 }
388 }
389
390 SetMaterialsIds(nPoints, newIds, nUsedPoints, nBndTr, &bndTrI[0][0], bndIds,
391 nUsedBndTr, &usedBndTrI[0][0], usedBndIds);
392
393 usedBndCharId = new unsigned char[5*nUsedTet];
394 int ii, magic[] = {1,2,3,0};
395 count = 0;
396 for (k=0; k<nUsedTet; k++)
397 {
398 usedBndCharId[k*5] = usedMatIds[k];
399 for (i=0; i<4; i++)
400 {
401 ii = magic[i];
402 if (usedBounds[k][i]==-1)
403 {
404 usedBndCharId[k*5+ii+1] = usedBndIds[count];
405 count++;
406 }
407 else
408 {
409 usedBndCharId[k*5+ii+1] = -1;
410 }
411 }
412 }
413 return;
414 };
415 int GetUsedNPoints() { return nUsedPoints; };
416 int GetUsedNTet() { return nUsedTet; };
417 int GetUsedNBdrTr() { return nUsedBndTr; };
418 template <class Deformation>
419 void InsertUGGrid(Dune::GridFactory<Grid> &factory, Deformation const& deformation)
420 {
421 int k;
423 std::vector<unsigned int> vid(4);
424
425 if (floatCoords==0)
427 if (tetI==0)
429
430// grid.createBegin();
431 for (k=0; k<nPoints; k++)
432 {
433 v[0] = floatCoords[k][0];
434 v[1] = floatCoords[k][1];
435 v[2] = floatCoords[k][2];
436 factory.insertVertex(deformation(v));
437 }
438
439 for (k=0; k<nTet; k++)
440 {
441 vid[0] = tetI[k][0];
442 vid[1] = tetI[k][1];
443 vid[2] = tetI[k][2];
444 vid[3] = tetI[k][3];
445 factory.insertElement(Dune::GeometryType(Dune::GeometryType::simplex,3),vid);
446 }
447// grid.createEnd();
448
449 return;
450 }
451 void InsertUGGrid(Dune::GridFactory<Grid> &factory)
452 {
453 auto identity = [] (auto x) {return x;};
454 InsertUGGrid(factory, identity);
455
456 return;
457 }
458 template <class Functional>
459 void CheckRenumbering(Grid &grid, Functional &F)
460 {
461 int i, k;
462
463 if (renumberedUGIds==0)
464 renumberedUGIds = new int[nPoints];
465 if (revRenumberedUGIds==0)
466 revRenumberedUGIds = new int[nPoints];
467
468 typedef typename Functional::AnsatzVars::IndexSet IndexSet;
469 typedef typename IndexSet::template Codim<0>::template Partition<Dune::All_Partition>::Iterator ElementLeafIterator;
470 ElementLeafIterator tetIt(grid.template leafbegin<0>());
471
472 for (k=0; k<nPoints; k++)
473 {
474 renumberedUGIds[k] = -1;
475 revRenumberedUGIds[k] = -1;
476 }
477 for (k=0; tetIt!=grid.template leafend<0>(); ++tetIt, k++)
478 {
479 for (i=0; i<tetIt->geometry().corners(); i++)
480 {
481 int newPos = grid.leafIndexSet().template subIndex<dim>(*tetIt,i);
482 revRenumberedUGIds[tetI[k][i]] = newPos;
483 renumberedUGIds[newPos] = tetI[k][i];
484 }
485 }
486 for (k=0; k<nPoints; k++)
487 {
488 if (renumberedUGIds[k] == -1)
489 {
490 printf ("Failed to find new number for %d\n", k);
491 abort();
492 }
493 if (revRenumberedUGIds[k] == -1)
494 {
495 printf ("Failed to find new number for %d\n", k);
496 abort();
497 }
498 }
499 printf("CheckRenumbering succeeded\n");
500 }
501 void InsertRestrictedUGGrid(Grid *grid)
502 {
503 return;
504 }
505 void WriteRestrictedAlberta(const char *fileName)
506 {
507 FILE *f = fopen(fileName, "w");
508 int i, k, lineCount = 0;
509
510 fprintf(f, "DIM: %d\n", dim);
511 fprintf(f, "DIM_OF_WORLD: %d\n", dim);
512
513 fprintf(f, "number of vertices: %d\n", nUsedPoints);
514 fprintf(f, "number of elements: %d\n", nUsedTet);
515
516 fprintf(f, "vertex coordinates:\n");
517 lineCount += 5;
518
519 for (k=0; k<nUsedPoints; k++)
520 {
521 for (i=0; i<3; i++)
522 fprintf(f, " %f", usedFloatCoords[k][i]);
523 fprintf(f, "\n");
524 lineCount++;
525 }
526
527 fprintf(f, "element vertices:\n");
528 lineCount++;
529 for (k=0; k<nUsedTet; k++)
530 {
531 for (i=0; i<4; i++)
532 fprintf(f, " %d", usedTetI[k][i]);
533 fprintf(f, "\n");
534 lineCount++;
535 }
536
537 fprintf(f, "element boundaries:\n");
538 lineCount++;
539 for (k=0; k<nUsedTet; k++)
540 {
541 for (i=0; i<4; i++)
542 fprintf(f, " %d", (usedBounds[k][i]==-1)?1:0);
543 fprintf(f, "\n");
544 lineCount++;
545 }
546
547 fclose(f);
548 std::cout << "Alberta file " << fileName << ", " << lineCount << " lines written\n";
549 }
550 void WriteRestrictedAmira(const char *fileName)
551 {
552 int i, k;
553
554 AmiraMesh *outMesh = new AmiraMesh;
555 outMesh->parameters = mesh->parameters;
556
557 McPrimType floatType(&usedFloatCoords[0][0]);
558 AmiraMesh::Location outVert("Nodes", nUsedPoints);
559 AmiraMesh::Data outCoord("Coordinates", &outVert, floatType, 3, &usedFloatCoords[0][0]);
560 outMesh->insert(&outVert);
561 outMesh->insert(&outCoord);
562
563 for (k=0; k<nUsedTet; k++)
564 {
565 for (i=0; i<4; i++)
566 usedTetI[k][i]++;
567 }
568
569 for (k=0; k<nUsedBndTr; k++)
570 {
571 for (i=0; i<3; i++)
572 usedBndTrI[k][i]++;
573 }
574
575 McPrimType intType(&usedTetI[0][0]);
576 AmiraMesh::Location outTet("Tetrahedra", nUsedTet);
577 AmiraMesh::Data outNodes("Nodes", &outTet, intType, 4, &usedTetI[0][0]);
578 outMesh->insert(&outTet);
579 outMesh->insert(&outNodes);
580
581 McPrimType byteType(&usedMatIds[0]);
582 AmiraMesh::Location outTetData("TetrahedronData", nUsedTet);
583 AmiraMesh::Data outBndIds("BndIds", &outTetData, byteType, 5, &usedBndCharId[0]);
584 outMesh->insert(&outBndIds);
585
586 AmiraMesh::Location outBtr("BoundaryTriangles", nUsedBndTr);
587 AmiraMesh::Data outBtrNodes("Nodes", &outBtr, intType, 3, &usedBndTrI[0][0]);
588 outMesh->insert(&outBtr);
589 outMesh->insert(&outBtrNodes);
590
591 AmiraMesh::Location outBtrData("BoundaryTriangleData", nUsedBndTr);
592 AmiraMesh::Data outBtrId("Id", &outBtrData, byteType, 1, &usedBndIds[0]);
593 outMesh->insert(&outBtrId);
594
595 outMesh->write(fileName, 1);
596
597 for (k=0; k<nUsedBndTr; k++)
598 {
599 for (i=0; i<3; i++)
600 usedBndTrI[k][i]--;
601 }
602
603 for (k=0; k<nUsedTet; k++)
604 {
605 for (i=0; i<4; i++)
606 usedTetI[k][i]--;
607 }
608 delete outMesh;
609 }
610 template <class VertexIterator, class ElementIterator>
611 void WriteAmiraSolution(Grid *grid, const char *fileName, int size, int nSol, int solSize, double *x)
612 {
613
614 if (matIds==0) GetMatIds();
615 if (bndTrI==0) GetBoundaryTriangleIndices();
616 if (bndIds==0) GetBndIds();
617 if (tetBndIds==0) GetMatBndIds();
618
619 int i, k;
620
621 AmiraMesh *outMesh = new AmiraMesh;
622 outMesh->parameters = mesh->parameters;
623
624 McPrimType floatType(&floatCoords[0][0]);
625 AmiraMesh::Location outVert("Nodes", nPoints);
626 AmiraMesh::Data outCoord("Coordinates", &outVert, floatType, 3);
627
628 outMesh->insert(&outVert);
629 outMesh->insert(&outCoord);
630
631 VertexIterator vertex = grid->template leafbegin<dim>();
632 VertexIterator endvertex = grid->template leafend<dim>();
633
634 for (; vertex!=endvertex; ++vertex)
635 {
636
637 int index = grid->leafIndexSet().template index<dim>(*vertex);
638 const Dune::FieldVector<double, dim>& coords = vertex->geometry()[0];
639
640 // Copy coordinates
641 for (int i=0; i<dim; i++)
642 ((float*)outCoord.dataPtr())[dim*index+i] = coords[i];
643
644 }
645
646 McPrimType intType(&tetI[0][0]);
647 AmiraMesh::Location outTet("Tetrahedra", nTet);
648 AmiraMesh::Data outNodes("Nodes", &outTet, intType, 4);
649 outMesh->insert(&outTet);
650 outMesh->insert(&outNodes);
651
652 int *dPtr = (int*)outNodes.dataPtr();
653 ElementIterator eIt = grid->template leafbegin<0>();
654 ElementIterator eEndIt = grid->template leafend<0>();
655
656 for (i=0; eIt!=eEndIt; ++eIt)
657 {
658 if (eIt->type().isTetrahedron())
659 {
660
661 for (int j=0; j<4; j++)
662 dPtr[i++] = grid->leafIndexSet().template subIndex<dim>(*eIt,j)+1;
663
664 }
665 else
666 {
667 std::cout << "Can't write GeometryType " << eIt->type() << "\n";
668 abort();
669 }
670
671 }
672
673 McPrimType byteType(&bndIds[0]);
674 AmiraMesh::Location outMatLoc("Tetrahedra", nTet);
675 AmiraMesh::Data outMatData("Materials", &outMatLoc, byteType, 1);
676 outMesh->insert(&outMatData);
677 unsigned char *mIds = (unsigned char*)outMatData.dataPtr();
678 for (k=0; k<nTet; k++)
679 mIds[k] = tetBndIds[5*k];
680
681//
682// AmiraMesh::Location outBtr("BoundaryTriangles", nBndTr);
683// AmiraMesh::Data outBtrNodes("Nodes", &outBtr, intType, 3, &bndTrI[0][0]);
684// outMesh->insert(&outBtr);
685// outMesh->insert(&outBtrNodes);
686//
687// AmiraMesh::Location outBtrLoc("BoundaryTriangles", nBndTr);
688// AmiraMesh::Data outBtrId("Id", &outBtrLoc, byteType, 1, &bndIds[0]);
689// outMesh->insert(&outBtrId);
690
691 AmiraMesh::Location outU("Nodes", nPoints);
692 AmiraMesh::Data outUData("UValues", &outU, floatType, 3);
693 outMesh->insert(&outUData);
694 float *u = (float*)outUData.dataPtr();
695 for (k=0; k<3*nPoints; k++)
696 u[k] = x[k];
697
698 AmiraMesh::Location outV("Nodes", nPoints);
699 AmiraMesh::Data outVData("VValues", &outV, floatType, 3);
700 outMesh->insert(&outVData);
701 float *v = (float*)outVData.dataPtr();
702 for (k=0; k<3*nPoints; k++)
703 v[k] = x[3*nPoints+k];
704
705 AmiraMesh::Field outUField("u", 3, floatType, AmiraMesh::t_linear, &outUData);
706 outMesh->insert(&outUField);
707 AmiraMesh::Field outVField("v", 3, floatType, AmiraMesh::t_linear, &outVData);
708 outMesh->insert(&outVField);
709
710 outMesh->write(fileName, 1);
711// delete outMesh;
712 printf("WriteAmiraSolution: written to %s\n", fileName);
713 }
714};
715
716#endif
void SetMaterialsIds(int nPoints, int *newIds, int nUsedPoints, int nBndTr, int *bndTrI, unsigned char *bndIds, int nUsedBndTr, int *usedBndTrI, unsigned char *usedBndIds)
int ComputeBoundary(int nPoints, int nTet, int *tets, int *bounds)
unsigned char * GetMatBndIds()
Definition: amiramesh.hh:208
int GetUsedNPoints()
Definition: amiramesh.hh:415
void WriteAmiraSolution(Grid *grid, const char *fileName, int size, int nSol, int solSize, double *x)
Definition: amiramesh.hh:611
TetrahedraIndices * GetTetrahedraIndices()
Definition: amiramesh.hh:156
void CheckRenumbering(Grid &grid, Functional &F)
Definition: amiramesh.hh:459
float FloatCoord[worldDim]
Definition: amiramesh.hh:21
int GetBoundaryId(const char *name)
Definition: amiramesh.hh:128
int GetUsedNTet()
Definition: amiramesh.hh:416
FloatCoord * GetFloatCoord()
Definition: amiramesh.hh:142
void SelectAll()
Definition: amiramesh.hh:218
int GetMaterialId(const char *name)
Definition: amiramesh.hh:118
bool Select(unsigned int k)
Definition: amiramesh.hh:220
int TriangleIndices[3]
Definition: amiramesh.hh:23
void InsertUGGrid(Dune::GridFactory< Grid > &factory, Deformation const &deformation)
Definition: amiramesh.hh:419
void UnSelectAll()
Definition: amiramesh.hh:219
void WriteRestrictedAmira(const char *fileName)
Definition: amiramesh.hh:550
int GetNMatrials()
Definition: amiramesh.hh:117
void InsertUGGrid(Dune::GridFactory< Grid > &factory)
Definition: amiramesh.hh:451
void InsertRestrictedUGGrid(Grid *grid)
Definition: amiramesh.hh:501
double DoubleCoord[worldDim]
Definition: amiramesh.hh:20
const char * GetBoundaryIdName(int id)
Definition: amiramesh.hh:129
void CountTet(FILE *f=0)
Definition: amiramesh.hh:228
DuneAmiraMesh(const char *fileName)
Definition: amiramesh.hh:54
void Restrict()
Definition: amiramesh.hh:281
int GetNBdrTr()
Definition: amiramesh.hh:140
int GetNPoints()
Definition: amiramesh.hh:138
void CountUsedTet(FILE *f=0)
Definition: amiramesh.hh:243
int GetNBoundaryIds()
Definition: amiramesh.hh:127
int TetrahedraIndices[4]
Definition: amiramesh.hh:22
int GetUsedNBdrTr()
Definition: amiramesh.hh:417
const char * GetMaterialName(int id)
Definition: amiramesh.hh:119
void WriteRestrictedAlberta(const char *fileName)
Definition: amiramesh.hh:505
void CountUsedTr(FILE *f=0)
Definition: amiramesh.hh:258
unsigned char * GetMatIds()
Definition: amiramesh.hh:188
unsigned char * GetBndIds()
Definition: amiramesh.hh:198
void Info(FILE *f)
Definition: amiramesh.hh:112
TriangleIndices * GetBoundaryTriangleIndices()
Definition: amiramesh.hh:172
int count(Cell const &cell, int codim)
Computes the number of subentities of codimension c of a given entity.
Definition: fixdune.hh:716