9#include <amiramesh/AmiraMesh.h>
13 int nBndTr,
int *bndTrI,
unsigned char *bndIds,
14 int nUsedBndTr,
int *usedBndTrI,
unsigned char *usedBndIds);
16template <
int dim,
int worldDim,
class Gr
id>
27 HxParamBundle* materials, *boundaryIds;
29 int nPoints, nTet, nBndTr, parSize, nMaterials, nBoundaryIds;
34 unsigned char *matIds;
35 unsigned char *bndIds;
36 unsigned char *tetBndIds;
38 int *renumberedUGIds, *revRenumberedUGIds;
41 unsigned int cnts[256];
42 int nUsedPoints, nUsedTet, nUsedBndTr;
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;
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)
60 mesh = AmiraMesh::read(fileName);
63 std::cerr <<
"Failed to read " << fileName <<
'\n';
66 nPoints = mesh->nElements(
"Vertices");
68 nPoints = mesh->nElements(
"Nodes");
69 nTet = mesh->nElements(
"Tetrahedra");
70 nBndTr = mesh->nElements(
"BoundaryTriangles");
71 for (
int k = 0; k<256; k++)
76 parSize = mesh->parameters.size();
77 materials = mesh->parameters.materials();
78 nMaterials = materials->nBundles();
79 boundaryIds = mesh->parameters.boundaryIds();
80 nBoundaryIds = boundaryIds->nBundles();
85 for (k=0; k<nMaterials; k++)
87 materials->bundle(k)->findNum(
"Id",
id);
88 str = materials->bundle(k)->name();
91 for (k=0; k<nBoundaryIds; k++)
93 boundaryIds->bundle(k)->findNum(
"Id",
id);
94 boundaryIds->bundle(k)->findString(
"Info", str);
97 newIds =
new int[nPoints];
103 delete[] usedFloatCoords;
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();
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();
146 AmiraMesh::Data* coordinateData = mesh->findData(
"Nodes", HxFLOAT, 3,
"Coordinates");
147 if (coordinateData==0)
151 floatCoords = (
FloatCoord*) coordinateData->dataPtr();
160 AmiraMesh::Data* tetrahedronData = mesh->findData(
"Tetrahedra", HxINT32, 4,
"Nodes");
161 if (tetrahedronData==0)
166 for (
int k=0; k<nTet; k++)
167 for (
int i=0; i<4; i++)
176 AmiraMesh::Data* triangleData = mesh->findData(
"BoundaryTriangles", HxINT32, 3,
"Nodes");
182 for (
int k=0; k<nBndTr; k++)
183 for (
int i=0; i<3; i++)
192 AmiraMesh::Data *matIdsData = mesh->findData(
"Tetrahedra", HxBYTE, 1,
"Materials");
194 matIds = (
unsigned char *)matIdsData->dataPtr();
202 AmiraMesh::Data *bndIdsData = mesh->findData(
"BoundaryTriangles", HxBYTE, 1,
"Id");
204 bndIds = (
unsigned char *)bndIdsData->dataPtr();
212 AmiraMesh::Data *tetrahedronBndIds = mesh->findData(
"Tetrahedra", HxBYTE, 5,
"BndIds");
213 if (tetrahedronBndIds)
214 tetBndIds = (
unsigned char *)tetrahedronBndIds->dataPtr();
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; };
224 bool rc = selected[k];
234 for (k=0; k<256; k++)
236 for (k=0; k<nTet; k++)
239 for (k=0; k<256; k++)
241 fprintf(f,
"%3d %6d/%d %c\n", k, cnts[k], nTet, selected[k]?
'*':
'-');
249 for (k=0; k<256; k++)
251 for (k=0; k<nUsedTet; k++)
252 cnts[usedMatIds[k]]++;
254 for (k=0; k<256; k++)
256 fprintf(f,
"%3d %6d/%d\n", k, cnts[k], nUsedTet);
264 int magic[] = {1,2,3,0};
265 for (k=0; k<256; k++)
269 for (k=0; k<nUsedTet; k++)
271 if (usedBounds[k][i]==-1)
273 cnts[usedBndCharId[k*5+magic[i]+1]]++;
277 for (k=0; k<256; k++)
279 fprintf(f,
"%3d %6d/%d\n", k, cnts[k], nUsedBndTr);
295 std::vector<unsigned int> newId(nPoints);
296 std::vector<bool> used(nPoints);
297 for (k=0; k<nPoints; k++)
303 for (k=0; k<nTet; k++)
305 if (selected[matIds[k]])
309 if ((tetI[k][i]<0)||(tetI[k][i]>=nPoints))
311 printf(
"Ojeh: k=%d, i=%d, index=%d\n", k, i, tetI[k][i]);
314 used[tetI[k][i]] =
true;
320 for (k=0; k<nPoints; k++)
324 newId[k] = nUsedPoints++;
329 delete[] usedFloatCoords;
330 usedFloatCoords =
new FloatCoord[nUsedPoints];
333 for (k=0; k<nPoints; k++)
339 usedFloatCoords[
count][i] = floatCoords[k][i];
348 usedMatIds =
new unsigned char[nUsedTet];
354 for (k=0; k<nTet; k++)
356 if (selected[matIds[k]])
360 usedTetI[
count][i] = newId[tetI[k][i]];
361 usedBounds[
count][i] = 0;
363 usedMatIds[
count] = matIds[k];
367 nUsedBndTr =
ComputeBoundary(nUsedPoints, nUsedTet, &usedTetI[0][0], &usedBounds[0][0]);
370 usedBndIds =
new unsigned char[nUsedBndTr];
373 for (k=0; k<nUsedTet; k++)
377 if (usedBounds[k][i]==-1)
383 usedBndTrI[
count][pos++] = usedTetI[k][j];
390 SetMaterialsIds(nPoints, newIds, nUsedPoints, nBndTr, &bndTrI[0][0], bndIds,
391 nUsedBndTr, &usedBndTrI[0][0], usedBndIds);
393 usedBndCharId =
new unsigned char[5*nUsedTet];
394 int ii, magic[] = {1,2,3,0};
396 for (k=0; k<nUsedTet; k++)
398 usedBndCharId[k*5] = usedMatIds[k];
402 if (usedBounds[k][i]==-1)
404 usedBndCharId[k*5+ii+1] = usedBndIds[
count];
409 usedBndCharId[k*5+ii+1] = -1;
418 template <
class Deformation>
419 void InsertUGGrid(Dune::GridFactory<Grid> &factory, Deformation
const& deformation)
423 std::vector<unsigned int> vid(4);
431 for (k=0; k<nPoints; k++)
433 v[0] = floatCoords[k][0];
434 v[1] = floatCoords[k][1];
435 v[2] = floatCoords[k][2];
436 factory.insertVertex(deformation(v));
439 for (k=0; k<nTet; k++)
445 factory.insertElement(Dune::GeometryType(Dune::GeometryType::simplex,3),vid);
453 auto identity = [] (
auto x) {
return x;};
458 template <
class Functional>
463 if (renumberedUGIds==0)
464 renumberedUGIds =
new int[nPoints];
465 if (revRenumberedUGIds==0)
466 revRenumberedUGIds =
new int[nPoints];
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>());
472 for (k=0; k<nPoints; k++)
474 renumberedUGIds[k] = -1;
475 revRenumberedUGIds[k] = -1;
477 for (k=0; tetIt!=grid.template leafend<0>(); ++tetIt, k++)
479 for (i=0; i<tetIt->geometry().corners(); i++)
481 int newPos = grid.leafIndexSet().template subIndex<dim>(*tetIt,i);
482 revRenumberedUGIds[tetI[k][i]] = newPos;
483 renumberedUGIds[newPos] = tetI[k][i];
486 for (k=0; k<nPoints; k++)
488 if (renumberedUGIds[k] == -1)
490 printf (
"Failed to find new number for %d\n", k);
493 if (revRenumberedUGIds[k] == -1)
495 printf (
"Failed to find new number for %d\n", k);
499 printf(
"CheckRenumbering succeeded\n");
507 FILE *f = fopen(fileName,
"w");
508 int i, k, lineCount = 0;
510 fprintf(f,
"DIM: %d\n", dim);
511 fprintf(f,
"DIM_OF_WORLD: %d\n", dim);
513 fprintf(f,
"number of vertices: %d\n", nUsedPoints);
514 fprintf(f,
"number of elements: %d\n", nUsedTet);
516 fprintf(f,
"vertex coordinates:\n");
519 for (k=0; k<nUsedPoints; k++)
522 fprintf(f,
" %f", usedFloatCoords[k][i]);
527 fprintf(f,
"element vertices:\n");
529 for (k=0; k<nUsedTet; k++)
532 fprintf(f,
" %d", usedTetI[k][i]);
537 fprintf(f,
"element boundaries:\n");
539 for (k=0; k<nUsedTet; k++)
542 fprintf(f,
" %d", (usedBounds[k][i]==-1)?1:0);
548 std::cout <<
"Alberta file " << fileName <<
", " << lineCount <<
" lines written\n";
554 AmiraMesh *outMesh =
new AmiraMesh;
555 outMesh->parameters = mesh->parameters;
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);
563 for (k=0; k<nUsedTet; k++)
569 for (k=0; k<nUsedBndTr; k++)
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);
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);
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);
591 AmiraMesh::Location outBtrData(
"BoundaryTriangleData", nUsedBndTr);
592 AmiraMesh::Data outBtrId(
"Id", &outBtrData, byteType, 1, &usedBndIds[0]);
593 outMesh->insert(&outBtrId);
595 outMesh->write(fileName, 1);
597 for (k=0; k<nUsedBndTr; k++)
603 for (k=0; k<nUsedTet; k++)
610 template <
class VertexIterator,
class ElementIterator>
611 void WriteAmiraSolution(Grid *grid,
const char *fileName,
int size,
int nSol,
int solSize,
double *x)
621 AmiraMesh *outMesh =
new AmiraMesh;
622 outMesh->parameters = mesh->parameters;
624 McPrimType floatType(&floatCoords[0][0]);
625 AmiraMesh::Location outVert(
"Nodes", nPoints);
626 AmiraMesh::Data outCoord(
"Coordinates", &outVert, floatType, 3);
628 outMesh->insert(&outVert);
629 outMesh->insert(&outCoord);
631 VertexIterator vertex = grid->template leafbegin<dim>();
632 VertexIterator endvertex = grid->template leafend<dim>();
634 for (; vertex!=endvertex; ++vertex)
637 int index = grid->leafIndexSet().template index<dim>(*vertex);
641 for (
int i=0; i<dim; i++)
642 ((
float*)outCoord.dataPtr())[dim*index+i] = coords[i];
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);
652 int *dPtr = (
int*)outNodes.dataPtr();
653 ElementIterator eIt = grid->template leafbegin<0>();
654 ElementIterator eEndIt = grid->template leafend<0>();
656 for (i=0; eIt!=eEndIt; ++eIt)
658 if (eIt->type().isTetrahedron())
661 for (
int j=0; j<4; j++)
662 dPtr[i++] = grid->leafIndexSet().template subIndex<dim>(*eIt,j)+1;
667 std::cout <<
"Can't write GeometryType " << eIt->type() <<
"\n";
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];
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++)
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];
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);
710 outMesh->write(fileName, 1);
712 printf(
"WriteAmiraSolution: written to %s\n", fileName);
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()
void WriteAmiraSolution(Grid *grid, const char *fileName, int size, int nSol, int solSize, double *x)
TetrahedraIndices * GetTetrahedraIndices()
void CheckRenumbering(Grid &grid, Functional &F)
float FloatCoord[worldDim]
int GetBoundaryId(const char *name)
FloatCoord * GetFloatCoord()
int GetMaterialId(const char *name)
bool Select(unsigned int k)
void InsertUGGrid(Dune::GridFactory< Grid > &factory, Deformation const &deformation)
void WriteRestrictedAmira(const char *fileName)
void InsertUGGrid(Dune::GridFactory< Grid > &factory)
void InsertRestrictedUGGrid(Grid *grid)
double DoubleCoord[worldDim]
const char * GetBoundaryIdName(int id)
DuneAmiraMesh(const char *fileName)
void CountUsedTet(FILE *f=0)
const char * GetMaterialName(int id)
void WriteRestrictedAlberta(const char *fileName)
void CountUsedTr(FILE *f=0)
unsigned char * GetMatIds()
unsigned char * GetBndIds()
TriangleIndices * GetBoundaryTriangleIndices()
int count(Cell const &cell, int codim)
Computes the number of subentities of codimension c of a given entity.