aboutsummaryrefslogtreecommitdiff
path: root/src/AMRHierLib/AMRGridStitcher.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/AMRHierLib/AMRGridStitcher.cc')
-rw-r--r--src/AMRHierLib/AMRGridStitcher.cc1936
1 files changed, 1936 insertions, 0 deletions
diff --git a/src/AMRHierLib/AMRGridStitcher.cc b/src/AMRHierLib/AMRGridStitcher.cc
new file mode 100644
index 0000000..61817e4
--- /dev/null
+++ b/src/AMRHierLib/AMRGridStitcher.cc
@@ -0,0 +1,1936 @@
+//------------------------------------------------------------------------------
+//
+// Project: Crack-free Isosurfaces for AMR Data
+// Module: $RCSfile$
+// Language: C++
+// Date: $Date$
+// Author: $Author$
+// Version: $Revision$
+//
+//------------------------------------------------------------------------------
+
+#include "AMRGridStitcher.hh"
+
+// Own Helper Includes
+#include <assume.hh>
+#include <Vertex.hh>
+
+// AMR Specific Includes
+#include <AMRGrid.hh>
+#include <AMRLevel.hh>
+
+namespace AMRGridStitcherAuxFct
+{
+ template <class StitchCellHandler>
+ inline void generateCellsForDeformedTrianglePrism045(StitchCellHandler& stitchCellHandler, const AMRGridCell& p0, const AMRGridCell& p1, const AMRGridCell& p2, const AMRGridCell& p3, const AMRGridCell& p4, const AMRGridCell& p5)
+ {
+ stitchCellHandler.handleTetrahedronCell(p3, p2, p5, p0);
+ stitchCellHandler.handlePyramidCell(p1, p4, p5, p2, p0);
+ }
+
+ template <class StitchCellHandler>
+ inline void generateCellsForDeformedTrianglePrism145(StitchCellHandler& stitchCellHandler, const AMRGridCell& p0, const AMRGridCell& p1, const AMRGridCell& p2, const AMRGridCell& p3, const AMRGridCell& p4, const AMRGridCell& p5)
+ {
+ stitchCellHandler.handleTetrahedronCell(p3, p2, p5, p1);
+ stitchCellHandler.handlePyramidCell(p0, p3, p5, p4, p1);
+ }
+
+ template <class StitchCellHandler>
+ inline void generateCellsForDeformedTrianglePrism245(StitchCellHandler& stitchCellHandler, const AMRGridCell& p0, const AMRGridCell& p1, const AMRGridCell& p2, const AMRGridCell& p3, const AMRGridCell& p4, const AMRGridCell& p5)
+ {
+ generateCellsForDeformedTrianglePrism045(stitchCellHandler, p2, p3, p0, p1, p5, p4);
+ }
+
+ template <class StitchCellHandler>
+ inline void generateCellsForDeformedTrianglePrism345(StitchCellHandler& stitchCellHandler, const AMRGridCell& p0, const AMRGridCell& p1, const AMRGridCell& p2, const AMRGridCell& p3, const AMRGridCell& p4, const AMRGridCell& p5)
+ {
+ generateCellsForDeformedTrianglePrism145(stitchCellHandler, p2, p3, p0, p1, p5, p4);
+ }
+
+ template <class StitchCellHandler>
+ inline void generateCellsForDeformedTrianglePrism0145(StitchCellHandler& stitchCellHandler, const AMRGridCell& p0, const AMRGridCell& p1, const AMRGridCell& p2, const AMRGridCell& p3, const AMRGridCell& p4, const AMRGridCell& p5)
+ {
+ stitchCellHandler.handleTetrahedronCell(p0, p4, p1, p5);
+ stitchCellHandler.handlePyramidCell(p0, p1, p2, p3, p5);
+ }
+
+ template <class StitchCellHandler>
+ inline void generateCellsForDeformedTrianglePrism2345(StitchCellHandler& stitchCellHandler, const AMRGridCell& p0, const AMRGridCell& p1, const AMRGridCell& p2, const AMRGridCell& p3, const AMRGridCell& p4, const AMRGridCell& p5)
+ {
+ generateCellsForDeformedTrianglePrism0145(stitchCellHandler, p2, p3, p0, p1, p5, p4);
+ }
+
+ template <class StitchCellHandler>
+ inline void generateCellsForDeformedTrianglePrism12345(StitchCellHandler& stitchCellHandler, const AMRGridCell& p0, const AMRGridCell& p1, const AMRGridCell& p2, const AMRGridCell& p3, const AMRGridCell& p4, const AMRGridCell& p5)
+ {
+ stitchCellHandler.handleTetrahedronCell(p0, p4, p1, p3);
+ stitchCellHandler.handlePyramidCell(p1, p4, p5, p2, p3);
+ }
+ template <class StitchCellHandler>
+ inline void generateCellsForDeformedTrianglePrism02345(StitchCellHandler& stitchCellHandler, const AMRGridCell& p0, const AMRGridCell& p1, const AMRGridCell& p2, const AMRGridCell& p3, const AMRGridCell& p4, const AMRGridCell& p5)
+ {
+ stitchCellHandler.handleTetrahedronCell(p0, p4, p1, p2);
+ stitchCellHandler.handlePyramidCell(p0, p3, p5, p4, p2);
+ }
+
+ template <class StitchCellHandler>
+ inline void generateCellsForDeformedTrianglePrism01345(StitchCellHandler& stitchCellHandler, const AMRGridCell& p0, const AMRGridCell& p1, const AMRGridCell& p2, const AMRGridCell& p3, const AMRGridCell& p4, const AMRGridCell& p5)
+ {
+ generateCellsForDeformedTrianglePrism12345(stitchCellHandler, p2, p3, p0, p1, p5, p4);
+ }
+
+ template <class StitchCellHandler>
+ inline void generateCellsForDeformedTrianglePrism01245(StitchCellHandler& stitchCellHandler, const AMRGridCell& p0, const AMRGridCell& p1, const AMRGridCell& p2, const AMRGridCell& p3, const AMRGridCell& p4, const AMRGridCell& p5)
+ {
+ generateCellsForDeformedTrianglePrism02345(stitchCellHandler, p2, p3, p0, p1, p5, p4);
+ }
+ template <class StitchCellHandler>
+ inline void generateCellsForDeformedPyramid04(StitchCellHandler& stitchCellHandler, const AMRGridCell& p0, const AMRGridCell& p1, const AMRGridCell& p2, const AMRGridCell& p3, const AMRGridCell& p4)
+ {
+ stitchCellHandler.handleTetrahedronCell(p0, p1, p2, p4);
+ stitchCellHandler.handleTetrahedronCell(p0, p2, p3, p4);
+ }
+
+ template <class StitchCellHandler>
+ inline void generateCellsForDeformedPyramid023(StitchCellHandler& stitchCellHandler, const AMRGridCell& p0, const AMRGridCell& p1, const AMRGridCell& p2, const AMRGridCell& p3, const AMRGridCell& p4)
+ {
+ stitchCellHandler.handleTetrahedronCell(p0, p1, p2, p4);
+ stitchCellHandler.handleTetrahedronCell(p0, p2, p3, p4);
+ }
+
+ template <class StitchCellHandler>
+ inline void generateCellsForDeformedPyramid024(StitchCellHandler& stitchCellHandler, const AMRGridCell& p0, const AMRGridCell& p1, const AMRGridCell& p2, const AMRGridCell& p3, const AMRGridCell& p4)
+ {
+ stitchCellHandler.handleTetrahedronCell(p0, p1, p2, p4);
+ stitchCellHandler.handleTetrahedronCell(p0, p2, p3, p4);
+ }
+
+ template <class StitchCellHandler>
+ inline void generateCellsForDeformedPyramid1234(StitchCellHandler& stitchCellHandler, const AMRGridCell& p0, const AMRGridCell& p1, const AMRGridCell& p2, const AMRGridCell& p3, const AMRGridCell& p4)
+ {
+ stitchCellHandler.handleTetrahedronCell(p0, p1, p3, p4);
+ stitchCellHandler.handleTetrahedronCell(p1, p2, p3, p4);
+ }
+
+ template <class StitchCellHandler>
+ inline void generateCellsForDeformedCube024567(StitchCellHandler& stitchCellHandler, const AMRGridCell& p0, const AMRGridCell& p1, const AMRGridCell& p2, const AMRGridCell& p3, const AMRGridCell& p4, const AMRGridCell& p5, const AMRGridCell& p6, const AMRGridCell& p7)
+ {
+ generateCellsForDeformedPyramid1234(stitchCellHandler, p3, p7, p4, p0, p2);
+ generateCellsForDeformedPyramid1234(stitchCellHandler, p1, p0, p4, p5, p2);
+ stitchCellHandler.handlePyramidCell(p4, p7, p6, p5, p2);
+ }
+
+ Vertex centroid(const Vertex& v0, const Vertex& v1, const Vertex& v2, const Vertex& v3, const Vertex& v4, const Vertex& v5, const Vertex& v6)
+ {
+ return affineCombination(7, &v0, 1.0/7.0, &v1, 1.0/7.0, &v2, 1.0/7.0, &v3, 1.0/7.0, &v4, 1.0/7.0, &v5, 1.0/7.0, &v6, 1.0/7.0);
+ }
+
+ template <class StitchCellHandler>
+ inline void generateCellsForDeformedCube1234567(StitchCellHandler& stitchCellHandler, const AMRGridCell& p0, const AMRGridCell& p1, const AMRGridCell& p2, const AMRGridCell& p3, const AMRGridCell& p4, const AMRGridCell& p5, const AMRGridCell& p6, const AMRGridCell& p7)
+ {
+ stitchCellHandler.handleTetrahedronCell(p3, p1, p4, p0);
+ std::cout << "Inserting vertex to avoid illegal tesselation." << std::endl;
+ Vertex newPos = AMRGridStitcherAuxFct::centroid(p1.pos(), p2.pos(), p3.pos(), p4.pos(), p5.pos(), p6.pos(), p7.pos());
+ double newVal = p1.val() + p2.val() + p3.val() + p4.val() + p5.val() + p6.val() + p7.val();
+ newVal /= 7;
+ stitchCellHandler.handleTetrahedronCell(p3, p4, p1, newPos, newVal);
+ stitchCellHandler.handleTetrahedronCell(p4, p3, p7, newPos, newVal);
+ stitchCellHandler.handlePyramidCell(p4, p7, p6, p5, newPos, newVal);
+ stitchCellHandler.handlePyramidCell(p3, p2, p6, p7, newPos, newVal);
+ stitchCellHandler.handleTetrahedronCell(p1, p2, p3, newPos, newVal);
+ stitchCellHandler.handlePyramidCell(p1, p5, p6, p2, newPos, newVal);
+ stitchCellHandler.handleTetrahedronCell(p1, p4, p5, newPos, newVal);
+ }
+}
+
+template <class StitchCellHandler>
+AMRGridStitcher<StitchCellHandler>::AMRGridStitcher(StitchCellHandler& stitchCellHandler, AMRHierarchy& amrHier, AMRGrid *stitchGrid, bool considerNextLevel)
+: mStitchCellHandler(stitchCellHandler), mAMRDataSet(amrHier), mStitchGrid(stitchGrid), mConsiderNextLevel(considerNextLevel), mParentLevel(mAMRDataSet.getLevel(stitchGrid->level-1))
+{
+ assert(mParentLevel != 0);
+ // <ATTENTION> Assume spatialrefinement == gridplacementrefinement </ATTENTION>
+ // <ATTENTION> Assume spatialrefinement % parentLevel->getSpatialRefinemet == 0 </ATTENTION>
+ int refinementWRTParentLevel[3];
+ refinementWRTParentLevel[xAxis] = mStitchGrid->spatialrefinement[xAxis] / mParentLevel->getSpatialRefinement(xAxis);
+ refinementWRTParentLevel[yAxis] = mStitchGrid->spatialrefinement[yAxis] / mParentLevel->getSpatialRefinement(yAxis);
+ refinementWRTParentLevel[zAxis] = mStitchGrid->spatialrefinement[zAxis] / mParentLevel->getSpatialRefinement(zAxis);
+
+ mOriginInParentLevel[xAxis] = mStitchGrid->iorigin[xAxis] / refinementWRTParentLevel[xAxis];
+ mOriginInParentLevel[yAxis] = mStitchGrid->iorigin[yAxis] / refinementWRTParentLevel[yAxis];
+ mOriginInParentLevel[zAxis] = mStitchGrid->iorigin[zAxis] / refinementWRTParentLevel[zAxis];
+ // <ATTENTION> Assume refined grid starts at cell boundaries of parent level </ATTENTION>
+ assume(mStitchGrid->iorigin[xAxis] % refinementWRTParentLevel[xAxis] == 0);
+ assume(mStitchGrid->iorigin[yAxis] % refinementWRTParentLevel[yAxis] == 0);
+ assume(mStitchGrid->iorigin[zAxis] % refinementWRTParentLevel[zAxis] == 0);
+
+ mMaxExtInParentLevel[xAxis] = mOriginInParentLevel[xAxis] + (mStitchGrid->dims[xAxis] / refinementWRTParentLevel[xAxis]) -1;
+ mMaxExtInParentLevel[yAxis] = mOriginInParentLevel[yAxis] + (mStitchGrid->dims[yAxis] / refinementWRTParentLevel[yAxis]) -1;
+ mMaxExtInParentLevel[zAxis] = mOriginInParentLevel[zAxis] + (mStitchGrid->dims[zAxis] / refinementWRTParentLevel[zAxis]) -1;
+ // <ATTENTION> Assume refined grid ends at cell boundaries of parent level </ATTENTION>
+ assume(mStitchGrid->dims[xAxis] % refinementWRTParentLevel[xAxis] == 0);
+ assume(mStitchGrid->dims[yAxis] % refinementWRTParentLevel[yAxis] == 0);
+ assume(mStitchGrid->dims[zAxis] % refinementWRTParentLevel[zAxis] == 0);
+
+ // Load all grids necessary
+ AMRLevel *thisLevel = mAMRDataSet.getLevel(mStitchGrid->level);
+ for (AMRGrid *currGridPtr = thisLevel->getFirstGrid(); currGridPtr != 0; currGridPtr = currGridPtr->getNextGridInLevel())
+ currGridPtr->loadCells();
+
+ for (AMRGrid *currGridPtr = mParentLevel->getFirstGrid(); currGridPtr != 0; currGridPtr = currGridPtr->getNextGridInLevel())
+ currGridPtr->loadCells();
+}
+
+template <class StitchCellHandler>
+AMRGridStitcher<StitchCellHandler>::~AMRGridStitcher()
+{
+}
+
+template<class StitchCellHandler>
+void AMRGridStitcher<StitchCellHandler>::generateStitchCells(bool xyMin, bool xyMax, bool yzMin, bool yzMax, bool xzMin, bool xzMax)
+{
+ if (xyMin) generateCellsForFace(xAxis, yAxis, zAxis, min);
+ if (xzMin) generateCellsForFace(zAxis, xAxis, yAxis, min);
+ if (yzMin) generateCellsForFace(yAxis, zAxis, xAxis, min);
+ if (xyMax) generateCellsForFace(yAxis, xAxis, zAxis, max);
+ if (xzMax) generateCellsForFace(xAxis, zAxis, yAxis, max);
+ if (yzMax) generateCellsForFace(zAxis, yAxis, xAxis, max);
+ if (xyMin || xzMin) generateCellsForEdge(xAxis, yAxis, min, zAxis, min);
+ if (xyMax || xzMin) generateCellsForEdge(xAxis, yAxis, min, zAxis, max);
+ if (xyMin || xzMax) generateCellsForEdge(xAxis, yAxis, max, zAxis, min);
+ if (xyMax || xzMax) generateCellsForEdge(xAxis, yAxis, max, zAxis, max);
+ if (xyMin || yzMin) generateCellsForEdge(yAxis, zAxis, min, xAxis, min);
+ if (xyMin || yzMax) generateCellsForEdge(yAxis, zAxis, min, xAxis, max);
+ if (xyMax || yzMin) generateCellsForEdge(yAxis, zAxis, max, xAxis, min);
+ if (xyMax || yzMax) generateCellsForEdge(yAxis, zAxis, max, xAxis, max);
+ if (xzMin || yzMin) generateCellsForEdge(zAxis, xAxis, min, yAxis, min);
+ if (xzMin || yzMax) generateCellsForEdge(zAxis, xAxis, min, yAxis, max);
+ if (xzMax || yzMin) generateCellsForEdge(zAxis, xAxis, max, yAxis, min);
+ if (xzMax || yzMax) generateCellsForEdge(zAxis, xAxis, max, yAxis, max);
+ generateCellsForVertex(xAxis, yAxis, zAxis, min, min, min);
+ generateCellsForVertex(zAxis, yAxis, xAxis, min, min, max);
+ generateCellsForVertex(xAxis, yAxis, zAxis, max, min, max);
+ generateCellsForVertex(zAxis, yAxis, xAxis, max, min, min);
+ generateCellsForVertex(zAxis, yAxis, xAxis, min, max, min);
+ generateCellsForVertex(xAxis, yAxis, zAxis, max, max, min);
+ generateCellsForVertex(zAxis, yAxis, xAxis, max, max, max);
+ generateCellsForVertex(xAxis, yAxis, zAxis, min, max, max);
+}
+
+template<class StitchCellHandler>
+void AMRGridStitcher<StitchCellHandler>::connectQuadToVertex(const AMRGridCell& qp0, const AMRGridCell& qp1, const AMRGridCell& qp2, const AMRGridCell& qp3, const AMRGridCell& vp, AxisType axis0, AxisType axis1, AxisType axis2, MinMaxType faceType)
+{
+ // If the coarse grid points are from different grids, i.e. the quad results from several
+ // coarse grids rather than a single one, only generate stitch cells if we are stitching
+ // the grid with the smallest index.
+ if (qp0.containingId() < mStitchGrid->index() || qp1.containingId() < mStitchGrid->index() ||
+ qp2.containingId() < mStitchGrid->index() || qp3.containingId() < mStitchGrid->index()) return;
+
+ if (vp.refiningId() != AMRGrid::NoGrid) {
+ if (mStitchGrid->index() <= vp.refiningId()) {
+ // No cell bounadaries are crossed, check only one cell for refinement
+ AMRGrid *otherGrid = mAMRDataSet.getGridByIndex(vp.refiningId());
+ AxisAlignedBox<int> refiningCells = otherGrid->getRefiningCells(vp.grid(), vp.idx(xAxis), vp.idx(yAxis), vp.idx(zAxis));
+ int oIdx00[3];
+ oIdx00[axis0] = refiningCells.min(axis0);
+ oIdx00[axis1] = refiningCells.min(axis1);
+ oIdx00[axis2] = faceType == min ? refiningCells.max(axis2) : refiningCells.min(axis2);
+
+ int oIdx01[3];
+ oIdx01[axis0] = oIdx00[axis0] + 1;
+ oIdx01[axis1] = oIdx00[axis1];
+ oIdx01[axis2] = oIdx00[axis2];
+
+ int oIdx10[3];
+ oIdx10[axis0] = oIdx00[axis0];
+ oIdx10[axis1] = oIdx00[axis1] + 1;
+ oIdx10[axis2] = oIdx00[axis2];
+
+ int oIdx11[3];
+ oIdx11[axis0] = oIdx00[axis0] + 1;
+ oIdx11[axis1] = oIdx00[axis1] + 1;
+ oIdx11[axis2] = oIdx00[axis2];
+
+ AMRGridCell vpRef0(otherGrid, oIdx00);
+ AMRGridCell vpRef1(otherGrid, oIdx10);
+ AMRGridCell vpRef2(otherGrid, oIdx11);
+ AMRGridCell vpRef3(otherGrid, oIdx01);
+
+ if (!mConsiderNextLevel ||
+ vpRef0.refiningId() == AMRGrid::NoGrid &&
+ vpRef1.refiningId() == AMRGrid::NoGrid &&
+ vpRef2.refiningId() == AMRGrid::NoGrid &&
+ vpRef3.refiningId() == AMRGrid::NoGrid)
+ // Only add stitch cell when no stitch cells for next level are generated (i.e.
+ // one of the refining cells is refined itself by an even finer grid)
+ mStitchCellHandler.handleHexahedronCell(qp0, qp1, qp2, qp3, vpRef0, vpRef1, vpRef2, vpRef3);
+ }
+ // else Do nothing!
+ }
+ else {
+ mStitchCellHandler.handlePyramidCell(qp0, qp1, qp2, qp3, vp);
+ }
+}
+
+template<class StitchCellHandler>
+void AMRGridStitcher<StitchCellHandler>::connectQuadToEdge(const AMRGridCell& qp0, const AMRGridCell& qp1, const AMRGridCell& qp2, const AMRGridCell& qp3, const AMRGridCell& ep0, const AMRGridCell& ep1, AxisType axis01, AxisType axis03, AxisType axisPerp0123, MinMaxType qp0Axis01Type, MinMaxType qp0Axis03Type, MinMaxType quadFaceType)
+{
+ // If the coarse grid points are from different grids, i.e. the quad results from several
+ // coarse grids rather than a single one, only generate stitch cells if we are stitching
+ // the grid with the smallest index.
+ if (qp0.containingId() < mStitchGrid->index() || qp1.containingId() < mStitchGrid->index() ||
+ qp2.containingId() < mStitchGrid->index() || qp3.containingId() < mStitchGrid->index()) return;
+
+ int connectCase = 0;
+
+ AMRGridCell *epRef0 = 0;
+ AMRGridCell *epRef1 = 0;
+ if (ep0.refiningId() != AMRGrid::NoGrid) {
+ connectCase |= 1;
+
+ AMRGrid *otherGrid0 = mAMRDataSet.getGridByIndex(ep0.refiningId());
+ AxisAlignedBox<int> refiningCells0 = otherGrid0->getRefiningCells(ep0.grid(), ep0.idx(xAxis), ep0.idx(yAxis), ep0.idx(zAxis));
+
+ int oIdx0[3];
+ oIdx0[axis01] = qp0Axis01Type == min ? refiningCells0.min(axis01) : refiningCells0.max(axis01);
+ oIdx0[axis03] = qp0Axis03Type == min ? refiningCells0.min(axis03) : refiningCells0.max(axis03);
+ oIdx0[axisPerp0123] = quadFaceType == min ? refiningCells0.max(axisPerp0123) : refiningCells0.min(axisPerp0123);
+ epRef0 = new AMRGridCell(otherGrid0, oIdx0);
+
+ int oIdx1[3];
+ oIdx1[axis01] = qp0Axis01Type == max ? refiningCells0.min(axis01) : refiningCells0.max(axis01);
+ oIdx1[axis03] = qp0Axis03Type == min ? refiningCells0.min(axis03) : refiningCells0.max(axis03);
+ oIdx1[axisPerp0123] = quadFaceType == min ? refiningCells0.max(axisPerp0123) : refiningCells0.min(axisPerp0123);
+ epRef1 = new AMRGridCell(otherGrid0, oIdx1);
+ }
+
+ AMRGridCell *epRef2 = 0;
+ AMRGridCell *epRef3 = 0;
+ if (ep1.refiningId() != AMRGrid::NoGrid) {
+ connectCase |= 2;
+
+ AMRGrid *otherGrid1 = mAMRDataSet.getGridByIndex(ep1.refiningId());
+ AxisAlignedBox<int> refiningCells1 = otherGrid1->getRefiningCells(ep1.grid(), ep1.idx(xAxis), ep1.idx(yAxis), ep1.idx(zAxis));
+
+ int oIdx2[3];
+ oIdx2[axis01] = qp0Axis01Type == max ? refiningCells1.min(axis01) : refiningCells1.max(axis01);
+ oIdx2[axis03] = qp0Axis03Type == max ? refiningCells1.min(axis03) : refiningCells1.max(axis03);
+ oIdx2[axisPerp0123] = quadFaceType == min ? refiningCells1.max(axisPerp0123) : refiningCells1.min(axisPerp0123);
+ epRef2 = new AMRGridCell(otherGrid1, oIdx2);
+
+ int oIdx3[3];
+ oIdx3[axis01] = qp0Axis01Type == min ? refiningCells1.min(axis01) : refiningCells1.max(axis01);
+ oIdx3[axis03] = qp0Axis03Type == max ? refiningCells1.min(axis03) : refiningCells1.max(axis03);
+ oIdx3[axisPerp0123] = quadFaceType == min ? refiningCells1.max(axisPerp0123) : refiningCells1.min(axisPerp0123);
+ epRef3 = new AMRGridCell(otherGrid1, oIdx3);
+ }
+
+ switch (connectCase) {
+ case 0:
+ mStitchCellHandler.handleTrianglePrismCell(qp0, qp1, qp2, qp3, ep0, ep1);
+ break;
+ case 1:
+ assert(epRef0->refiningId() == AMRGrid::NoGrid &&
+ epRef1->refiningId() == AMRGrid::NoGrid);
+ if (mStitchGrid->index() <= ep0.refiningId()) {
+ mStitchCellHandler.handlePyramidCell(*epRef0, *epRef1, qp2, qp3, ep1);
+ mStitchCellHandler.handleTrianglePrismCell(qp3, qp0, qp1, qp2, *epRef0, *epRef1);
+ }
+ break;
+ case 2:
+ assert(epRef2->refiningId() == AMRGrid::NoGrid &&
+ epRef3->refiningId() == AMRGrid::NoGrid);
+ if (mStitchGrid->index() <= ep1.refiningId()) {
+ mStitchCellHandler.handlePyramidCell(qp0, qp1, *epRef2, *epRef3, ep0);
+ mStitchCellHandler.handleTrianglePrismCell(qp1, qp2, qp3, qp0, *epRef2, *epRef3);
+ }
+ break;
+ case 3:
+ if (!mConsiderNextLevel ||
+ epRef0->refiningId() == AMRGrid::NoGrid &&
+ epRef1->refiningId() == AMRGrid::NoGrid &&
+ epRef2->refiningId() == AMRGrid::NoGrid &&
+ epRef3->refiningId() == AMRGrid::NoGrid)
+ if (mStitchGrid->index() <= ep0.refiningId() && mStitchGrid->index() <= ep1.refiningId()) {
+ mStitchCellHandler.handleHexahedronCell(qp0, qp1, qp2, qp3, *epRef0, *epRef1, *epRef2, *epRef3);
+ }
+ break;
+ default:
+ assert(false);
+ break;
+ }
+ delete epRef0;
+ delete epRef1;
+ delete epRef2;
+ delete epRef3;
+}
+
+template<class StitchCellHandler>
+void AMRGridStitcher<StitchCellHandler>::connectQuadToQuad(const AMRGridCell& qp0, const AMRGridCell& qp1, const AMRGridCell& qp2, const AMRGridCell& qp3, const AMRGridCell& oqp0, const AMRGridCell& oqp1, const AMRGridCell& oqp2, const AMRGridCell& oqp3, AxisType axis01, AxisType axis03, AxisType axisPerp0123, MinMaxType qp0Axis01Type, MinMaxType qp0Axis03Type, MinMaxType quadFaceType)
+{
+ // If the coarse grid points are from different grids, i.e. the quad results from several
+ // coarse grids rather than a single one, only generate stitch cells if we are stitching
+ // the grid with the smallest index.
+ if (qp0.containingId() < mStitchGrid->index() || qp1.containingId() < mStitchGrid->index() ||
+ qp2.containingId() < mStitchGrid->index() || qp3.containingId() < mStitchGrid->index()) return;
+
+
+ int connectCase = 0;
+
+ AMRGridCell *oqp0Ref = 0;
+ if (oqp0.refiningId() != AMRGrid::NoGrid) {
+ connectCase |= 1;
+ AMRGrid *otherGrid0 = mAMRDataSet.getGridByIndex(oqp0.refiningId());
+ AxisAlignedBox<int> refiningCells0 = otherGrid0->getRefiningCells(oqp0.grid(), oqp0.idx(xAxis), oqp0.idx(yAxis), oqp0.idx(zAxis));
+ int oIdx0[3];
+ oIdx0[axis01] = qp0Axis01Type == max ? refiningCells0.max(axis01) : refiningCells0.min(axis01);
+ oIdx0[axis03] = qp0Axis03Type == max ? refiningCells0.max(axis03) : refiningCells0.min(axis03);
+ oIdx0[axisPerp0123] = quadFaceType == min ? refiningCells0.max(axisPerp0123) : refiningCells0.min(axisPerp0123);
+ oqp0Ref = new AMRGridCell(otherGrid0, oIdx0);
+ }
+
+ AMRGridCell *oqp1Ref = 0;
+ if (oqp1.refiningId() != AMRGrid::NoGrid) {
+ connectCase |= 2;
+ AMRGrid *otherGrid1 = mAMRDataSet.getGridByIndex(oqp1.refiningId());
+ AxisAlignedBox<int> refiningCells1 = otherGrid1->getRefiningCells(oqp1.grid(), oqp1.idx(xAxis), oqp1.idx(yAxis), oqp1.idx(zAxis));
+ int oIdx1[3];
+ oIdx1[axis01] = qp0Axis01Type == max ? refiningCells1.min(axis01) : refiningCells1.max(axis01);
+ oIdx1[axis03] = qp0Axis03Type == max ? refiningCells1.max(axis03) : refiningCells1.min(axis03);
+ oIdx1[axisPerp0123] = quadFaceType == min ? refiningCells1.max(axisPerp0123) : refiningCells1.min(axisPerp0123);
+ oqp1Ref = new AMRGridCell(otherGrid1, oIdx1);
+ }
+
+ AMRGridCell *oqp2Ref = 0;
+ if (oqp2.refiningId() != AMRGrid::NoGrid) {
+ connectCase |= 4;
+ AMRGrid *otherGrid2 = mAMRDataSet.getGridByIndex(oqp2.refiningId());
+ AxisAlignedBox<int> refiningCells2 = otherGrid2->getRefiningCells(oqp2.grid(), oqp2.idx(xAxis), oqp2.idx(yAxis), oqp2.idx(zAxis));
+ int oIdx2[3];
+ oIdx2[axis01] = qp0Axis01Type == max ? refiningCells2.min(axis01) : refiningCells2.max(axis01);
+ oIdx2[axis03] = qp0Axis03Type == max ? refiningCells2.min(axis03) : refiningCells2.max(axis03);
+ oIdx2[axisPerp0123] = quadFaceType == min ? refiningCells2.max(axisPerp0123) : refiningCells2.min(axisPerp0123);
+ oqp2Ref = new AMRGridCell(otherGrid2, oIdx2);
+ }
+
+ AMRGridCell *oqp3Ref = 0;
+ if (oqp3.refiningId() != AMRGrid::NoGrid) {
+ connectCase |= 8;
+ AMRGrid *otherGrid3 = mAMRDataSet.getGridByIndex(oqp3.refiningId());
+ AxisAlignedBox<int> refiningCells3 = otherGrid3->getRefiningCells(oqp3.grid(), oqp3.idx(xAxis), oqp3.idx(yAxis), oqp3.idx(zAxis));
+ int oIdx3[3];
+ oIdx3[axis01] = qp0Axis01Type == max ? refiningCells3.max(axis01) : refiningCells3.min(axis01);
+ oIdx3[axis03] = qp0Axis03Type == max ? refiningCells3.min(axis03) : refiningCells3.max(axis03);
+ oIdx3[axisPerp0123] = quadFaceType == min ? refiningCells3.max(axisPerp0123) : refiningCells3.min(axisPerp0123);
+ oqp3Ref = new AMRGridCell(otherGrid3, oIdx3);
+ }
+
+ switch (connectCase) {
+ case 0:
+ mStitchCellHandler.handleHexahedronCell(qp0, qp1, qp2, qp3, oqp0, oqp1, oqp2, oqp3);
+ break;
+ case 1:
+ assert(oqp0Ref->refiningId() == AMRGrid::NoGrid);
+ if (mStitchGrid->index() <= oqp0.refiningId()) {
+ mStitchCellHandler.handlePyramidCell(qp0, qp1, qp2, qp3, *oqp0Ref);
+ mStitchCellHandler.handlePyramidCell(qp3, qp2, oqp2, oqp3, *oqp0Ref);
+ mStitchCellHandler.handlePyramidCell(qp2, qp1, oqp1, oqp2, *oqp0Ref);
+ }
+ break;
+ case 2:
+ assert(oqp1Ref->refiningId() == AMRGrid::NoGrid);
+ if (mStitchGrid->index() <= oqp1.refiningId()) {
+ mStitchCellHandler.handlePyramidCell(qp0, qp1, qp2, qp3, *oqp1Ref);
+ mStitchCellHandler.handlePyramidCell(qp0, qp3, oqp3, oqp0, *oqp1Ref);
+ mStitchCellHandler.handlePyramidCell(qp3, qp2, oqp2, oqp3, *oqp1Ref);
+ }
+ break;
+ case 3:
+ assert(oqp0Ref->refiningId() == AMRGrid::NoGrid);
+ assert(oqp1Ref->refiningId() == AMRGrid::NoGrid);
+ if (mStitchGrid->index() <= oqp0.refiningId() && mStitchGrid->index() <= oqp1.refiningId()) {
+ mStitchCellHandler.handleTrianglePrismCell(qp1, qp2, qp3, qp0, *oqp1Ref, *oqp0Ref);
+ mStitchCellHandler.handleTrianglePrismCell(qp2, oqp2, oqp3, qp3,*oqp1Ref, *oqp0Ref);
+ }
+ break;
+ case 4:
+ assert(oqp2Ref->refiningId() == AMRGrid::NoGrid);
+ if (mStitchGrid->index() <= oqp2.refiningId()) {
+ mStitchCellHandler.handlePyramidCell(qp0, qp1, qp2, qp3, *oqp2Ref);
+ mStitchCellHandler.handlePyramidCell(qp1, qp0, oqp0, oqp1, *oqp2Ref);
+ mStitchCellHandler.handlePyramidCell(qp0, qp3, oqp3, oqp0, *oqp2Ref);
+ }
+ break;
+ case 5:
+ assert(oqp0Ref->refiningId() == AMRGrid::NoGrid);
+ assert(oqp2Ref->refiningId() == AMRGrid::NoGrid);
+ if (mStitchGrid->index() <= oqp0.refiningId() && mStitchGrid->index() <= oqp2.refiningId()) {
+ AMRGridStitcherAuxFct::generateCellsForDeformedCube024567(mStitchCellHandler, *oqp0Ref, oqp3, *oqp2Ref, oqp1, qp0, qp3, qp2, qp1);
+ }
+ break;
+ case 6:
+ assert(oqp1Ref->refiningId() == AMRGrid::NoGrid);
+ assert(oqp2Ref->refiningId() == AMRGrid::NoGrid);
+ if (mStitchGrid->index() <= oqp1.refiningId() && mStitchGrid->index() <= oqp2.refiningId()) {
+ mStitchCellHandler.handleTrianglePrismCell(qp0, qp1, qp2, qp3, *oqp1Ref, *oqp2Ref);
+ mStitchCellHandler.handleTrianglePrismCell(oqp0, qp0, qp3, oqp3, *oqp1Ref, *oqp2Ref);
+ }
+ break;
+ case 7:
+ assert(oqp0Ref->refiningId() == AMRGrid::NoGrid);
+ assert(oqp1Ref->refiningId() == AMRGrid::NoGrid);
+ assert(oqp2Ref->refiningId() == AMRGrid::NoGrid);
+ if (mStitchGrid->index() <= oqp2.refiningId() && mStitchGrid->index() <= oqp1.refiningId() && mStitchGrid->index() <= oqp0.refiningId()) {
+ AMRGridStitcherAuxFct::generateCellsForDeformedCube1234567(mStitchCellHandler, oqp3, *oqp2Ref, *oqp1Ref, *oqp0Ref, qp3, qp2, qp1, qp0);
+ }
+ break;
+ case 8:
+ assert(oqp3Ref->refiningId() == AMRGrid::NoGrid);
+ if (mStitchGrid->index() <= oqp3.refiningId()) {
+ mStitchCellHandler.handlePyramidCell(qp0, qp1, qp2, qp3, *oqp3Ref);
+ mStitchCellHandler.handlePyramidCell(qp1, qp0, oqp0, oqp1, *oqp3Ref);
+ mStitchCellHandler.handlePyramidCell(qp2, qp1, oqp1, oqp2, *oqp3Ref);
+ }
+ break;
+ case 9:
+ assert(oqp0Ref->refiningId() == AMRGrid::NoGrid);
+ assert(oqp3Ref->refiningId() == AMRGrid::NoGrid);
+ if (mStitchGrid->index() <= oqp0.refiningId() && mStitchGrid->index() <= oqp3.refiningId()) {
+ mStitchCellHandler.handleTrianglePrismCell(qp0, qp1, qp2, qp3, *oqp0Ref, *oqp3Ref);
+ mStitchCellHandler.handleTrianglePrismCell(qp1, oqp1, oqp2, qp2, *oqp0Ref, *oqp3Ref);
+ }
+ break;
+ case 10:
+ assert(oqp1Ref->refiningId() == AMRGrid::NoGrid);
+ assert(oqp3Ref->refiningId() == AMRGrid::NoGrid);
+ if (mStitchGrid->index() <= oqp1.refiningId() && mStitchGrid->index() <= oqp3.refiningId()) {
+ AMRGridStitcherAuxFct::generateCellsForDeformedCube024567(mStitchCellHandler, *oqp1Ref, oqp0, *oqp3Ref, oqp2, qp1, qp0, qp3, qp2);
+ }
+ break;
+ case 11:
+ assert(oqp0Ref->refiningId() == AMRGrid::NoGrid);
+ assert(oqp1Ref->refiningId() == AMRGrid::NoGrid);
+ assert(oqp3Ref->refiningId() == AMRGrid::NoGrid);
+ if (mStitchGrid->index() <= oqp3.refiningId() && mStitchGrid->index() <= oqp1.refiningId() && mStitchGrid->index() <= oqp0.refiningId()) {
+ AMRGridStitcherAuxFct::generateCellsForDeformedCube1234567(mStitchCellHandler, oqp2, *oqp1Ref, *oqp0Ref, *oqp3Ref, qp2, qp1, qp0, qp3);
+ }
+ break;
+ case 12:
+ assert(oqp2Ref->refiningId() == AMRGrid::NoGrid);
+ assert(oqp3Ref->refiningId() == AMRGrid::NoGrid);
+ if (mStitchGrid->index() <= oqp2.refiningId() && mStitchGrid->index() <= oqp3.refiningId()) {
+ mStitchCellHandler.handleTrianglePrismCell(qp1, qp2, qp3, qp0, *oqp2Ref, *oqp3Ref);
+ mStitchCellHandler.handleTrianglePrismCell(oqp1, qp1, qp0, oqp0, *oqp2Ref, *oqp3Ref);
+ }
+ break;
+ case 13:
+ assert(oqp0Ref->refiningId() == AMRGrid::NoGrid);
+ assert(oqp2Ref->refiningId() == AMRGrid::NoGrid);
+ assert(oqp3Ref->refiningId() == AMRGrid::NoGrid);
+ if (mStitchGrid->index() <= oqp3.refiningId() && mStitchGrid->index() <= oqp2.refiningId() && mStitchGrid->index() <= oqp0.refiningId()) {
+ AMRGridStitcherAuxFct::generateCellsForDeformedCube1234567(mStitchCellHandler, oqp1, *oqp0Ref, *oqp3Ref, *oqp2Ref, qp1, qp0, qp3, qp2);
+ }
+ break;
+ case 14:
+ assert(oqp1Ref->refiningId() == AMRGrid::NoGrid);
+ assert(oqp2Ref->refiningId() == AMRGrid::NoGrid);
+ assert(oqp3Ref->refiningId() == AMRGrid::NoGrid);
+ if (mStitchGrid->index() <= oqp3.refiningId() && mStitchGrid->index() <= oqp2.refiningId() && mStitchGrid->index() <= oqp1.refiningId()) {
+ AMRGridStitcherAuxFct::generateCellsForDeformedCube1234567(mStitchCellHandler, oqp0, *oqp3Ref, *oqp2Ref, *oqp1Ref, qp0, qp3, qp2, qp1);
+ }
+ break;
+ case 15:
+ if (!mConsiderNextLevel ||
+ oqp0Ref->refiningId() == AMRGrid::NoGrid &&
+ oqp1Ref->refiningId() == AMRGrid::NoGrid &&
+ oqp2Ref->refiningId() == AMRGrid::NoGrid &&
+ oqp3Ref->refiningId() == AMRGrid::NoGrid)
+ if (mStitchGrid->index() <= oqp0.refiningId() && mStitchGrid->index() <= oqp1.refiningId() && mStitchGrid->index() <= oqp2.refiningId() && mStitchGrid->index() <= oqp3.refiningId()) {
+ mStitchCellHandler.handleHexahedronCell(qp0, qp1, qp2, qp3, *oqp0Ref, *oqp1Ref, *oqp2Ref, *oqp3Ref);
+ }
+ break;
+ default:
+ assert(false);
+ }
+}
+
+template<class StitchCellHandler>
+void AMRGridStitcher<StitchCellHandler>::connectEdgeSegmentToEdges(const AMRGridCell& ep0, const AMRGridCell& ep1, const AMRGridCell& cp0, const AMRGridCell& cp1, const AMRGridCell& cp2, AxisType edgeAxis, AxisType edgeAxis01, MinMaxType edgeAxis01Type, AxisType edgeAxis02, MinMaxType edgeAxis02Type)
+{
+ if (ep0.containingId() < mStitchGrid->index() || ep1.containingId() < mStitchGrid->index()) return;
+
+ if (cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() == AMRGrid::NoGrid && cp0.refiningId() == AMRGrid::NoGrid) {
+ mStitchCellHandler.handleTetrahedronCell(ep0, ep1, cp0, cp1);
+ mStitchCellHandler.handleTetrahedronCell(ep0, cp0, ep1, cp2);
+ }
+ else if (cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() == AMRGrid::NoGrid && cp0.refiningId() != AMRGrid::NoGrid) {
+ if (mStitchGrid->index() <= cp0.refiningId()) {
+ AMRGrid *cp0RefiningGrid = mAMRDataSet.getGridByIndex(cp0.refiningId());
+ AxisAlignedBox<int> cp0RefiningCells = cp0RefiningGrid->getRefiningCells(cp0.grid(), cp0.idx(xAxis), cp0.idx(yAxis), cp0.idx(zAxis));
+ int cp0Ref0Idx[3];
+ cp0Ref0Idx[edgeAxis] = cp0RefiningCells.min(edgeAxis);
+ cp0Ref0Idx[edgeAxis01] = edgeAxis01Type == min ? cp0RefiningCells.max(edgeAxis01) : cp0RefiningCells.min(edgeAxis01);
+ cp0Ref0Idx[edgeAxis02] = edgeAxis02Type == min ? cp0RefiningCells.max(edgeAxis01) : cp0RefiningCells.min(edgeAxis01);
+ AMRGridCell cp0Ref0(cp0RefiningGrid, cp0Ref0Idx[0], cp0Ref0Idx[1], cp0Ref0Idx[2]);
+ int cp0Ref1Idx[3];
+ cp0Ref1Idx[edgeAxis] = cp0RefiningCells.max(edgeAxis);
+ cp0Ref1Idx[edgeAxis01] = cp0Ref0Idx[edgeAxis01];
+ cp0Ref1Idx[edgeAxis02] = cp0Ref0Idx[edgeAxis02];
+ AMRGridCell cp0Ref1(cp0RefiningGrid, cp0Ref1Idx[0], cp0Ref1Idx[1], cp0Ref1Idx[2]);
+ mStitchCellHandler.handlePyramidCell(ep0, ep1, cp0Ref1, cp0Ref0, cp1);
+ mStitchCellHandler.handlePyramidCell(ep0, cp0Ref0, cp0Ref1, ep1, cp2);
+ }
+ }
+ else if (cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() != AMRGrid::NoGrid) {
+ AMRGrid *cp1RefiningGrid = mAMRDataSet.getGridByIndex(cp1.refiningId());
+ AxisAlignedBox<int> cp1RefiningCells = cp1RefiningGrid->getRefiningCells(cp1.grid(), cp1.idx(xAxis), cp1.idx(yAxis), cp1.idx(zAxis));
+ int cp1Ref0Idx[3];
+ cp1Ref0Idx[edgeAxis] = cp1RefiningCells.min(edgeAxis);
+ cp1Ref0Idx[edgeAxis01] = edgeAxis01Type == min ? cp1RefiningCells.min(edgeAxis01) : cp1RefiningCells.max(edgeAxis01);
+ cp1Ref0Idx[edgeAxis02] = edgeAxis02Type == min ? cp1RefiningCells.max(edgeAxis02) : cp1RefiningCells.min(edgeAxis02);
+ AMRGridCell cp1Ref0(cp1RefiningGrid, cp1Ref0Idx[0], cp1Ref0Idx[1], cp1Ref0Idx[2]);
+ int cp1Ref1Idx[3];
+ cp1Ref1Idx[edgeAxis] = cp1RefiningCells.max(edgeAxis);
+ cp1Ref1Idx[edgeAxis01] = cp1Ref0Idx[edgeAxis01];
+ cp1Ref1Idx[edgeAxis02] = cp1Ref0Idx[edgeAxis02];
+ AMRGridCell cp1Ref1(cp1RefiningGrid, cp1Ref1Idx[0], cp1Ref1Idx[1], cp1Ref1Idx[2]);
+ connectQuadToEdge(cp1Ref0, cp1Ref1, ep1, ep0, cp0, cp2, edgeAxis, edgeAxis02, edgeAxis01, min, edgeAxis02Type == min ? max : min, edgeAxis01Type);
+ }
+ else {
+ assert(cp2.refiningId() != AMRGrid::NoGrid);
+ AMRGrid *cp2RefiningGrid = mAMRDataSet.getGridByIndex(cp2.refiningId());
+ AxisAlignedBox<int> cp2RefiningCells = cp2RefiningGrid->getRefiningCells(cp2.grid(), cp2.idx(xAxis), cp2.idx(yAxis), cp2.idx(zAxis));
+ int cp2Ref0Idx[3];
+ cp2Ref0Idx[edgeAxis] = cp2RefiningCells.min(edgeAxis);
+ cp2Ref0Idx[edgeAxis01] = edgeAxis01Type == min ? cp2RefiningCells.max(edgeAxis01) : cp2RefiningCells.min(edgeAxis01);
+ cp2Ref0Idx[edgeAxis02] = edgeAxis02Type == min ? cp2RefiningCells.min(edgeAxis02) : cp2RefiningCells.max(edgeAxis02);
+ AMRGridCell cp2Ref0(cp2RefiningGrid, cp2Ref0Idx[0], cp2Ref0Idx[1], cp2Ref0Idx[2]);
+ int cp2Ref1Idx[3];
+ cp2Ref1Idx[edgeAxis] = cp2RefiningCells.max(edgeAxis);
+ cp2Ref1Idx[edgeAxis01] = cp2Ref0Idx[edgeAxis01];
+ cp2Ref1Idx[edgeAxis02] = cp2Ref0Idx[edgeAxis02];
+ AMRGridCell cp2Ref1(cp2RefiningGrid, cp2Ref1Idx[0], cp2Ref1Idx[1], cp2Ref1Idx[2]);
+ connectQuadToEdge(cp2Ref1, cp2Ref0, ep0, ep1, cp0, cp1, edgeAxis, edgeAxis01, edgeAxis02, max, edgeAxis01Type == min ? max : min, edgeAxis02Type);
+ }
+}
+
+template<class StitchCellHandler>
+void AMRGridStitcher<StitchCellHandler>::connectEdgeSegmentToQuads(const AMRGridCell& ep0, const AMRGridCell& ep1, const AMRGridCell& cp0, const AMRGridCell& cp1, const AMRGridCell& cp2, const AMRGridCell& cp3, const AMRGridCell& cp4, const AMRGridCell& cp5, AxisType edgeAxis, AxisType addAxis0132, MinMaxType edgeAxis0132Type, AxisType addAxis0451, MinMaxType edgeAxis0451Type)
+{
+ if (cp5.refiningId() == AMRGrid::NoGrid && cp4.refiningId() == AMRGrid::NoGrid && cp3.refiningId() == AMRGrid::NoGrid && cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() == AMRGrid::NoGrid && cp0.refiningId() == AMRGrid::NoGrid) {
+ // Case 0
+ mStitchCellHandler.handleTrianglePrismCell(cp2, cp0, cp1, cp3, ep0, ep1);
+ mStitchCellHandler.handleTrianglePrismCell(cp0, cp4, cp5, cp1, ep0, ep1);
+ }
+ else if (cp5.refiningId() == AMRGrid::NoGrid && cp4.refiningId() == AMRGrid::NoGrid && cp3.refiningId() == AMRGrid::NoGrid && cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() == AMRGrid::NoGrid && cp0.refiningId() != AMRGrid::NoGrid) {
+ // Case 1
+ if (mStitchGrid->index() <= cp0.refiningId()) {
+ AMRGrid *cp0RefiningGrid = mAMRDataSet.getGridByIndex(cp0.refiningId());
+ AxisAlignedBox<int> cp0RefiningCells = cp0RefiningGrid->getRefiningCells(cp0.grid(), cp0.idx(xAxis), cp0.idx(yAxis), cp0.idx(zAxis));
+ int cp0RefIdx[3];
+ cp0RefIdx[edgeAxis] = cp0RefiningCells.max(edgeAxis);
+ cp0RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp0RefiningCells.max(addAxis0132) : cp0RefiningCells.min(addAxis0132);
+ cp0RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp0RefiningCells.max(addAxis0451) : cp0RefiningCells.min(addAxis0451);
+ AMRGridCell cp0Ref(cp0RefiningGrid, cp0RefIdx);
+ AMRGridStitcherAuxFct::generateCellsForDeformedTrianglePrism145(mStitchCellHandler, cp2, cp0Ref, cp1, cp3, ep0, ep1);
+ AMRGridStitcherAuxFct::generateCellsForDeformedTrianglePrism045(mStitchCellHandler, cp0Ref, cp4, cp5, cp1, ep0, ep1);
+ }
+ }
+ else if (cp5.refiningId() == AMRGrid::NoGrid && cp4.refiningId() == AMRGrid::NoGrid && cp3.refiningId() == AMRGrid::NoGrid && cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() != AMRGrid::NoGrid && cp0.refiningId() == AMRGrid::NoGrid) {
+ // Case 2
+ if (mStitchGrid->index() <= cp1.refiningId()) {
+ AMRGrid *cp1RefiningGrid = mAMRDataSet.getGridByIndex(cp1.refiningId());
+ AxisAlignedBox<int> cp1RefiningCells = cp1RefiningGrid->getRefiningCells(cp1.grid(), cp1.idx(xAxis), cp1.idx(yAxis), cp1.idx(zAxis));
+ int cp1RefIdx[3];
+ cp1RefIdx[edgeAxis] = cp1RefiningCells.min(edgeAxis);
+ cp1RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp1RefiningCells.max(addAxis0132) : cp1RefiningCells.min(addAxis0132);
+ cp1RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp1RefiningCells.max(addAxis0451) : cp1RefiningCells.min(addAxis0451);
+ AMRGridCell cp1Ref(cp1RefiningGrid, cp1RefIdx);
+ AMRGridStitcherAuxFct::generateCellsForDeformedTrianglePrism245(mStitchCellHandler, cp2, cp0, cp1Ref, cp3, ep0, ep1);
+ AMRGridStitcherAuxFct::generateCellsForDeformedTrianglePrism345(mStitchCellHandler, cp0, cp4, cp5, cp1Ref, ep0, ep1);
+ }
+ }
+ else if (cp5.refiningId() == AMRGrid::NoGrid && cp4.refiningId() == AMRGrid::NoGrid && cp3.refiningId() == AMRGrid::NoGrid && cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() != AMRGrid::NoGrid && cp0.refiningId() != AMRGrid::NoGrid) {
+ // Case 3
+ if (mStitchGrid->index() <= cp1.refiningId() && mStitchGrid->index() <= cp0.refiningId()) {
+ AMRGrid *cp0RefiningGrid = mAMRDataSet.getGridByIndex(cp0.refiningId());
+ AxisAlignedBox<int> cp0RefiningCells = cp0RefiningGrid->getRefiningCells(cp0.grid(), cp0.idx(xAxis), cp0.idx(yAxis), cp0.idx(zAxis));
+ int cp0RefIdx[3];
+ cp0RefIdx[edgeAxis] = cp0RefiningCells.max(edgeAxis);
+ cp0RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp0RefiningCells.max(addAxis0132) : cp0RefiningCells.min(addAxis0132);
+ cp0RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp0RefiningCells.max(addAxis0451) : cp0RefiningCells.min(addAxis0451);
+ AMRGridCell cp0Ref(cp0RefiningGrid, cp0RefIdx);
+ AMRGrid *cp1RefiningGrid = mAMRDataSet.getGridByIndex(cp1.refiningId());
+ AxisAlignedBox<int> cp1RefiningCells = cp1RefiningGrid->getRefiningCells(cp1.grid(), cp1.idx(xAxis), cp1.idx(yAxis), cp1.idx(zAxis));
+ int cp1RefIdx[3];
+ cp1RefIdx[edgeAxis] = cp1RefiningCells.min(edgeAxis);
+ cp1RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp1RefiningCells.max(addAxis0132) : cp1RefiningCells.min(addAxis0132);
+ cp1RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp1RefiningCells.max(addAxis0451) : cp1RefiningCells.min(addAxis0451);
+ AMRGridCell cp1Ref(cp1RefiningGrid, cp1RefIdx);
+ mStitchCellHandler.handleTrianglePrismCell(cp0Ref, ep0, ep1, cp1Ref, cp2, cp3);
+ mStitchCellHandler.handleTrianglePrismCell(ep0, cp0Ref, cp1Ref, ep1, cp4, cp5);
+ }
+ }
+ else if (cp5.refiningId() == AMRGrid::NoGrid && cp4.refiningId() == AMRGrid::NoGrid && cp3.refiningId() == AMRGrid::NoGrid && cp2.refiningId() != AMRGrid::NoGrid && cp1.refiningId() == AMRGrid::NoGrid && cp0.refiningId() == AMRGrid::NoGrid) {
+ // Case 4
+ if (mStitchGrid->index() <= cp2.refiningId()) {
+ AMRGrid *cp2RefiningGrid = mAMRDataSet.getGridByIndex(cp2.refiningId());
+ AxisAlignedBox<int> cp2RefiningCells = cp2RefiningGrid->getRefiningCells(cp2.grid(), cp2.idx(xAxis), cp2.idx(yAxis), cp2.idx(zAxis));
+ int cp2RefIdx[3];
+ cp2RefIdx[edgeAxis] = cp2RefiningCells.max(edgeAxis);
+ cp2RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp2RefiningCells.min(addAxis0132) : cp2RefiningCells.max(addAxis0132);
+ cp2RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp2RefiningCells.max(addAxis0451) : cp2RefiningCells.min(addAxis0451);
+ AMRGridCell cp2Ref(cp2RefiningGrid, cp2RefIdx);
+ mStitchCellHandler.handleTetrahedronCell(ep1, cp1, cp2Ref, cp3);
+ std::cout << "Inserting vertex to avoid illegal tesselation (Case 4)." << std::endl;
+ Vertex newPos = AMRGridStitcherAuxFct::centroid(ep0.pos(), ep1.pos(), cp0.pos(), cp1.pos(), cp2Ref.pos(), cp4.pos(), cp5.pos());
+ double newVal = ep0.val() + ep1.val() + cp0.val() + cp1.val() + cp2Ref.val() + cp4.val() + cp5.val();
+ newVal /= 7;
+ mStitchCellHandler.handlePyramidCell(ep0, cp4, cp0, cp2Ref, newPos, newVal);
+ mStitchCellHandler.handlePyramidCell(ep0, ep1, cp5, cp4, newPos, newVal);
+ mStitchCellHandler.handlePyramidCell(cp0, cp4, cp5, cp1, newPos, newVal);
+ mStitchCellHandler.handleTetrahedronCell(ep1, cp1, cp5, newPos, newVal);
+ mStitchCellHandler.handleTetrahedronCell(ep1, cp2Ref, cp1, newPos, newVal);
+ mStitchCellHandler.handleTetrahedronCell(cp0, cp1, cp2Ref, newPos, newVal);
+ mStitchCellHandler.handleTetrahedronCell(ep0, cp2Ref, ep1, newPos, newVal);
+ }
+ }
+ else if (cp5.refiningId() == AMRGrid::NoGrid && cp4.refiningId() == AMRGrid::NoGrid && cp3.refiningId() == AMRGrid::NoGrid && cp2.refiningId() != AMRGrid::NoGrid && cp1.refiningId() == AMRGrid::NoGrid && cp0.refiningId() != AMRGrid::NoGrid) {
+ // Case 5
+ if (mStitchGrid->index() <= cp2.refiningId() && mStitchGrid->index() <= cp0.refiningId()) {
+ AMRGrid *cp0RefiningGrid = mAMRDataSet.getGridByIndex(cp0.refiningId());
+ AxisAlignedBox<int> cp0RefiningCells = cp0RefiningGrid->getRefiningCells(cp0.grid(), cp0.idx(xAxis), cp0.idx(yAxis), cp0.idx(zAxis));
+ int cp0RefIdx[3];
+ cp0RefIdx[edgeAxis] = cp0RefiningCells.max(edgeAxis);
+ cp0RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp0RefiningCells.max(addAxis0132) : cp0RefiningCells.min(addAxis0132);
+ cp0RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp0RefiningCells.max(addAxis0451) : cp0RefiningCells.min(addAxis0451);
+ AMRGridCell cp0Ref(cp0RefiningGrid, cp0RefIdx);
+ AMRGrid *cp2RefiningGrid = mAMRDataSet.getGridByIndex(cp2.refiningId());
+ AxisAlignedBox<int> cp2RefiningCells = cp2RefiningGrid->getRefiningCells(cp2.grid(), cp2.idx(xAxis), cp2.idx(yAxis), cp2.idx(zAxis));
+ int cp2RefIdx[3];
+ cp2RefIdx[edgeAxis] = cp2RefiningCells.max(edgeAxis);
+ cp2RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp2RefiningCells.min(addAxis0132) : cp2RefiningCells.max(addAxis0132);
+ cp2RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp2RefiningCells.max(addAxis0451) : cp2RefiningCells.min(addAxis0451);
+ AMRGridCell cp2Ref(cp2RefiningGrid, cp2RefIdx);
+ AMRGridStitcherAuxFct::generateCellsForDeformedTrianglePrism0145(mStitchCellHandler, cp2Ref, cp0Ref, cp1, cp3, ep0, ep1);
+ AMRGridStitcherAuxFct::generateCellsForDeformedTrianglePrism045(mStitchCellHandler, cp0Ref, cp4, cp5, cp1, ep0, ep1);
+ }
+ }
+ else if (cp5.refiningId() == AMRGrid::NoGrid && cp4.refiningId() == AMRGrid::NoGrid && cp3.refiningId() == AMRGrid::NoGrid && cp2.refiningId() != AMRGrid::NoGrid && cp1.refiningId() != AMRGrid::NoGrid && cp0.refiningId() == AMRGrid::NoGrid) {
+ // Case 6
+ if (mStitchGrid->index() <= cp2.refiningId() && mStitchGrid->index() <= cp1.refiningId()) {
+ AMRGrid *cp1RefiningGrid = mAMRDataSet.getGridByIndex(cp1.refiningId());
+ AxisAlignedBox<int> cp1RefiningCells = cp1RefiningGrid->getRefiningCells(cp1.grid(), cp1.idx(xAxis), cp1.idx(yAxis), cp1.idx(zAxis));
+ int cp1RefIdx[3];
+ cp1RefIdx[edgeAxis] = cp1RefiningCells.min(edgeAxis);
+ cp1RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp1RefiningCells.max(addAxis0132) : cp1RefiningCells.min(addAxis0132);
+ cp1RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp1RefiningCells.max(addAxis0451) : cp1RefiningCells.min(addAxis0451);
+ AMRGridCell cp1Ref(cp1RefiningGrid, cp1RefIdx);
+ AMRGrid *cp2RefiningGrid = mAMRDataSet.getGridByIndex(cp2.refiningId());
+ AxisAlignedBox<int> cp2RefiningCells = cp2RefiningGrid->getRefiningCells(cp2.grid(), cp2.idx(xAxis), cp2.idx(yAxis), cp2.idx(zAxis));
+ int cp2RefIdx[3];
+ cp2RefIdx[edgeAxis] = cp2RefiningCells.max(edgeAxis);
+ cp2RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp2RefiningCells.min(addAxis0132) : cp2RefiningCells.max(addAxis0132);
+ cp2RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp2RefiningCells.max(addAxis0451) : cp2RefiningCells.min(addAxis0451);
+ AMRGridCell cp2Ref(cp2RefiningGrid, cp2RefIdx);
+ mStitchCellHandler.handlePyramidCell(ep0, cp4, cp0, cp2Ref, cp1Ref);
+ mStitchCellHandler.handlePyramidCell(ep0, ep1, cp5, cp4, cp1Ref);
+ AMRGridStitcherAuxFct::generateCellsForDeformedPyramid1234(mStitchCellHandler, cp3, ep1, ep0, cp2Ref, cp1Ref);
+ }
+ }
+ else if (cp5.refiningId() == AMRGrid::NoGrid && cp4.refiningId() == AMRGrid::NoGrid && cp3.refiningId() == AMRGrid::NoGrid && cp2.refiningId() != AMRGrid::NoGrid && cp1.refiningId() != AMRGrid::NoGrid && cp0.refiningId() != AMRGrid::NoGrid) {
+ // Case 7
+ if (mStitchGrid->index() <= cp2.refiningId() && mStitchGrid->index() <= cp1.refiningId() && mStitchGrid->index() <= cp0.refiningId()) {
+ AMRGrid *cp0RefiningGrid = mAMRDataSet.getGridByIndex(cp0.refiningId());
+ AxisAlignedBox<int> cp0RefiningCells = cp0RefiningGrid->getRefiningCells(cp0.grid(), cp0.idx(xAxis), cp0.idx(yAxis), cp0.idx(zAxis));
+ int cp0RefIdx[3];
+ cp0RefIdx[edgeAxis] = cp0RefiningCells.max(edgeAxis);
+ cp0RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp0RefiningCells.max(addAxis0132) : cp0RefiningCells.min(addAxis0132);
+ cp0RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp0RefiningCells.max(addAxis0451) : cp0RefiningCells.min(addAxis0451);
+ AMRGridCell cp0Ref(cp0RefiningGrid, cp0RefIdx);
+ AMRGrid *cp1RefiningGrid = mAMRDataSet.getGridByIndex(cp1.refiningId());
+ AxisAlignedBox<int> cp1RefiningCells = cp1RefiningGrid->getRefiningCells(cp1.grid(), cp1.idx(xAxis), cp1.idx(yAxis), cp1.idx(zAxis));
+ int cp1RefIdx[3];
+ cp1RefIdx[edgeAxis] = cp1RefiningCells.min(edgeAxis);
+ cp1RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp1RefiningCells.max(addAxis0132) : cp1RefiningCells.min(addAxis0132);
+ cp1RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp1RefiningCells.max(addAxis0451) : cp1RefiningCells.min(addAxis0451);
+ AMRGridCell cp1Ref(cp1RefiningGrid, cp1RefIdx);
+ AMRGrid *cp2RefiningGrid = mAMRDataSet.getGridByIndex(cp2.refiningId());
+ AxisAlignedBox<int> cp2RefiningCells = cp2RefiningGrid->getRefiningCells(cp2.grid(), cp2.idx(xAxis), cp2.idx(yAxis), cp2.idx(zAxis));
+ int cp2RefIdx[3];
+ cp2RefIdx[edgeAxis] = cp2RefiningCells.max(edgeAxis);
+ cp2RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp2RefiningCells.min(addAxis0132) : cp2RefiningCells.max(addAxis0132);
+ cp2RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp2RefiningCells.max(addAxis0451) : cp2RefiningCells.min(addAxis0451);
+ AMRGridCell cp2Ref(cp2RefiningGrid, cp2RefIdx);
+ AMRGridStitcherAuxFct::generateCellsForDeformedTrianglePrism01245(mStitchCellHandler, cp2Ref, cp0Ref, cp1Ref, cp3, ep0, ep1);
+ mStitchCellHandler.handleTrianglePrismCell(cp0Ref, cp4, cp5, cp1Ref, ep0, ep1);
+ }
+ }
+ else if (cp5.refiningId() == AMRGrid::NoGrid && cp4.refiningId() == AMRGrid::NoGrid && cp3.refiningId() != AMRGrid::NoGrid && cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() == AMRGrid::NoGrid && cp0.refiningId() == AMRGrid::NoGrid) {
+ // Case 8
+ if (mStitchGrid->index() <= cp3.refiningId()) {
+ AMRGrid *cp3RefiningGrid = mAMRDataSet.getGridByIndex(cp3.refiningId());
+ AxisAlignedBox<int> cp3RefiningCells = cp3RefiningGrid->getRefiningCells(cp3.grid(), cp3.idx(xAxis), cp3.idx(yAxis), cp3.idx(zAxis));
+ int cp3RefIdx[3];
+ cp3RefIdx[edgeAxis] = cp3RefiningCells.min(edgeAxis);
+ cp3RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp3RefiningCells.min(addAxis0132) : cp3RefiningCells.max(addAxis0132);
+ cp3RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp3RefiningCells.max(addAxis0451) : cp3RefiningCells.min(addAxis0451);
+ AMRGridCell cp3Ref(cp3RefiningGrid, cp3RefIdx);
+ mStitchCellHandler.handleTetrahedronCell(ep0, cp3Ref, cp0, cp2);
+ std::cout << "Inserting vertex to avoid illegal tesselation (Case 8)." << std::endl;
+ Vertex newPos = AMRGridStitcherAuxFct::centroid(ep0.pos(), ep1.pos(), cp0.pos(), cp1.pos(), cp3Ref.pos(), cp4.pos(), cp5.pos());
+ double newVal = ep0.val() + ep1.val() + cp0.val() + cp1.val() + cp3Ref.val() + cp4.val() + cp5.val();
+ newVal /= 7;
+ mStitchCellHandler.handlePyramidCell(cp0, cp4, cp5, cp1, newPos, newVal);
+ mStitchCellHandler.handlePyramidCell(ep0, ep1, cp5, cp4, newPos, newVal);
+ mStitchCellHandler.handlePyramidCell(ep1, cp3Ref, cp1, cp5, newPos, newVal);
+ mStitchCellHandler.handleTetrahedronCell(ep0, cp4, cp0, newPos, newVal);
+ mStitchCellHandler.handleTetrahedronCell(ep0, cp0, cp3Ref, newPos, newVal);
+ mStitchCellHandler.handleTetrahedronCell(cp0, cp1, cp3Ref, newPos, newVal);
+ mStitchCellHandler.handleTetrahedronCell(ep0, cp3Ref, ep1, newPos, newVal);
+ }
+ }
+ else if (cp5.refiningId() == AMRGrid::NoGrid && cp4.refiningId() == AMRGrid::NoGrid && cp3.refiningId() != AMRGrid::NoGrid && cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() == AMRGrid::NoGrid && cp0.refiningId() != AMRGrid::NoGrid) {
+ // Case 9
+ if (mStitchGrid->index() <= cp3.refiningId() && mStitchGrid->index() <= cp0.refiningId()) {
+ AMRGrid *cp0RefiningGrid = mAMRDataSet.getGridByIndex(cp0.refiningId());
+ AxisAlignedBox<int> cp0RefiningCells = cp0RefiningGrid->getRefiningCells(cp0.grid(), cp0.idx(xAxis), cp0.idx(yAxis), cp0.idx(zAxis));
+ int cp0RefIdx[3];
+ cp0RefIdx[edgeAxis] = cp0RefiningCells.max(edgeAxis);
+ cp0RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp0RefiningCells.max(addAxis0132) : cp0RefiningCells.min(addAxis0132);
+ cp0RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp0RefiningCells.max(addAxis0451) : cp0RefiningCells.min(addAxis0451);
+ AMRGridCell cp0Ref(cp0RefiningGrid, cp0RefIdx);
+
+ AMRGrid *cp3RefiningGrid = mAMRDataSet.getGridByIndex(cp3.refiningId());
+ AxisAlignedBox<int> cp3RefiningCells = cp3RefiningGrid->getRefiningCells(cp3.grid(), cp3.idx(xAxis), cp3.idx(yAxis), cp3.idx(zAxis));
+ int cp3RefIdx[3];
+ cp3RefIdx[edgeAxis] = cp3RefiningCells.min(edgeAxis);
+ cp3RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp3RefiningCells.min(addAxis0132) : cp3RefiningCells.max(addAxis0132);
+ cp3RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp3RefiningCells.max(addAxis0451) : cp3RefiningCells.min(addAxis0451);
+ AMRGridCell cp3Ref(cp3RefiningGrid, cp3RefIdx);
+
+ mStitchCellHandler.handlePyramidCell(cp1, cp5, ep1, cp3Ref, cp0Ref);
+ mStitchCellHandler.handlePyramidCell(ep0, ep1, cp5, cp4, cp0Ref);
+ AMRGridStitcherAuxFct::generateCellsForDeformedPyramid1234(mStitchCellHandler, cp2, cp3Ref, ep1, ep0, cp0Ref);
+ }
+ }
+ else if (cp5.refiningId() == AMRGrid::NoGrid && cp4.refiningId() == AMRGrid::NoGrid && cp3.refiningId() != AMRGrid::NoGrid && cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() != AMRGrid::NoGrid && cp0.refiningId() == AMRGrid::NoGrid) {
+ // Case 10
+ if (mStitchGrid->index() <= cp3.refiningId() && mStitchGrid->index() <= cp1.refiningId()) {
+ AMRGrid *cp1RefiningGrid = mAMRDataSet.getGridByIndex(cp1.refiningId());
+ AxisAlignedBox<int> cp1RefiningCells = cp1RefiningGrid->getRefiningCells(cp1.grid(), cp1.idx(xAxis), cp1.idx(yAxis), cp1.idx(zAxis));
+ int cp1RefIdx[3];
+ cp1RefIdx[edgeAxis] = cp1RefiningCells.min(edgeAxis);
+ cp1RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp1RefiningCells.max(addAxis0132) : cp1RefiningCells.min(addAxis0132);
+ cp1RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp1RefiningCells.max(addAxis0451) : cp1RefiningCells.min(addAxis0451);
+ AMRGridCell cp1Ref(cp1RefiningGrid, cp1RefIdx);
+
+ AMRGrid *cp3RefiningGrid = mAMRDataSet.getGridByIndex(cp3.refiningId());
+ AxisAlignedBox<int> cp3RefiningCells = cp3RefiningGrid->getRefiningCells(cp3.grid(), cp3.idx(xAxis), cp3.idx(yAxis), cp3.idx(zAxis));
+ int cp3RefIdx[3];
+ cp3RefIdx[edgeAxis] = cp3RefiningCells.min(edgeAxis);
+ cp3RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp3RefiningCells.min(addAxis0132) : cp3RefiningCells.max(addAxis0132);
+ cp3RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp3RefiningCells.max(addAxis0451) : cp3RefiningCells.min(addAxis0451);
+ AMRGridCell cp3Ref(cp3RefiningGrid, cp3RefIdx);
+ AMRGridStitcherAuxFct::generateCellsForDeformedTrianglePrism2345(mStitchCellHandler, cp2, cp0, cp1Ref, cp3Ref, ep0, ep1);
+ AMRGridStitcherAuxFct::generateCellsForDeformedTrianglePrism345(mStitchCellHandler, cp0, cp4, cp5, cp1Ref, ep0, ep1);
+ }
+ }
+ else if (cp5.refiningId() == AMRGrid::NoGrid && cp4.refiningId() == AMRGrid::NoGrid && cp3.refiningId() != AMRGrid::NoGrid && cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() != AMRGrid::NoGrid && cp0.refiningId() != AMRGrid::NoGrid) {
+ // Case 11
+ if (mStitchGrid->index() <= cp3.refiningId() && mStitchGrid->index() <= cp1.refiningId() && mStitchGrid->index() <= cp0.refiningId()) {
+ AMRGrid *cp0RefiningGrid = mAMRDataSet.getGridByIndex(cp0.refiningId());
+ AxisAlignedBox<int> cp0RefiningCells = cp0RefiningGrid->getRefiningCells(cp0.grid(), cp0.idx(xAxis), cp0.idx(yAxis), cp0.idx(zAxis));
+ int cp0RefIdx[3];
+ cp0RefIdx[edgeAxis] = cp0RefiningCells.max(edgeAxis);
+ cp0RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp0RefiningCells.max(addAxis0132) : cp0RefiningCells.min(addAxis0132);
+ cp0RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp0RefiningCells.max(addAxis0451) : cp0RefiningCells.min(addAxis0451);
+ AMRGridCell cp0Ref(cp0RefiningGrid, cp0RefIdx);
+ AMRGrid *cp1RefiningGrid = mAMRDataSet.getGridByIndex(cp1.refiningId());
+ AxisAlignedBox<int> cp1RefiningCells = cp1RefiningGrid->getRefiningCells(cp1.grid(), cp1.idx(xAxis), cp1.idx(yAxis), cp1.idx(zAxis));
+ int cp1RefIdx[3];
+ cp1RefIdx[edgeAxis] = cp1RefiningCells.min(edgeAxis);
+ cp1RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp1RefiningCells.max(addAxis0132) : cp1RefiningCells.min(addAxis0132);
+ cp1RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp1RefiningCells.max(addAxis0451) : cp1RefiningCells.min(addAxis0451);
+ AMRGridCell cp1Ref(cp1RefiningGrid, cp1RefIdx);
+ AMRGrid *cp3RefiningGrid = mAMRDataSet.getGridByIndex(cp3.refiningId());
+ AxisAlignedBox<int> cp3RefiningCells = cp3RefiningGrid->getRefiningCells(cp3.grid(), cp3.idx(xAxis), cp3.idx(yAxis), cp3.idx(zAxis));
+ int cp3RefIdx[3];
+ cp3RefIdx[edgeAxis] = cp3RefiningCells.min(edgeAxis);
+ cp3RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp3RefiningCells.min(addAxis0132) : cp3RefiningCells.max(addAxis0132);
+ cp3RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp3RefiningCells.max(addAxis0451) : cp3RefiningCells.min(addAxis0451);
+ AMRGridCell cp3Ref(cp3RefiningGrid, cp3RefIdx);
+
+ AMRGridStitcherAuxFct::generateCellsForDeformedTrianglePrism12345(mStitchCellHandler, cp2, cp0Ref, cp1Ref, cp3Ref, ep0, ep1);
+ mStitchCellHandler.handleTrianglePrismCell(cp0Ref, cp4, cp5, cp1Ref, ep0, ep1);
+ }
+ }
+ else if (!(cp5.refiningId() != AMRGrid::NoGrid && cp4.refiningId() != AMRGrid::NoGrid) && cp3.refiningId() != AMRGrid::NoGrid && cp2.refiningId() != AMRGrid::NoGrid) {
+ // Case 12 ... 15, Case 28 ... 31, Case 44 ... 47
+ AMRGrid *cp2RefiningGrid = mAMRDataSet.getGridByIndex(cp2.refiningId());
+ AxisAlignedBox<int> cp2RefiningCells = cp2RefiningGrid->getRefiningCells(cp2.grid(), cp2.idx(xAxis), cp2.idx(yAxis), cp2.idx(zAxis));
+ int cp2RefIdx[3];
+ cp2RefIdx[edgeAxis] = cp2RefiningCells.max(edgeAxis);
+ cp2RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp2RefiningCells.min(addAxis0132) : cp2RefiningCells.max(addAxis0132);
+ cp2RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp2RefiningCells.max(addAxis0451) : cp2RefiningCells.min(addAxis0451);
+ AMRGridCell cp2Ref(cp2RefiningGrid, cp2RefIdx);
+ AMRGrid *cp3RefiningGrid = mAMRDataSet.getGridByIndex(cp3.refiningId());
+ AxisAlignedBox<int> cp3RefiningCells = cp3RefiningGrid->getRefiningCells(cp3.grid(), cp3.idx(xAxis), cp3.idx(yAxis), cp3.idx(zAxis));
+ int cp3RefIdx[3];
+ cp3RefIdx[edgeAxis] = cp3RefiningCells.min(edgeAxis);
+ cp3RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp3RefiningCells.min(addAxis0132) : cp3RefiningCells.max(addAxis0132);
+ cp3RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp3RefiningCells.max(addAxis0451) : cp3RefiningCells.min(addAxis0451);
+ AMRGridCell cp3Ref(cp3RefiningGrid, cp3RefIdx);
+ connectQuadToQuad(ep0, cp2Ref, cp3Ref, ep1, cp4, cp0, cp1, cp5, addAxis0451, edgeAxis, addAxis0132, edgeAxis0451Type, max, edgeAxis0132Type);
+ }
+ else if (cp5.refiningId() == AMRGrid::NoGrid && cp4.refiningId() != AMRGrid::NoGrid && cp3.refiningId() == AMRGrid::NoGrid && cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() == AMRGrid::NoGrid && cp0.refiningId() == AMRGrid::NoGrid) {
+ // Case 16
+ if (mStitchGrid->index() <= cp4.refiningId()) {
+ AMRGrid *cp4RefiningGrid = mAMRDataSet.getGridByIndex(cp4.refiningId());
+ AxisAlignedBox<int> cp4RefiningCells = cp4RefiningGrid->getRefiningCells(cp4.grid(), cp4.idx(xAxis), cp4.idx(yAxis), cp4.idx(zAxis));
+ int cp4RefIdx[3];
+ cp4RefIdx[edgeAxis] = cp4RefiningCells.max(edgeAxis);
+ cp4RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp4RefiningCells.max(addAxis0132) : cp4RefiningCells.min(addAxis0132);
+ cp4RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp4RefiningCells.min(addAxis0451) : cp4RefiningCells.max(addAxis0451);
+ AMRGridCell cp4Ref(cp4RefiningGrid, cp4RefIdx);
+ mStitchCellHandler.handleTetrahedronCell(ep1, cp4Ref, cp1, cp5);
+ std::cout << "Inserting vertex to avoid illegal tesselation (Case 16)." << std::endl;
+ Vertex newPos = AMRGridStitcherAuxFct::centroid(ep0.pos(), ep1.pos(), cp0.pos(), cp1.pos(), cp2.pos(), cp3.pos(), cp4Ref.pos());
+ double newVal = ep0.val() + ep1.val() + cp0.val() + cp1.val() + cp2.val() + cp3.val() + cp4Ref.val();
+ newVal /= 7;
+ mStitchCellHandler.handlePyramidCell(ep0, cp4Ref, cp0, cp2, newPos, newVal);
+ mStitchCellHandler.handlePyramidCell(cp0, cp1, cp3, cp2, newPos, newVal);
+ mStitchCellHandler.handlePyramidCell(ep0, cp2, cp3, ep1, newPos, newVal);
+ mStitchCellHandler.handleTetrahedronCell(ep0, ep1, cp4Ref, newPos, newVal);
+ mStitchCellHandler.handleTetrahedronCell(ep1, cp1, cp4Ref, newPos, newVal);
+ mStitchCellHandler.handleTetrahedronCell(ep1, cp3, cp1, newPos, newVal);
+ mStitchCellHandler.handleTetrahedronCell(cp0, cp4Ref, cp1, newPos, newVal);
+ }
+ }
+ else if (cp5.refiningId() == AMRGrid::NoGrid && cp4.refiningId() != AMRGrid::NoGrid && cp3.refiningId() == AMRGrid::NoGrid && cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() == AMRGrid::NoGrid && cp0.refiningId() != AMRGrid::NoGrid) {
+ // Case 17
+ if (mStitchGrid->index() <= cp4.refiningId() && mStitchGrid->index() <= cp0.refiningId()) {
+ AMRGrid *cp0RefiningGrid = mAMRDataSet.getGridByIndex(cp0.refiningId());
+ AxisAlignedBox<int> cp0RefiningCells = cp0RefiningGrid->getRefiningCells(cp0.grid(), cp0.idx(xAxis), cp0.idx(yAxis), cp0.idx(zAxis));
+ int cp0RefIdx[3];
+ cp0RefIdx[edgeAxis] = cp0RefiningCells.max(edgeAxis);
+ cp0RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp0RefiningCells.max(addAxis0132) : cp0RefiningCells.min(addAxis0132);
+ cp0RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp0RefiningCells.max(addAxis0451) : cp0RefiningCells.min(addAxis0451);
+ AMRGridCell cp0Ref(cp0RefiningGrid, cp0RefIdx);
+ AMRGrid *cp4RefiningGrid = mAMRDataSet.getGridByIndex(cp4.refiningId());
+ AxisAlignedBox<int> cp4RefiningCells = cp4RefiningGrid->getRefiningCells(cp4.grid(), cp4.idx(xAxis), cp4.idx(yAxis), cp4.idx(zAxis));
+ int cp4RefIdx[3];
+ cp4RefIdx[edgeAxis] = cp4RefiningCells.max(edgeAxis);
+ cp4RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp4RefiningCells.max(addAxis0132) : cp4RefiningCells.min(addAxis0132);
+ cp4RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp4RefiningCells.min(addAxis0451) : cp4RefiningCells.max(addAxis0451);
+ AMRGridCell cp4Ref(cp4RefiningGrid, cp4RefIdx);
+
+ AMRGridStitcherAuxFct::generateCellsForDeformedTrianglePrism145(mStitchCellHandler, cp2, cp0Ref, cp1, cp3, ep0, ep1);
+ AMRGridStitcherAuxFct::generateCellsForDeformedTrianglePrism0145(mStitchCellHandler, cp0Ref, cp4Ref, cp5, cp1, ep0, ep1);
+ }
+ }
+ else if (cp5.refiningId() == AMRGrid::NoGrid && cp4.refiningId() != AMRGrid::NoGrid && cp3.refiningId() == AMRGrid::NoGrid && cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() != AMRGrid::NoGrid && cp0.refiningId() == AMRGrid::NoGrid) {
+ // Case 18
+ if (mStitchGrid->index() <= cp4.refiningId() && mStitchGrid->index() <= cp1.refiningId()) {
+ AMRGrid *cp1RefiningGrid = mAMRDataSet.getGridByIndex(cp1.refiningId());
+ AxisAlignedBox<int> cp1RefiningCells = cp1RefiningGrid->getRefiningCells(cp1.grid(), cp1.idx(xAxis), cp1.idx(yAxis), cp1.idx(zAxis));
+ int cp1RefIdx[3];
+ cp1RefIdx[edgeAxis] = cp1RefiningCells.min(edgeAxis);
+ cp1RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp1RefiningCells.max(addAxis0132) : cp1RefiningCells.min(addAxis0132);
+ cp1RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp1RefiningCells.max(addAxis0451) : cp1RefiningCells.min(addAxis0451);
+ AMRGridCell cp1Ref(cp1RefiningGrid, cp1RefIdx);
+ AMRGrid *cp4RefiningGrid = mAMRDataSet.getGridByIndex(cp4.refiningId());
+ AxisAlignedBox<int> cp4RefiningCells = cp4RefiningGrid->getRefiningCells(cp4.grid(), cp4.idx(xAxis), cp4.idx(yAxis), cp4.idx(zAxis));
+ int cp4RefIdx[3];
+ cp4RefIdx[edgeAxis] = cp4RefiningCells.max(edgeAxis);
+ cp4RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp4RefiningCells.max(addAxis0132) : cp4RefiningCells.min(addAxis0132);
+ cp4RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp4RefiningCells.min(addAxis0451) : cp4RefiningCells.max(addAxis0451);
+ AMRGridCell cp4Ref(cp4RefiningGrid, cp4RefIdx);
+
+ mStitchCellHandler.handlePyramidCell(ep0, cp2, cp3, ep1, cp1Ref);
+ mStitchCellHandler.handlePyramidCell(ep0, cp4Ref, cp0, cp2, cp1Ref);
+ AMRGridStitcherAuxFct::generateCellsForDeformedPyramid1234(mStitchCellHandler, cp5, cp4Ref, ep0, ep1, cp1Ref);
+ }
+ }
+ else if (cp5.refiningId() == AMRGrid::NoGrid && cp4.refiningId() != AMRGrid::NoGrid && cp3.refiningId() == AMRGrid::NoGrid && cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() != AMRGrid::NoGrid && cp0.refiningId() != AMRGrid::NoGrid) {
+ // Case 19
+ if (mStitchGrid->index() <= cp4.refiningId() && mStitchGrid->index() <= cp1.refiningId() && mStitchGrid->index() <=cp0.refiningId()) {
+ AMRGrid *cp0RefiningGrid = mAMRDataSet.getGridByIndex(cp0.refiningId());
+ AxisAlignedBox<int> cp0RefiningCells = cp0RefiningGrid->getRefiningCells(cp0.grid(), cp0.idx(xAxis), cp0.idx(yAxis), cp0.idx(zAxis));
+ int cp0RefIdx[3];
+ cp0RefIdx[edgeAxis] = cp0RefiningCells.max(edgeAxis);
+ cp0RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp0RefiningCells.max(addAxis0132) : cp0RefiningCells.min(addAxis0132);
+ cp0RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp0RefiningCells.max(addAxis0451) : cp0RefiningCells.min(addAxis0451);
+ AMRGridCell cp0Ref(cp0RefiningGrid, cp0RefIdx);
+ AMRGrid *cp1RefiningGrid = mAMRDataSet.getGridByIndex(cp1.refiningId());
+ AxisAlignedBox<int> cp1RefiningCells = cp1RefiningGrid->getRefiningCells(cp1.grid(), cp1.idx(xAxis), cp1.idx(yAxis), cp1.idx(zAxis));
+ int cp1RefIdx[3];
+ cp1RefIdx[edgeAxis] = cp1RefiningCells.min(edgeAxis);
+ cp1RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp1RefiningCells.max(addAxis0132) : cp1RefiningCells.min(addAxis0132);
+ cp1RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp1RefiningCells.max(addAxis0451) : cp1RefiningCells.min(addAxis0451);
+ AMRGridCell cp1Ref(cp1RefiningGrid, cp1RefIdx);
+ AMRGrid *cp4RefiningGrid = mAMRDataSet.getGridByIndex(cp4.refiningId());
+ AxisAlignedBox<int> cp4RefiningCells = cp4RefiningGrid->getRefiningCells(cp4.grid(), cp4.idx(xAxis), cp4.idx(yAxis), cp4.idx(zAxis));
+ int cp4RefIdx[3];
+ cp4RefIdx[edgeAxis] = cp4RefiningCells.max(edgeAxis);
+ cp4RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp4RefiningCells.max(addAxis0132) : cp4RefiningCells.min(addAxis0132);
+ cp4RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp4RefiningCells.min(addAxis0451) : cp4RefiningCells.max(addAxis0451);
+ AMRGridCell cp4Ref(cp4RefiningGrid, cp4RefIdx);
+ mStitchCellHandler.handleTrianglePrismCell(cp2, cp0Ref, cp1Ref, cp3, ep0, ep1);
+ AMRGridStitcherAuxFct::generateCellsForDeformedTrianglePrism01345(mStitchCellHandler, cp0Ref, cp4Ref, cp5, cp1Ref, ep0, ep1);
+ }
+ }
+ else if (cp5.refiningId() == AMRGrid::NoGrid && cp4.refiningId() != AMRGrid::NoGrid && cp3.refiningId() == AMRGrid::NoGrid && cp2.refiningId() != AMRGrid::NoGrid && cp1.refiningId() == AMRGrid::NoGrid && cp0.refiningId() == AMRGrid::NoGrid) {
+ // Case 20
+ if (mStitchGrid->index() <= cp4.refiningId() && mStitchGrid->index() <= cp2.refiningId()) {
+ AMRGrid *cp2RefiningGrid = mAMRDataSet.getGridByIndex(cp2.refiningId());
+ AxisAlignedBox<int> cp2RefiningCells = cp2RefiningGrid->getRefiningCells(cp2.grid(), cp2.idx(xAxis), cp2.idx(yAxis), cp2.idx(zAxis));
+ int cp2RefIdx[3];
+ cp2RefIdx[edgeAxis] = cp2RefiningCells.max(edgeAxis);
+ cp2RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp2RefiningCells.min(addAxis0132) : cp2RefiningCells.max(addAxis0132);
+ cp2RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp2RefiningCells.max(addAxis0451) : cp2RefiningCells.min(addAxis0451);
+ AMRGridCell cp2Ref(cp2RefiningGrid, cp2RefIdx);
+ AMRGrid *cp4RefiningGrid = mAMRDataSet.getGridByIndex(cp4.refiningId());
+ AxisAlignedBox<int> cp4RefiningCells = cp4RefiningGrid->getRefiningCells(cp4.grid(), cp4.idx(xAxis), cp4.idx(yAxis), cp4.idx(zAxis));
+ int cp4RefIdx[3];
+ cp4RefIdx[edgeAxis] = cp4RefiningCells.max(edgeAxis);
+ cp4RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp4RefiningCells.max(addAxis0132) : cp4RefiningCells.min(addAxis0132);
+ cp4RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp4RefiningCells.min(addAxis0451) : cp4RefiningCells.max(addAxis0451);
+ AMRGridCell cp4Ref(cp4RefiningGrid, cp4RefIdx);
+ AMRGridStitcherAuxFct::generateCellsForDeformedPyramid1234(mStitchCellHandler, cp3, ep1, ep0, cp2Ref, cp4Ref);
+ AMRGridStitcherAuxFct::generateCellsForDeformedPyramid04(mStitchCellHandler, cp2Ref, cp0, cp1, cp3, cp4Ref);
+ AMRGridStitcherAuxFct::generateCellsForDeformedPyramid04(mStitchCellHandler, ep1, cp3, cp1, cp5, cp4Ref);
+ }
+ }
+ else if (cp5.refiningId() == AMRGrid::NoGrid && cp4.refiningId() != AMRGrid::NoGrid && cp3.refiningId() == AMRGrid::NoGrid && cp2.refiningId() != AMRGrid::NoGrid && cp1.refiningId() == AMRGrid::NoGrid && cp0.refiningId() != AMRGrid::NoGrid) {
+ // Case 21
+ if (mStitchGrid->index() <= cp4.refiningId() && mStitchGrid->index() <= cp2.refiningId() && mStitchGrid->index() <= cp0.refiningId()) {
+ AMRGrid *cp0RefiningGrid = mAMRDataSet.getGridByIndex(cp0.refiningId());
+ AxisAlignedBox<int> cp0RefiningCells = cp0RefiningGrid->getRefiningCells(cp0.grid(), cp0.idx(xAxis), cp0.idx(yAxis), cp0.idx(zAxis));
+ int cp0RefIdx[3];
+ cp0RefIdx[edgeAxis] = cp0RefiningCells.max(edgeAxis);
+ cp0RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp0RefiningCells.max(addAxis0132) : cp0RefiningCells.min(addAxis0132);
+ cp0RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp0RefiningCells.max(addAxis0451) : cp0RefiningCells.min(addAxis0451);
+ AMRGridCell cp0Ref(cp0RefiningGrid, cp0RefIdx);
+ AMRGrid *cp2RefiningGrid = mAMRDataSet.getGridByIndex(cp2.refiningId());
+ AxisAlignedBox<int> cp2RefiningCells = cp2RefiningGrid->getRefiningCells(cp2.grid(), cp2.idx(xAxis), cp2.idx(yAxis), cp2.idx(zAxis));
+ int cp2RefIdx[3];
+ cp2RefIdx[edgeAxis] = cp2RefiningCells.max(edgeAxis);
+ cp2RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp2RefiningCells.min(addAxis0132) : cp2RefiningCells.max(addAxis0132);
+ cp2RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp2RefiningCells.max(addAxis0451) : cp2RefiningCells.min(addAxis0451);
+ AMRGridCell cp2Ref(cp2RefiningGrid, cp2RefIdx);
+ AMRGrid *cp4RefiningGrid = mAMRDataSet.getGridByIndex(cp4.refiningId());
+ AxisAlignedBox<int> cp4RefiningCells = cp4RefiningGrid->getRefiningCells(cp4.grid(), cp4.idx(xAxis), cp4.idx(yAxis), cp4.idx(zAxis));
+ int cp4RefIdx[3];
+ cp4RefIdx[edgeAxis] = cp4RefiningCells.max(edgeAxis);
+ cp4RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp4RefiningCells.max(addAxis0132) : cp4RefiningCells.min(addAxis0132);
+ cp4RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp4RefiningCells.min(addAxis0451) : cp4RefiningCells.max(addAxis0451);
+ AMRGridCell cp4Ref(cp4RefiningGrid, cp4RefIdx);
+ mStitchCellHandler.handlePyramidCell(ep0, cp4Ref, cp0Ref, cp2Ref, ep1);
+ mStitchCellHandler.handlePyramidCell(cp0Ref, cp4Ref, cp5, cp1, ep1);
+ mStitchCellHandler.handlePyramidCell(cp0Ref, cp1, cp3, cp2Ref, ep1);
+ }
+ }
+ else if (cp5.refiningId() == AMRGrid::NoGrid && cp4.refiningId() != AMRGrid::NoGrid && cp3.refiningId() == AMRGrid::NoGrid && cp2.refiningId() != AMRGrid::NoGrid && cp1.refiningId() != AMRGrid::NoGrid && cp0.refiningId() == AMRGrid::NoGrid) {
+ // Case 22
+ if (mStitchGrid->index() <= cp4.refiningId() && mStitchGrid->index() <= cp2.refiningId() && mStitchGrid->index() <= cp1.refiningId()) {
+ AMRGrid *cp1RefiningGrid = mAMRDataSet.getGridByIndex(cp1.refiningId());
+ AxisAlignedBox<int> cp1RefiningCells = cp1RefiningGrid->getRefiningCells(cp1.grid(), cp1.idx(xAxis), cp1.idx(yAxis), cp1.idx(zAxis));
+ int cp1RefIdx[3];
+ cp1RefIdx[edgeAxis] = cp1RefiningCells.min(edgeAxis);
+ cp1RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp1RefiningCells.max(addAxis0132) : cp1RefiningCells.min(addAxis0132);
+ cp1RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp1RefiningCells.max(addAxis0451) : cp1RefiningCells.min(addAxis0451);
+ AMRGridCell cp1Ref(cp1RefiningGrid, cp1RefIdx);
+ AMRGrid *cp2RefiningGrid = mAMRDataSet.getGridByIndex(cp2.refiningId());
+ AxisAlignedBox<int> cp2RefiningCells = cp2RefiningGrid->getRefiningCells(cp2.grid(), cp2.idx(xAxis), cp2.idx(yAxis), cp2.idx(zAxis));
+ int cp2RefIdx[3];
+ cp2RefIdx[edgeAxis] = cp2RefiningCells.max(edgeAxis);
+ cp2RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp2RefiningCells.min(addAxis0132) : cp2RefiningCells.max(addAxis0132);
+ cp2RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp2RefiningCells.max(addAxis0451) : cp2RefiningCells.min(addAxis0451);
+ AMRGridCell cp2Ref(cp2RefiningGrid, cp2RefIdx);
+ AMRGrid *cp4RefiningGrid = mAMRDataSet.getGridByIndex(cp4.refiningId());
+ AxisAlignedBox<int> cp4RefiningCells = cp4RefiningGrid->getRefiningCells(cp4.grid(), cp4.idx(xAxis), cp4.idx(yAxis), cp4.idx(zAxis));
+ int cp4RefIdx[3];
+ cp4RefIdx[edgeAxis] = cp4RefiningCells.max(edgeAxis);
+ cp4RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp4RefiningCells.max(addAxis0132) : cp4RefiningCells.min(addAxis0132);
+ cp4RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp4RefiningCells.min(addAxis0451) : cp4RefiningCells.max(addAxis0451);
+ AMRGridCell cp4Ref(cp4RefiningGrid, cp4RefIdx);
+ AMRGridStitcherAuxFct::generateCellsForDeformedPyramid024(mStitchCellHandler, ep1, cp3, cp1Ref, cp5, cp4Ref);
+ AMRGridStitcherAuxFct::generateCellsForDeformedPyramid024(mStitchCellHandler, cp1Ref, cp3, cp2Ref, cp0, cp4Ref);
+ AMRGridStitcherAuxFct::generateCellsForDeformedPyramid1234(mStitchCellHandler, cp3, ep1, ep0, cp2Ref, cp4Ref);
+ }
+ }
+ else if (cp5.refiningId() == AMRGrid::NoGrid && cp4.refiningId() != AMRGrid::NoGrid && cp3.refiningId() == AMRGrid::NoGrid && cp2.refiningId() != AMRGrid::NoGrid && cp1.refiningId() != AMRGrid::NoGrid && cp0.refiningId() != AMRGrid::NoGrid) {
+ // Case 23
+ if (mStitchGrid->index() <= cp4.refiningId() && mStitchGrid->index() <= cp2.refiningId() && mStitchGrid->index() <= cp1.refiningId() && mStitchGrid->index() <= cp0.refiningId()) {
+ AMRGrid *cp0RefiningGrid = mAMRDataSet.getGridByIndex(cp0.refiningId());
+ AxisAlignedBox<int> cp0RefiningCells = cp0RefiningGrid->getRefiningCells(cp0.grid(), cp0.idx(xAxis), cp0.idx(yAxis), cp0.idx(zAxis));
+ int cp0RefIdx[3];
+ cp0RefIdx[edgeAxis] = cp0RefiningCells.max(edgeAxis);
+ cp0RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp0RefiningCells.max(addAxis0132) : cp0RefiningCells.min(addAxis0132);
+ cp0RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp0RefiningCells.max(addAxis0451) : cp0RefiningCells.min(addAxis0451);
+ AMRGridCell cp0Ref(cp0RefiningGrid, cp0RefIdx);
+ AMRGrid *cp1RefiningGrid = mAMRDataSet.getGridByIndex(cp1.refiningId());
+ AxisAlignedBox<int> cp1RefiningCells = cp1RefiningGrid->getRefiningCells(cp1.grid(), cp1.idx(xAxis), cp1.idx(yAxis), cp1.idx(zAxis));
+ int cp1RefIdx[3];
+ cp1RefIdx[edgeAxis] = cp1RefiningCells.min(edgeAxis);
+ cp1RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp1RefiningCells.max(addAxis0132) : cp1RefiningCells.min(addAxis0132);
+ cp1RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp1RefiningCells.max(addAxis0451) : cp1RefiningCells.min(addAxis0451);
+ AMRGridCell cp1Ref(cp1RefiningGrid, cp1RefIdx);
+ AMRGrid *cp2RefiningGrid = mAMRDataSet.getGridByIndex(cp2.refiningId());
+ AxisAlignedBox<int> cp2RefiningCells = cp2RefiningGrid->getRefiningCells(cp2.grid(), cp2.idx(xAxis), cp2.idx(yAxis), cp2.idx(zAxis));
+ int cp2RefIdx[3];
+ cp2RefIdx[edgeAxis] = cp2RefiningCells.max(edgeAxis);
+ cp2RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp2RefiningCells.min(addAxis0132) : cp2RefiningCells.max(addAxis0132);
+ cp2RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp2RefiningCells.max(addAxis0451) : cp2RefiningCells.min(addAxis0451);
+ AMRGridCell cp2Ref(cp2RefiningGrid, cp2RefIdx);
+ AMRGrid *cp4RefiningGrid = mAMRDataSet.getGridByIndex(cp4.refiningId());
+ AxisAlignedBox<int> cp4RefiningCells = cp4RefiningGrid->getRefiningCells(cp4.grid(), cp4.idx(xAxis), cp4.idx(yAxis), cp4.idx(zAxis));
+ int cp4RefIdx[3];
+ cp4RefIdx[edgeAxis] = cp4RefiningCells.max(edgeAxis);
+ cp4RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp4RefiningCells.max(addAxis0132) : cp4RefiningCells.min(addAxis0132);
+ cp4RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp4RefiningCells.min(addAxis0451) : cp4RefiningCells.max(addAxis0451);
+ AMRGridCell cp4Ref(cp4RefiningGrid, cp4RefIdx);
+ mStitchCellHandler.handlePyramidCell(cp0Ref, cp2Ref, ep0, cp4Ref, cp1Ref);
+ AMRGridStitcherAuxFct::generateCellsForDeformedPyramid1234(mStitchCellHandler, cp3, ep1, ep0, cp2Ref, cp1Ref);
+ AMRGridStitcherAuxFct::generateCellsForDeformedPyramid1234(mStitchCellHandler, cp5, cp4Ref, ep0, ep1, cp1Ref);
+ }
+ }
+ else if (cp5.refiningId() == AMRGrid::NoGrid && cp4.refiningId() != AMRGrid::NoGrid && cp3.refiningId() != AMRGrid::NoGrid && cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() == AMRGrid::NoGrid && cp0.refiningId() == AMRGrid::NoGrid) {
+ // Case 24
+ if (mStitchGrid->index() <= cp4.refiningId() && mStitchGrid->index() <= cp3.refiningId() && mStitchGrid->index()) {
+ AMRGrid *cp3RefiningGrid = mAMRDataSet.getGridByIndex(cp3.refiningId());
+ AxisAlignedBox<int> cp3RefiningCells = cp3RefiningGrid->getRefiningCells(cp3.grid(), cp3.idx(xAxis), cp3.idx(yAxis), cp3.idx(zAxis));
+ int cp3RefIdx[3];
+ cp3RefIdx[edgeAxis] = cp3RefiningCells.min(edgeAxis);
+ cp3RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp3RefiningCells.min(addAxis0132) : cp3RefiningCells.max(addAxis0132);
+ cp3RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp3RefiningCells.max(addAxis0451) : cp3RefiningCells.min(addAxis0451);
+ AMRGridCell cp3Ref(cp3RefiningGrid, cp3RefIdx);
+ AMRGrid *cp4RefiningGrid = mAMRDataSet.getGridByIndex(cp4.refiningId());
+ AxisAlignedBox<int> cp4RefiningCells = cp4RefiningGrid->getRefiningCells(cp4.grid(), cp4.idx(xAxis), cp4.idx(yAxis), cp4.idx(zAxis));
+ int cp4RefIdx[3];
+ cp4RefIdx[edgeAxis] = cp4RefiningCells.max(edgeAxis);
+ cp4RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp4RefiningCells.max(addAxis0132) : cp4RefiningCells.min(addAxis0132);
+ cp4RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp4RefiningCells.min(addAxis0451) : cp4RefiningCells.max(addAxis0451);
+ AMRGridCell cp4Ref(cp4RefiningGrid, cp4RefIdx);
+ mStitchCellHandler.handlePyramidCell(cp0, cp2, ep0, cp4Ref, cp3Ref);
+ mStitchCellHandler.handleTetrahedronCell(cp0, cp4Ref, cp1, cp3Ref);
+ mStitchCellHandler.handlePyramidCell(ep1, cp3Ref, cp1, cp5, cp4Ref);
+ mStitchCellHandler.handleTetrahedronCell(ep0, cp3Ref, ep1, cp4Ref);
+ }
+ }
+ else if (cp5.refiningId() == AMRGrid::NoGrid && cp4.refiningId() != AMRGrid::NoGrid && cp3.refiningId() != AMRGrid::NoGrid && cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() == AMRGrid::NoGrid && cp0.refiningId() != AMRGrid::NoGrid) {
+ // Case 25
+ if (mStitchGrid->index() <= cp4.refiningId() && mStitchGrid->index() <= cp3.refiningId() && mStitchGrid->index() && cp0.refiningId() <= mStitchGrid->index()) {
+ AMRGrid *cp0RefiningGrid = mAMRDataSet.getGridByIndex(cp0.refiningId());
+ AxisAlignedBox<int> cp0RefiningCells = cp0RefiningGrid->getRefiningCells(cp0.grid(), cp0.idx(xAxis), cp0.idx(yAxis), cp0.idx(zAxis));
+ int cp0RefIdx[3];
+ cp0RefIdx[edgeAxis] = cp0RefiningCells.max(edgeAxis);
+ cp0RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp0RefiningCells.max(addAxis0132) : cp0RefiningCells.min(addAxis0132);
+ cp0RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp0RefiningCells.max(addAxis0451) : cp0RefiningCells.min(addAxis0451);
+ AMRGridCell cp0Ref(cp0RefiningGrid, cp0RefIdx);
+ AMRGrid *cp3RefiningGrid = mAMRDataSet.getGridByIndex(cp3.refiningId());
+ AxisAlignedBox<int> cp3RefiningCells = cp3RefiningGrid->getRefiningCells(cp3.grid(), cp3.idx(xAxis), cp3.idx(yAxis), cp3.idx(zAxis));
+ int cp3RefIdx[3];
+ cp3RefIdx[edgeAxis] = cp3RefiningCells.min(edgeAxis);
+ cp3RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp3RefiningCells.min(addAxis0132) : cp3RefiningCells.max(addAxis0132);
+ cp3RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp3RefiningCells.max(addAxis0451) : cp3RefiningCells.min(addAxis0451);
+ AMRGridCell cp3Ref(cp3RefiningGrid, cp3RefIdx);
+ AMRGrid *cp4RefiningGrid = mAMRDataSet.getGridByIndex(cp4.refiningId());
+ AxisAlignedBox<int> cp4RefiningCells = cp4RefiningGrid->getRefiningCells(cp4.grid(), cp4.idx(xAxis), cp4.idx(yAxis), cp4.idx(zAxis));
+ int cp4RefIdx[3];
+ cp4RefIdx[edgeAxis] = cp4RefiningCells.max(edgeAxis);
+ cp4RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp4RefiningCells.max(addAxis0132) : cp4RefiningCells.min(addAxis0132);
+ cp4RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp4RefiningCells.min(addAxis0451) : cp4RefiningCells.max(addAxis0451);
+ AMRGridCell cp4Ref(cp4RefiningGrid, cp4RefIdx);
+ mStitchCellHandler.handleTrianglePrismCell(cp3Ref, cp1, cp5, ep1, cp0Ref, cp4Ref);
+ AMRGridStitcherAuxFct::generateCellsForDeformedTrianglePrism12345(mStitchCellHandler, cp2, cp3Ref, ep1, ep0, cp0Ref, cp4Ref);
+ }
+ }
+ else if (cp5.refiningId() == AMRGrid::NoGrid && cp4.refiningId() != AMRGrid::NoGrid && cp3.refiningId() != AMRGrid::NoGrid && cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() != AMRGrid::NoGrid && cp0.refiningId() == AMRGrid::NoGrid) {
+ // Case 26
+ if (mStitchGrid->index() <= cp4.refiningId() && mStitchGrid->index() <= cp3.refiningId() && mStitchGrid->index() && cp1.refiningId() <= mStitchGrid->index()) {
+ AMRGrid *cp1RefiningGrid = mAMRDataSet.getGridByIndex(cp1.refiningId());
+ AxisAlignedBox<int> cp1RefiningCells = cp1RefiningGrid->getRefiningCells(cp1.grid(), cp1.idx(xAxis), cp1.idx(yAxis), cp1.idx(zAxis));
+ int cp1RefIdx[3];
+ cp1RefIdx[edgeAxis] = cp1RefiningCells.min(edgeAxis);
+ cp1RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp1RefiningCells.max(addAxis0132) : cp1RefiningCells.min(addAxis0132);
+ cp1RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp1RefiningCells.max(addAxis0451) : cp1RefiningCells.min(addAxis0451);
+ AMRGridCell cp1Ref(cp1RefiningGrid, cp1RefIdx);
+ AMRGrid *cp3RefiningGrid = mAMRDataSet.getGridByIndex(cp3.refiningId());
+ AxisAlignedBox<int> cp3RefiningCells = cp3RefiningGrid->getRefiningCells(cp3.grid(), cp3.idx(xAxis), cp3.idx(yAxis), cp3.idx(zAxis));
+ int cp3RefIdx[3];
+ cp3RefIdx[edgeAxis] = cp3RefiningCells.min(edgeAxis);
+ cp3RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp3RefiningCells.min(addAxis0132) : cp3RefiningCells.max(addAxis0132);
+ cp3RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp3RefiningCells.max(addAxis0451) : cp3RefiningCells.min(addAxis0451);
+ AMRGridCell cp3Ref(cp3RefiningGrid, cp3RefIdx);
+ AMRGrid *cp4RefiningGrid = mAMRDataSet.getGridByIndex(cp4.refiningId());
+ AxisAlignedBox<int> cp4RefiningCells = cp4RefiningGrid->getRefiningCells(cp4.grid(), cp4.idx(xAxis), cp4.idx(yAxis), cp4.idx(zAxis));
+ int cp4RefIdx[3];
+ cp4RefIdx[edgeAxis] = cp4RefiningCells.max(edgeAxis);
+ cp4RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp4RefiningCells.max(addAxis0132) : cp4RefiningCells.min(addAxis0132);
+ cp4RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp4RefiningCells.min(addAxis0451) : cp4RefiningCells.max(addAxis0451);
+ AMRGridCell cp4Ref(cp4RefiningGrid, cp4RefIdx);
+
+ mStitchCellHandler.handleTrianglePrismCell(cp4Ref, cp0, cp2, ep0, cp1Ref, cp3Ref);
+ AMRGridStitcherAuxFct::generateCellsForDeformedTrianglePrism12345(mStitchCellHandler, cp5, cp4Ref, ep0, ep1, cp1Ref, cp3Ref);
+ }
+ }
+ else if (cp5.refiningId() == AMRGrid::NoGrid && cp4.refiningId() != AMRGrid::NoGrid && cp3.refiningId() != AMRGrid::NoGrid && cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() != AMRGrid::NoGrid && cp0.refiningId() != AMRGrid::NoGrid) {
+ // Case 27
+ if (mStitchGrid->index() <= cp4.refiningId() && mStitchGrid->index() <= cp3.refiningId() && mStitchGrid->index() && cp1.refiningId() <= mStitchGrid->index() && cp0.refiningId() <= mStitchGrid->index()) {
+ AMRGrid *cp0RefiningGrid = mAMRDataSet.getGridByIndex(cp0.refiningId());
+ AxisAlignedBox<int> cp0RefiningCells = cp0RefiningGrid->getRefiningCells(cp0.grid(), cp0.idx(xAxis), cp0.idx(yAxis), cp0.idx(zAxis));
+ int cp0RefIdx[3];
+ cp0RefIdx[edgeAxis] = cp0RefiningCells.max(edgeAxis);
+ cp0RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp0RefiningCells.max(addAxis0132) : cp0RefiningCells.min(addAxis0132);
+ cp0RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp0RefiningCells.max(addAxis0451) : cp0RefiningCells.min(addAxis0451);
+ AMRGridCell cp0Ref(cp0RefiningGrid, cp0RefIdx);
+ AMRGrid *cp1RefiningGrid = mAMRDataSet.getGridByIndex(cp1.refiningId());
+ AxisAlignedBox<int> cp1RefiningCells = cp1RefiningGrid->getRefiningCells(cp1.grid(), cp1.idx(xAxis), cp1.idx(yAxis), cp1.idx(zAxis));
+ int cp1RefIdx[3];
+ cp1RefIdx[edgeAxis] = cp1RefiningCells.min(edgeAxis);
+ cp1RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp1RefiningCells.max(addAxis0132) : cp1RefiningCells.min(addAxis0132);
+ cp1RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp1RefiningCells.max(addAxis0451) : cp1RefiningCells.min(addAxis0451);
+ AMRGridCell cp1Ref(cp1RefiningGrid, cp1RefIdx);
+ AMRGrid *cp3RefiningGrid = mAMRDataSet.getGridByIndex(cp3.refiningId());
+ AxisAlignedBox<int> cp3RefiningCells = cp3RefiningGrid->getRefiningCells(cp3.grid(), cp3.idx(xAxis), cp3.idx(yAxis), cp3.idx(zAxis));
+ int cp3RefIdx[3];
+ cp3RefIdx[edgeAxis] = cp3RefiningCells.min(edgeAxis);
+ cp3RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp3RefiningCells.min(addAxis0132) : cp3RefiningCells.max(addAxis0132);
+ cp3RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp3RefiningCells.max(addAxis0451) : cp3RefiningCells.min(addAxis0451);
+ AMRGridCell cp3Ref(cp3RefiningGrid, cp3RefIdx);
+ AMRGrid *cp4RefiningGrid = mAMRDataSet.getGridByIndex(cp4.refiningId());
+ AxisAlignedBox<int> cp4RefiningCells = cp4RefiningGrid->getRefiningCells(cp4.grid(), cp4.idx(xAxis), cp4.idx(yAxis), cp4.idx(zAxis));
+ int cp4RefIdx[3];
+ cp4RefIdx[edgeAxis] = cp4RefiningCells.max(edgeAxis);
+ cp4RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp4RefiningCells.max(addAxis0132) : cp4RefiningCells.min(addAxis0132);
+ cp4RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp4RefiningCells.min(addAxis0451) : cp4RefiningCells.max(addAxis0451);
+ AMRGridCell cp4Ref(cp4RefiningGrid, cp4RefIdx);
+
+ AMRGridStitcherAuxFct::generateCellsForDeformedTrianglePrism12345(mStitchCellHandler, cp2, cp0Ref, cp1Ref, cp3Ref, ep0, ep1);
+ AMRGridStitcherAuxFct::generateCellsForDeformedTrianglePrism01345(mStitchCellHandler, cp0Ref, cp4Ref, cp5, cp1Ref, ep0, ep1);
+ }
+ }
+ // Case 28 ... 31 see Case 12 ... 15
+ else if (cp5.refiningId() != AMRGrid::NoGrid && cp4.refiningId() == AMRGrid::NoGrid && cp3.refiningId() == AMRGrid::NoGrid && cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() == AMRGrid::NoGrid && cp0.refiningId() == AMRGrid::NoGrid) {
+ // Case 32
+ if (mStitchGrid->index() <= cp5.refiningId()) {
+ AMRGrid *cp5RefiningGrid = mAMRDataSet.getGridByIndex(cp5.refiningId());
+ AxisAlignedBox<int> cp5RefiningCells = cp5RefiningGrid->getRefiningCells(cp5.grid(), cp5.idx(xAxis), cp5.idx(yAxis), cp5.idx(zAxis));
+ int cp5RefIdx[3];
+ cp5RefIdx[edgeAxis] = cp5RefiningCells.min(edgeAxis);
+ cp5RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp5RefiningCells.max(addAxis0132) : cp5RefiningCells.min(addAxis0132);
+ cp5RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp5RefiningCells.min(addAxis0451) : cp5RefiningCells.max(addAxis0451);
+ AMRGridCell cp5Ref(cp5RefiningGrid, cp5RefIdx);
+ mStitchCellHandler.handleTetrahedronCell(ep0, cp0, cp5Ref, cp4);
+ std::cout << "Inserting vertex to avoid illegal tesselation (Case 32)." << std::endl;
+ Vertex newPos = AMRGridStitcherAuxFct::centroid(ep0.pos(), ep1.pos(), cp0.pos(), cp1.pos(), cp2.pos(), cp3.pos(), cp5Ref.pos());
+ double newVal = ep0.val() + ep1.val() + cp0.val() + cp1.val() + cp2.val() + cp3.val() + cp5Ref.val();
+ newVal /= 7;
+ mStitchCellHandler.handlePyramidCell(ep0, cp2, cp3, ep1, newPos, newVal);
+ mStitchCellHandler.handlePyramidCell(cp0, cp1, cp3, cp2, newPos, newVal);
+ mStitchCellHandler.handlePyramidCell(ep1, cp3, cp1, cp5Ref, newPos, newVal);
+ mStitchCellHandler.handleTetrahedronCell(ep0, ep1, cp5Ref, newPos, newVal);
+ mStitchCellHandler.handleTetrahedronCell(ep0, cp5Ref, cp0, newPos, newVal);
+ mStitchCellHandler.handleTetrahedronCell(ep0, cp0, cp2, newPos, newVal);
+ mStitchCellHandler.handleTetrahedronCell(cp0, cp5Ref, cp1, newPos, newVal);
+ }
+ }
+ else if (cp5.refiningId() != AMRGrid::NoGrid && cp4.refiningId() == AMRGrid::NoGrid && cp3.refiningId() == AMRGrid::NoGrid && cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() == AMRGrid::NoGrid && cp0.refiningId() != AMRGrid::NoGrid) {
+ // Case 33
+ if (mStitchGrid->index() <= cp5.refiningId() && mStitchGrid->index() <= cp0.refiningId()) {
+ AMRGrid *cp0RefiningGrid = mAMRDataSet.getGridByIndex(cp0.refiningId());
+ AxisAlignedBox<int> cp0RefiningCells = cp0RefiningGrid->getRefiningCells(cp0.grid(), cp0.idx(xAxis), cp0.idx(yAxis), cp0.idx(zAxis));
+ int cp0RefIdx[3];
+ cp0RefIdx[edgeAxis] = cp0RefiningCells.max(edgeAxis);
+ cp0RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp0RefiningCells.max(addAxis0132) : cp0RefiningCells.min(addAxis0132);
+ cp0RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp0RefiningCells.max(addAxis0451) : cp0RefiningCells.min(addAxis0451);
+ AMRGridCell cp0Ref(cp0RefiningGrid, cp0RefIdx);
+ AMRGrid *cp5RefiningGrid = mAMRDataSet.getGridByIndex(cp5.refiningId());
+ AxisAlignedBox<int> cp5RefiningCells = cp5RefiningGrid->getRefiningCells(cp5.grid(), cp5.idx(xAxis), cp5.idx(yAxis), cp5.idx(zAxis));
+ int cp5RefIdx[3];
+ cp5RefIdx[edgeAxis] = cp5RefiningCells.min(edgeAxis);
+ cp5RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp5RefiningCells.max(addAxis0132) : cp5RefiningCells.min(addAxis0132);
+ cp5RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp5RefiningCells.min(addAxis0451) : cp5RefiningCells.max(addAxis0451);
+ AMRGridCell cp5Ref(cp5RefiningGrid, cp5RefIdx);
+
+ mStitchCellHandler.handlePyramidCell(cp1, cp5Ref, ep1, cp3, cp0Ref);
+ mStitchCellHandler.handlePyramidCell(ep0, cp2, cp3, ep1, cp0Ref);
+ AMRGridStitcherAuxFct::generateCellsForDeformedPyramid1234(mStitchCellHandler, cp4, ep0, ep1, cp5Ref, cp0Ref);
+ }
+ }
+ else if (cp5.refiningId() != AMRGrid::NoGrid && cp4.refiningId() == AMRGrid::NoGrid && cp3.refiningId() == AMRGrid::NoGrid && cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() != AMRGrid::NoGrid && cp0.refiningId() == AMRGrid::NoGrid) {
+ // Case 34
+ if (mStitchGrid->index() <= cp5.refiningId() && mStitchGrid->index() <= cp1.refiningId()) {
+ AMRGrid *cp1RefiningGrid = mAMRDataSet.getGridByIndex(cp1.refiningId());
+ AxisAlignedBox<int> cp1RefiningCells = cp1RefiningGrid->getRefiningCells(cp1.grid(), cp1.idx(xAxis), cp1.idx(yAxis), cp1.idx(zAxis));
+ int cp1RefIdx[3];
+ cp1RefIdx[edgeAxis] = cp1RefiningCells.min(edgeAxis);
+ cp1RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp1RefiningCells.max(addAxis0132) : cp1RefiningCells.min(addAxis0132);
+ cp1RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp1RefiningCells.max(addAxis0451) : cp1RefiningCells.min(addAxis0451);
+ AMRGridCell cp1Ref(cp1RefiningGrid, cp1RefIdx);
+ AMRGrid *cp5RefiningGrid = mAMRDataSet.getGridByIndex(cp5.refiningId());
+ AxisAlignedBox<int> cp5RefiningCells = cp5RefiningGrid->getRefiningCells(cp5.grid(), cp5.idx(xAxis), cp5.idx(yAxis), cp5.idx(zAxis));
+ int cp5RefIdx[3];
+ cp5RefIdx[edgeAxis] = cp5RefiningCells.min(edgeAxis);
+ cp5RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp5RefiningCells.max(addAxis0132) : cp5RefiningCells.min(addAxis0132);
+ cp5RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp5RefiningCells.min(addAxis0451) : cp5RefiningCells.max(addAxis0451);
+ AMRGridCell cp5Ref(cp5RefiningGrid, cp5RefIdx);
+ AMRGridStitcherAuxFct::generateCellsForDeformedTrianglePrism245(mStitchCellHandler, cp2, cp0, cp1Ref, cp3, ep0, ep1);
+ AMRGridStitcherAuxFct::generateCellsForDeformedTrianglePrism2345(mStitchCellHandler, cp0, cp4, cp5Ref, cp1Ref, ep0, ep1);
+ }
+ }
+ else if (cp5.refiningId() != AMRGrid::NoGrid && cp4.refiningId() == AMRGrid::NoGrid && cp3.refiningId() == AMRGrid::NoGrid && cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() != AMRGrid::NoGrid && cp0.refiningId() != AMRGrid::NoGrid) {
+ // Case 35
+ if (mStitchGrid->index() <= cp5.refiningId() && mStitchGrid->index() <= cp1.refiningId() && mStitchGrid->index() <= cp0.refiningId()) {
+ AMRGrid *cp0RefiningGrid = mAMRDataSet.getGridByIndex(cp0.refiningId());
+ AxisAlignedBox<int> cp0RefiningCells = cp0RefiningGrid->getRefiningCells(cp0.grid(), cp0.idx(xAxis), cp0.idx(yAxis), cp0.idx(zAxis));
+ int cp0RefIdx[3];
+ cp0RefIdx[edgeAxis] = cp0RefiningCells.max(edgeAxis);
+ cp0RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp0RefiningCells.max(addAxis0132) : cp0RefiningCells.min(addAxis0132);
+ cp0RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp0RefiningCells.max(addAxis0451) : cp0RefiningCells.min(addAxis0451);
+ AMRGridCell cp0Ref(cp0RefiningGrid, cp0RefIdx);
+ AMRGrid *cp1RefiningGrid = mAMRDataSet.getGridByIndex(cp1.refiningId());
+ AxisAlignedBox<int> cp1RefiningCells = cp1RefiningGrid->getRefiningCells(cp1.grid(), cp1.idx(xAxis), cp1.idx(yAxis), cp1.idx(zAxis));
+ int cp1RefIdx[3];
+ cp1RefIdx[edgeAxis] = cp1RefiningCells.min(edgeAxis);
+ cp1RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp1RefiningCells.max(addAxis0132) : cp1RefiningCells.min(addAxis0132);
+ cp1RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp1RefiningCells.max(addAxis0451) : cp1RefiningCells.min(addAxis0451);
+ AMRGridCell cp1Ref(cp1RefiningGrid, cp1RefIdx);
+ AMRGrid *cp5RefiningGrid = mAMRDataSet.getGridByIndex(cp5.refiningId());
+ AxisAlignedBox<int> cp5RefiningCells = cp5RefiningGrid->getRefiningCells(cp5.grid(), cp5.idx(xAxis), cp5.idx(yAxis), cp5.idx(zAxis));
+ int cp5RefIdx[3];
+ cp5RefIdx[edgeAxis] = cp5RefiningCells.min(edgeAxis);
+ cp5RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp5RefiningCells.max(addAxis0132) : cp5RefiningCells.min(addAxis0132);
+ cp5RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp5RefiningCells.min(addAxis0451) : cp5RefiningCells.max(addAxis0451);
+ AMRGridCell cp5Ref(cp5RefiningGrid, cp5RefIdx);
+
+ mStitchCellHandler.handleTrianglePrismCell(cp2, cp0Ref, cp1Ref, cp3, ep0, ep1);
+ AMRGridStitcherAuxFct::generateCellsForDeformedTrianglePrism02345(mStitchCellHandler, cp0Ref, cp4, cp5Ref, cp1Ref, ep0, ep1);
+ }
+ }
+ else if (cp5.refiningId() != AMRGrid::NoGrid && cp4.refiningId() == AMRGrid::NoGrid && cp3.refiningId() == AMRGrid::NoGrid && cp2.refiningId() != AMRGrid::NoGrid && cp1.refiningId() == AMRGrid::NoGrid && cp0.refiningId() == AMRGrid::NoGrid) {
+ // Case 36
+ if (mStitchGrid->index() <= cp5.refiningId() && mStitchGrid->index() <= cp2.refiningId()) {
+ AMRGrid *cp2RefiningGrid = mAMRDataSet.getGridByIndex(cp2.refiningId());
+ AxisAlignedBox<int> cp2RefiningCells = cp2RefiningGrid->getRefiningCells(cp2.grid(), cp2.idx(xAxis), cp2.idx(yAxis), cp2.idx(zAxis));
+ int cp2RefIdx[3];
+ cp2RefIdx[edgeAxis] = cp2RefiningCells.max(edgeAxis);
+ cp2RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp2RefiningCells.min(addAxis0132) : cp2RefiningCells.max(addAxis0132);
+ cp2RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp2RefiningCells.max(addAxis0451) : cp2RefiningCells.min(addAxis0451);
+ AMRGridCell cp2Ref(cp2RefiningGrid, cp2RefIdx);
+ AMRGrid *cp5RefiningGrid = mAMRDataSet.getGridByIndex(cp5.refiningId());
+ AxisAlignedBox<int> cp5RefiningCells = cp5RefiningGrid->getRefiningCells(cp5.grid(), cp5.idx(xAxis), cp5.idx(yAxis), cp5.idx(zAxis));
+ int cp5RefIdx[3];
+ cp5RefIdx[edgeAxis] = cp5RefiningCells.min(edgeAxis);
+ cp5RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp5RefiningCells.max(addAxis0132) : cp5RefiningCells.min(addAxis0132);
+ cp5RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp5RefiningCells.min(addAxis0451) : cp5RefiningCells.max(addAxis0451);
+ AMRGridCell cp5Ref(cp5RefiningGrid, cp5RefIdx);
+
+ AMRGridStitcherAuxFct::generateCellsForDeformedTrianglePrism145(mStitchCellHandler, cp3, cp2Ref, cp0, cp1, ep1, cp5Ref);
+ AMRGridStitcherAuxFct::generateCellsForDeformedTrianglePrism0145(mStitchCellHandler, cp2Ref, ep0, cp4, cp0, ep1, cp5Ref);
+ }
+ }
+ else if (cp5.refiningId() != AMRGrid::NoGrid && cp4.refiningId() == AMRGrid::NoGrid && cp3.refiningId() == AMRGrid::NoGrid && cp2.refiningId() != AMRGrid::NoGrid && cp1.refiningId() == AMRGrid::NoGrid && cp0.refiningId() != AMRGrid::NoGrid) {
+ // Case 37
+ if (mStitchGrid->index() <= cp5.refiningId() && mStitchGrid->index() <= cp2.refiningId() && mStitchGrid->index() <= cp0.refiningId()) {
+ AMRGrid *cp0RefiningGrid = mAMRDataSet.getGridByIndex(cp0.refiningId());
+ AxisAlignedBox<int> cp0RefiningCells = cp0RefiningGrid->getRefiningCells(cp0.grid(), cp0.idx(xAxis), cp0.idx(yAxis), cp0.idx(zAxis));
+ int cp0RefIdx[3];
+ cp0RefIdx[edgeAxis] = cp0RefiningCells.max(edgeAxis);
+ cp0RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp0RefiningCells.max(addAxis0132) : cp0RefiningCells.min(addAxis0132);
+ cp0RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp0RefiningCells.max(addAxis0451) : cp0RefiningCells.min(addAxis0451);
+ AMRGridCell cp0Ref(cp0RefiningGrid, cp0RefIdx);
+ AMRGrid *cp2RefiningGrid = mAMRDataSet.getGridByIndex(cp2.refiningId());
+ AxisAlignedBox<int> cp2RefiningCells = cp2RefiningGrid->getRefiningCells(cp2.grid(), cp2.idx(xAxis), cp2.idx(yAxis), cp2.idx(zAxis));
+ int cp2RefIdx[3];
+ cp2RefIdx[edgeAxis] = cp2RefiningCells.max(edgeAxis);
+ cp2RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp2RefiningCells.min(addAxis0132) : cp2RefiningCells.max(addAxis0132);
+ cp2RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp2RefiningCells.max(addAxis0451) : cp2RefiningCells.min(addAxis0451);
+ AMRGridCell cp2Ref(cp2RefiningGrid, cp2RefIdx);
+ AMRGrid *cp5RefiningGrid = mAMRDataSet.getGridByIndex(cp5.refiningId());
+ AxisAlignedBox<int> cp5RefiningCells = cp5RefiningGrid->getRefiningCells(cp5.grid(), cp5.idx(xAxis), cp5.idx(yAxis), cp5.idx(zAxis));
+ int cp5RefIdx[3];
+ cp5RefIdx[edgeAxis] = cp5RefiningCells.min(edgeAxis);
+ cp5RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp5RefiningCells.max(addAxis0132) : cp5RefiningCells.min(addAxis0132);
+ cp5RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp5RefiningCells.min(addAxis0451) : cp5RefiningCells.max(addAxis0451);
+ AMRGridCell cp5Ref(cp5RefiningGrid, cp5RefIdx);
+
+ mStitchCellHandler.handleTrianglePrismCell(cp3, cp2Ref, cp0Ref, cp1, ep1, cp5Ref);
+ AMRGridStitcherAuxFct::generateCellsForDeformedTrianglePrism01345(mStitchCellHandler, cp2Ref, ep0, cp4, cp0Ref, ep1, cp5Ref);
+ }
+ }
+ else if (cp5.refiningId() != AMRGrid::NoGrid && cp4.refiningId() == AMRGrid::NoGrid && cp3.refiningId() == AMRGrid::NoGrid && cp2.refiningId() != AMRGrid::NoGrid && cp1.refiningId() != AMRGrid::NoGrid && cp0.refiningId() == AMRGrid::NoGrid) {
+ // Case 38
+ if (mStitchGrid->index() <= cp5.refiningId() && mStitchGrid->index() <= cp2.refiningId() && mStitchGrid->index() <= cp1.refiningId()) {
+ AMRGrid *cp1RefiningGrid = mAMRDataSet.getGridByIndex(cp1.refiningId());
+ AxisAlignedBox<int> cp1RefiningCells = cp1RefiningGrid->getRefiningCells(cp1.grid(), cp1.idx(xAxis), cp1.idx(yAxis), cp1.idx(zAxis));
+ int cp1RefIdx[3];
+ cp1RefIdx[edgeAxis] = cp1RefiningCells.min(edgeAxis);
+ cp1RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp1RefiningCells.max(addAxis0132) : cp1RefiningCells.min(addAxis0132);
+ cp1RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp1RefiningCells.max(addAxis0451) : cp1RefiningCells.min(addAxis0451);
+ AMRGridCell cp1Ref(cp1RefiningGrid, cp1RefIdx);
+ AMRGrid *cp2RefiningGrid = mAMRDataSet.getGridByIndex(cp2.refiningId());
+ AxisAlignedBox<int> cp2RefiningCells = cp2RefiningGrid->getRefiningCells(cp2.grid(), cp2.idx(xAxis), cp2.idx(yAxis), cp2.idx(zAxis));
+ int cp2RefIdx[3];
+ cp2RefIdx[edgeAxis] = cp2RefiningCells.max(edgeAxis);
+ cp2RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp2RefiningCells.min(addAxis0132) : cp2RefiningCells.max(addAxis0132);
+ cp2RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp2RefiningCells.max(addAxis0451) : cp2RefiningCells.min(addAxis0451);
+ AMRGridCell cp2Ref(cp2RefiningGrid, cp2RefIdx);
+ AMRGrid *cp5RefiningGrid = mAMRDataSet.getGridByIndex(cp5.refiningId());
+ AxisAlignedBox<int> cp5RefiningCells = cp5RefiningGrid->getRefiningCells(cp5.grid(), cp5.idx(xAxis), cp5.idx(yAxis), cp5.idx(zAxis));
+ int cp5RefIdx[3];
+ cp5RefIdx[edgeAxis] = cp5RefiningCells.min(edgeAxis);
+ cp5RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp5RefiningCells.max(addAxis0132) : cp5RefiningCells.min(addAxis0132);
+ cp5RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp5RefiningCells.min(addAxis0451) : cp5RefiningCells.max(addAxis0451);
+ AMRGridCell cp5Ref(cp5RefiningGrid, cp5RefIdx);
+
+ mStitchCellHandler.handleTrianglePrismCell(ep0, cp4, cp0, cp2Ref, cp5Ref, cp1Ref);
+ AMRGridStitcherAuxFct::generateCellsForDeformedTrianglePrism01245(mStitchCellHandler, ep1, ep0, cp2Ref, cp3, cp5Ref, cp1Ref);
+ }
+ }
+ else if (cp5.refiningId() != AMRGrid::NoGrid && cp4.refiningId() == AMRGrid::NoGrid && cp3.refiningId() == AMRGrid::NoGrid && cp2.refiningId() != AMRGrid::NoGrid && cp1.refiningId() != AMRGrid::NoGrid && cp0.refiningId() != AMRGrid::NoGrid) {
+ // Case 39
+ if (mStitchGrid->index() <= cp5.refiningId() && mStitchGrid->index() <= cp2.refiningId() && mStitchGrid->index() <= cp1.refiningId() && cp0.refiningId() <= mStitchGrid->index()) {
+ AMRGrid *cp0RefiningGrid = mAMRDataSet.getGridByIndex(cp0.refiningId());
+ AxisAlignedBox<int> cp0RefiningCells = cp0RefiningGrid->getRefiningCells(cp0.grid(), cp0.idx(xAxis), cp0.idx(yAxis), cp0.idx(zAxis));
+ int cp0RefIdx[3];
+ cp0RefIdx[edgeAxis] = cp0RefiningCells.max(edgeAxis);
+ cp0RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp0RefiningCells.max(addAxis0132) : cp0RefiningCells.min(addAxis0132);
+ cp0RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp0RefiningCells.max(addAxis0451) : cp0RefiningCells.min(addAxis0451);
+ AMRGridCell cp0Ref(cp0RefiningGrid, cp0RefIdx);
+ AMRGrid *cp1RefiningGrid = mAMRDataSet.getGridByIndex(cp1.refiningId());
+ AxisAlignedBox<int> cp1RefiningCells = cp1RefiningGrid->getRefiningCells(cp1.grid(), cp1.idx(xAxis), cp1.idx(yAxis), cp1.idx(zAxis));
+ int cp1RefIdx[3];
+ cp1RefIdx[edgeAxis] = cp1RefiningCells.min(edgeAxis);
+ cp1RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp1RefiningCells.max(addAxis0132) : cp1RefiningCells.min(addAxis0132);
+ cp1RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp1RefiningCells.max(addAxis0451) : cp1RefiningCells.min(addAxis0451);
+ AMRGridCell cp1Ref(cp1RefiningGrid, cp1RefIdx);
+ AMRGrid *cp2RefiningGrid = mAMRDataSet.getGridByIndex(cp2.refiningId());
+ AxisAlignedBox<int> cp2RefiningCells = cp2RefiningGrid->getRefiningCells(cp2.grid(), cp2.idx(xAxis), cp2.idx(yAxis), cp2.idx(zAxis));
+ int cp2RefIdx[3];
+ cp2RefIdx[edgeAxis] = cp2RefiningCells.max(edgeAxis);
+ cp2RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp2RefiningCells.min(addAxis0132) : cp2RefiningCells.max(addAxis0132);
+ cp2RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp2RefiningCells.max(addAxis0451) : cp2RefiningCells.min(addAxis0451);
+ AMRGridCell cp2Ref(cp2RefiningGrid, cp2RefIdx);
+ AMRGrid *cp5RefiningGrid = mAMRDataSet.getGridByIndex(cp5.refiningId());
+ AxisAlignedBox<int> cp5RefiningCells = cp5RefiningGrid->getRefiningCells(cp5.grid(), cp5.idx(xAxis), cp5.idx(yAxis), cp5.idx(zAxis));
+ int cp5RefIdx[3];
+ cp5RefIdx[edgeAxis] = cp5RefiningCells.min(edgeAxis);
+ cp5RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp5RefiningCells.max(addAxis0132) : cp5RefiningCells.min(addAxis0132);
+ cp5RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp5RefiningCells.min(addAxis0451) : cp5RefiningCells.max(addAxis0451);
+ AMRGridCell cp5Ref(cp5RefiningGrid, cp5RefIdx);
+
+ AMRGridStitcherAuxFct::generateCellsForDeformedTrianglePrism02345(mStitchCellHandler, ep0, cp4, cp0Ref, cp2Ref, cp5Ref, cp1Ref);
+ AMRGridStitcherAuxFct::generateCellsForDeformedTrianglePrism01245(mStitchCellHandler, ep1, ep0, cp2Ref, cp3, cp5Ref, cp1Ref);
+ }
+ }
+ else if (cp5.refiningId() != AMRGrid::NoGrid && cp4.refiningId() == AMRGrid::NoGrid && cp3.refiningId() != AMRGrid::NoGrid && cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() == AMRGrid::NoGrid && cp0.refiningId() == AMRGrid::NoGrid) {
+ // Case 40
+ if (mStitchGrid->index() <= cp5.refiningId() && mStitchGrid->index() <= cp3.refiningId()) {
+ AMRGrid *cp3RefiningGrid = mAMRDataSet.getGridByIndex(cp3.refiningId());
+ AxisAlignedBox<int> cp3RefiningCells = cp3RefiningGrid->getRefiningCells(cp3.grid(), cp3.idx(xAxis), cp3.idx(yAxis), cp3.idx(zAxis));
+ int cp3RefIdx[3];
+ cp3RefIdx[edgeAxis] = cp3RefiningCells.min(edgeAxis);
+ cp3RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp3RefiningCells.min(addAxis0132) : cp3RefiningCells.max(addAxis0132);
+ cp3RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp3RefiningCells.max(addAxis0451) : cp3RefiningCells.min(addAxis0451);
+ AMRGridCell cp3Ref(cp3RefiningGrid, cp3RefIdx);
+ AMRGrid *cp5RefiningGrid = mAMRDataSet.getGridByIndex(cp5.refiningId());
+ AxisAlignedBox<int> cp5RefiningCells = cp5RefiningGrid->getRefiningCells(cp5.grid(), cp5.idx(xAxis), cp5.idx(yAxis), cp5.idx(zAxis));
+ int cp5RefIdx[3];
+ cp5RefIdx[edgeAxis] = cp5RefiningCells.min(edgeAxis);
+ cp5RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp5RefiningCells.max(addAxis0132) : cp5RefiningCells.min(addAxis0132);
+ cp5RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp5RefiningCells.min(addAxis0451) : cp5RefiningCells.max(addAxis0451);
+ AMRGridCell cp5Ref(cp5RefiningGrid, cp5RefIdx);
+ AMRGridStitcherAuxFct::generateCellsForDeformedPyramid04(mStitchCellHandler, ep0, cp4, cp0, cp2, cp5Ref);
+ AMRGridStitcherAuxFct::generateCellsForDeformedPyramid04(mStitchCellHandler, cp3Ref, cp2, cp0, cp1, cp5Ref);
+ AMRGridStitcherAuxFct::generateCellsForDeformedPyramid1234(mStitchCellHandler, cp2, cp3Ref, ep1, ep0, cp5Ref);
+ }
+ }
+ else if (cp5.refiningId() != AMRGrid::NoGrid && cp4.refiningId() == AMRGrid::NoGrid && cp3.refiningId() != AMRGrid::NoGrid && cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() == AMRGrid::NoGrid && cp0.refiningId() != AMRGrid::NoGrid) {
+ // Case 41
+ if (mStitchGrid->index() <= cp5.refiningId() && mStitchGrid->index() <= cp3.refiningId() && cp0.refiningId() <= mStitchGrid->index()) {
+ AMRGrid *cp0RefiningGrid = mAMRDataSet.getGridByIndex(cp0.refiningId());
+ AxisAlignedBox<int> cp0RefiningCells = cp0RefiningGrid->getRefiningCells(cp0.grid(), cp0.idx(xAxis), cp0.idx(yAxis), cp0.idx(zAxis));
+ int cp0RefIdx[3];
+ cp0RefIdx[edgeAxis] = cp0RefiningCells.max(edgeAxis);
+ cp0RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp0RefiningCells.max(addAxis0132) : cp0RefiningCells.min(addAxis0132);
+ cp0RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp0RefiningCells.max(addAxis0451) : cp0RefiningCells.min(addAxis0451);
+ AMRGridCell cp0Ref(cp0RefiningGrid, cp0RefIdx);
+ AMRGrid *cp3RefiningGrid = mAMRDataSet.getGridByIndex(cp3.refiningId());
+ AxisAlignedBox<int> cp3RefiningCells = cp3RefiningGrid->getRefiningCells(cp3.grid(), cp3.idx(xAxis), cp3.idx(yAxis), cp3.idx(zAxis));
+ int cp3RefIdx[3];
+ cp3RefIdx[edgeAxis] = cp3RefiningCells.min(edgeAxis);
+ cp3RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp3RefiningCells.min(addAxis0132) : cp3RefiningCells.max(addAxis0132);
+ cp3RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp3RefiningCells.max(addAxis0451) : cp3RefiningCells.min(addAxis0451);
+ AMRGridCell cp3Ref(cp3RefiningGrid, cp3RefIdx);
+ AMRGrid *cp5RefiningGrid = mAMRDataSet.getGridByIndex(cp5.refiningId());
+ AxisAlignedBox<int> cp5RefiningCells = cp5RefiningGrid->getRefiningCells(cp5.grid(), cp5.idx(xAxis), cp5.idx(yAxis), cp5.idx(zAxis));
+ int cp5RefIdx[3];
+ cp5RefIdx[edgeAxis] = cp5RefiningCells.min(edgeAxis);
+ cp5RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp5RefiningCells.max(addAxis0132) : cp5RefiningCells.min(addAxis0132);
+ cp5RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp5RefiningCells.min(addAxis0451) : cp5RefiningCells.max(addAxis0451);
+ AMRGridCell cp5Ref(cp5RefiningGrid, cp5RefIdx);
+
+ AMRGridStitcherAuxFct::generateCellsForDeformedPyramid024(mStitchCellHandler, ep0, cp4, cp0Ref, cp2, cp5Ref);
+ AMRGridStitcherAuxFct::generateCellsForDeformedPyramid024(mStitchCellHandler, cp3Ref, cp2, cp0Ref, cp1, cp5Ref);
+ AMRGridStitcherAuxFct::generateCellsForDeformedPyramid1234(mStitchCellHandler, cp2, cp3Ref, ep1, ep0, cp5Ref);
+ }
+ }
+ else if (cp5.refiningId() != AMRGrid::NoGrid && cp4.refiningId() == AMRGrid::NoGrid && cp3.refiningId() != AMRGrid::NoGrid && cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() != AMRGrid::NoGrid && cp0.refiningId() == AMRGrid::NoGrid) {
+ // Case 42
+ if (mStitchGrid->index() <= cp5.refiningId() && mStitchGrid->index() <= cp3.refiningId() && mStitchGrid->index() <= cp1.refiningId()) {
+ AMRGrid *cp1RefiningGrid = mAMRDataSet.getGridByIndex(cp1.refiningId());
+ AxisAlignedBox<int> cp1RefiningCells = cp1RefiningGrid->getRefiningCells(cp1.grid(), cp1.idx(xAxis), cp1.idx(yAxis), cp1.idx(zAxis));
+ int cp1RefIdx[3];
+ cp1RefIdx[edgeAxis] = cp1RefiningCells.min(edgeAxis);
+ cp1RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp1RefiningCells.max(addAxis0132) : cp1RefiningCells.min(addAxis0132);
+ cp1RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp1RefiningCells.max(addAxis0451) : cp1RefiningCells.min(addAxis0451);
+ AMRGridCell cp1Ref(cp1RefiningGrid, cp1RefIdx);
+ AMRGrid *cp3RefiningGrid = mAMRDataSet.getGridByIndex(cp3.refiningId());
+ AxisAlignedBox<int> cp3RefiningCells = cp3RefiningGrid->getRefiningCells(cp3.grid(), cp3.idx(xAxis), cp3.idx(yAxis), cp3.idx(zAxis));
+ int cp3RefIdx[3];
+ cp3RefIdx[edgeAxis] = cp3RefiningCells.min(edgeAxis);
+ cp3RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp3RefiningCells.min(addAxis0132) : cp3RefiningCells.max(addAxis0132);
+ cp3RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp3RefiningCells.max(addAxis0451) : cp3RefiningCells.min(addAxis0451);
+ AMRGridCell cp3Ref(cp3RefiningGrid, cp3RefIdx);
+ AMRGrid *cp5RefiningGrid = mAMRDataSet.getGridByIndex(cp5.refiningId());
+ AxisAlignedBox<int> cp5RefiningCells = cp5RefiningGrid->getRefiningCells(cp5.grid(), cp5.idx(xAxis), cp5.idx(yAxis), cp5.idx(zAxis));
+ int cp5RefIdx[3];
+ cp5RefIdx[edgeAxis] = cp5RefiningCells.min(edgeAxis);
+ cp5RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp5RefiningCells.max(addAxis0132) : cp5RefiningCells.min(addAxis0132);
+ cp5RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp5RefiningCells.min(addAxis0451) : cp5RefiningCells.max(addAxis0451);
+ AMRGridCell cp5Ref(cp5RefiningGrid, cp5RefIdx);
+ mStitchCellHandler.handlePyramidCell(ep1, cp3Ref, cp1Ref, cp5Ref, ep0);
+ mStitchCellHandler.handlePyramidCell(cp0, cp4, cp5Ref, cp1Ref, ep0);
+ mStitchCellHandler.handlePyramidCell(cp0, cp1Ref, cp3Ref, cp2, ep0);
+ }
+ }
+ else if (cp5.refiningId() != AMRGrid::NoGrid && cp4.refiningId() == AMRGrid::NoGrid && cp3.refiningId() != AMRGrid::NoGrid && cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() != AMRGrid::NoGrid && cp0.refiningId() != AMRGrid::NoGrid) {
+ // Case 43
+ if (mStitchGrid->index() <= cp5.refiningId() && mStitchGrid->index() <= cp3.refiningId() && mStitchGrid->index() <= cp1.refiningId() && mStitchGrid->index() <= cp0.refiningId()) {
+ AMRGrid *cp0RefiningGrid = mAMRDataSet.getGridByIndex(cp0.refiningId());
+ AxisAlignedBox<int> cp0RefiningCells = cp0RefiningGrid->getRefiningCells(cp0.grid(), cp0.idx(xAxis), cp0.idx(yAxis), cp0.idx(zAxis));
+ int cp0RefIdx[3];
+ cp0RefIdx[edgeAxis] = cp0RefiningCells.max(edgeAxis);
+ cp0RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp0RefiningCells.max(addAxis0132) : cp0RefiningCells.min(addAxis0132);
+ cp0RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp0RefiningCells.max(addAxis0451) : cp0RefiningCells.min(addAxis0451);
+ AMRGridCell cp0Ref(cp0RefiningGrid, cp0RefIdx);
+ AMRGrid *cp1RefiningGrid = mAMRDataSet.getGridByIndex(cp1.refiningId());
+ AxisAlignedBox<int> cp1RefiningCells = cp1RefiningGrid->getRefiningCells(cp1.grid(), cp1.idx(xAxis), cp1.idx(yAxis), cp1.idx(zAxis));
+ int cp1RefIdx[3];
+ cp1RefIdx[edgeAxis] = cp1RefiningCells.min(edgeAxis);
+ cp1RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp1RefiningCells.max(addAxis0132) : cp1RefiningCells.min(addAxis0132);
+ cp1RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp1RefiningCells.max(addAxis0451) : cp1RefiningCells.min(addAxis0451);
+ AMRGridCell cp1Ref(cp1RefiningGrid, cp1RefIdx);
+ AMRGrid *cp3RefiningGrid = mAMRDataSet.getGridByIndex(cp3.refiningId());
+ AxisAlignedBox<int> cp3RefiningCells = cp3RefiningGrid->getRefiningCells(cp3.grid(), cp3.idx(xAxis), cp3.idx(yAxis), cp3.idx(zAxis));
+ int cp3RefIdx[3];
+ cp3RefIdx[edgeAxis] = cp3RefiningCells.min(edgeAxis);
+ cp3RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp3RefiningCells.min(addAxis0132) : cp3RefiningCells.max(addAxis0132);
+ cp3RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp3RefiningCells.max(addAxis0451) : cp3RefiningCells.min(addAxis0451);
+ AMRGridCell cp3Ref(cp3RefiningGrid, cp3RefIdx);
+ AMRGrid *cp5RefiningGrid = mAMRDataSet.getGridByIndex(cp5.refiningId());
+ AxisAlignedBox<int> cp5RefiningCells = cp5RefiningGrid->getRefiningCells(cp5.grid(), cp5.idx(xAxis), cp5.idx(yAxis), cp5.idx(zAxis));
+ int cp5RefIdx[3];
+ cp5RefIdx[edgeAxis] = cp5RefiningCells.min(edgeAxis);
+ cp5RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp5RefiningCells.max(addAxis0132) : cp5RefiningCells.min(addAxis0132);
+ cp5RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp5RefiningCells.min(addAxis0451) : cp5RefiningCells.max(addAxis0451);
+ AMRGridCell cp5Ref(cp5RefiningGrid, cp5RefIdx);
+ mStitchCellHandler.handlePyramidCell(ep1, cp3Ref, cp1Ref, cp5Ref, ep0);
+ AMRGridStitcherAuxFct::generateCellsForDeformedPyramid1234(mStitchCellHandler, cp4, cp5Ref, cp1Ref, cp0Ref, ep0);
+ AMRGridStitcherAuxFct::generateCellsForDeformedPyramid1234(mStitchCellHandler, cp2, cp0Ref, cp1Ref, cp3Ref, ep0);
+ }
+ }
+ else if (cp5.refiningId() != AMRGrid::NoGrid && cp4.refiningId() != AMRGrid::NoGrid) {
+ // Case 48 ... 63
+ AMRGrid *cp4RefiningGrid = mAMRDataSet.getGridByIndex(cp4.refiningId());
+ AxisAlignedBox<int> cp4RefiningCells = cp4RefiningGrid->getRefiningCells(cp4.grid(), cp4.idx(xAxis), cp4.idx(yAxis), cp4.idx(zAxis));
+ int cp4RefIdx[3];
+ cp4RefIdx[edgeAxis] = cp4RefiningCells.max(edgeAxis);
+ cp4RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp4RefiningCells.max(addAxis0132) : cp4RefiningCells.min(addAxis0132);
+ cp4RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp4RefiningCells.min(addAxis0451) : cp4RefiningCells.max(addAxis0451);
+ AMRGridCell cp4Ref(cp4RefiningGrid, cp4RefIdx);
+ AMRGrid *cp5RefiningGrid = mAMRDataSet.getGridByIndex(cp5.refiningId());
+ AxisAlignedBox<int> cp5RefiningCells = cp5RefiningGrid->getRefiningCells(cp5.grid(), cp5.idx(xAxis), cp5.idx(yAxis), cp5.idx(zAxis));
+ int cp5RefIdx[3];
+ cp5RefIdx[edgeAxis] = cp5RefiningCells.min(edgeAxis);
+ cp5RefIdx[addAxis0132] = edgeAxis0132Type == min ? cp5RefiningCells.max(addAxis0132) : cp5RefiningCells.min(addAxis0132);
+ cp5RefIdx[addAxis0451] = edgeAxis0451Type == min ? cp5RefiningCells.min(addAxis0451) : cp5RefiningCells.max(addAxis0451);
+ AMRGridCell cp5Ref(cp5RefiningGrid, cp5RefIdx);
+ connectQuadToQuad(ep0, ep1, cp5Ref, cp4Ref, cp2, cp3, cp1, cp0, edgeAxis, addAxis0132, addAxis0451, max, edgeAxis0132Type, edgeAxis0451Type);
+ }
+ else {
+ assert(false);
+ }
+}
+
+ template<class StitchCellHandler>
+void AMRGridStitcher<StitchCellHandler>::connectVertexToQuad(const AMRGridCell& vtx, const AMRGridCell& p0, const AMRGridCell& p1, const AMRGridCell& p2, const AMRGridCell& p3)
+{
+ assert(p0.refiningId() == AMRGrid::NoGrid);
+ if (p1.refiningId() == AMRGrid::NoGrid && p2.refiningId() == AMRGrid::NoGrid && p3.refiningId() == AMRGrid::NoGrid) {
+ mStitchCellHandler.handlePyramidCell(p0, p1, p2, p3, vtx);
+ }
+ else if (p1.refiningId() != AMRGrid::NoGrid && p2.refiningId() == AMRGrid::NoGrid && p3.refiningId() == AMRGrid::NoGrid) {
+ if (mStitchGrid->index() <= p1.refiningId()) {
+ AMRGridStitcherAuxFct::generateCellsForDeformedPyramid04(mStitchCellHandler, p1, p2, p3, p0, vtx);
+ }
+ }
+ else if (p1.refiningId() == AMRGrid::NoGrid && p2.refiningId() != AMRGrid::NoGrid && p3.refiningId() == AMRGrid::NoGrid) {
+ if (mStitchGrid->index() <= p2.refiningId()) {
+ AMRGridStitcherAuxFct::generateCellsForDeformedPyramid04(mStitchCellHandler, p2, p3, p0, p1, vtx);
+ }
+ }
+ else if (p1.refiningId() == AMRGrid::NoGrid && p2.refiningId() == AMRGrid::NoGrid && p3.refiningId() != AMRGrid::NoGrid) {
+ if (mStitchGrid->index() <= p3.refiningId()) {
+ AMRGridStitcherAuxFct::generateCellsForDeformedPyramid04(mStitchCellHandler, p3, p0, p1, p2, vtx);
+ }
+ }
+ else if (p1.refiningId() != AMRGrid::NoGrid && p2.refiningId() != AMRGrid::NoGrid && p3.refiningId() == AMRGrid::NoGrid) {
+ if (mStitchGrid->index() <= p1.refiningId() && mStitchGrid->index() <= p2.refiningId()) {
+ mStitchCellHandler.handlePyramidCell(p0, p1, p2, p3, vtx);
+ }
+ }
+ else if (p1.refiningId() != AMRGrid::NoGrid && p2.refiningId() == AMRGrid::NoGrid && p3.refiningId() != AMRGrid::NoGrid) {
+ if (mStitchGrid->index() <= p1.refiningId() && mStitchGrid->index() <= p3.refiningId()) {
+ AMRGridStitcherAuxFct::generateCellsForDeformedPyramid024(mStitchCellHandler, p1, p2, p3, p0, vtx);
+ }
+ }
+ else if (p1.refiningId() == AMRGrid::NoGrid && p2.refiningId() != AMRGrid::NoGrid && p3.refiningId() != AMRGrid::NoGrid) {
+ if (mStitchGrid->index() <= p1.refiningId() && mStitchGrid->index() <= p2.refiningId()) {
+ mStitchCellHandler.handlePyramidCell(p0, p1, p2, p3, vtx);
+ }
+ }
+ else if (p1.refiningId() != AMRGrid::NoGrid && p2.refiningId() != AMRGrid::NoGrid && p3.refiningId() != AMRGrid::NoGrid) {
+ if (mStitchGrid->index() <= p1.refiningId() && mStitchGrid->index() <= p2.refiningId() && mStitchGrid->index() <= p3.refiningId()) {
+ AMRGridStitcherAuxFct::generateCellsForDeformedPyramid1234(mStitchCellHandler, p0, p1, p2, p3, vtx);
+ }
+ }
+ else {
+ assert(false);
+ }
+
+}
+
+ template<class StitchCellHandler>
+void AMRGridStitcher<StitchCellHandler>::generateCellsForFace(AxisType axis0, AxisType axis1, AxisType axis2, MinMaxType faceType)
+{
+ assert(axis0 != axis1 && axis0 != axis2 && axis1 != axis2);
+
+ try {
+ // Here for k=0. k=refiningGrid->dims[2]-1 analogous
+ // In this step we connect the faces of the refining grid with points in the
+ // refined grid.
+ for (int fFaceIdx0=0; fFaceIdx0<mStitchGrid->dims[axis0]-1; ++fFaceIdx0)
+ for (int fFaceIdx1=0; fFaceIdx1<mStitchGrid->dims[axis1]-1; ++fFaceIdx1) {
+ int cIdx00[3];
+ cIdx00[axis0] = mOriginInParentLevel[axis0] + fFaceIdx0/2;
+ cIdx00[axis1] = mOriginInParentLevel[axis1] + fFaceIdx1/2;
+ if (faceType == min)
+ cIdx00[axis2] = mOriginInParentLevel[axis2] - 1;
+ else
+ cIdx00[axis2] = mMaxExtInParentLevel[axis2] + 1;
+ AMRGridCell cp0 = mParentLevel->getGridCell(cIdx00);
+
+ int cIdx01[3];
+ cIdx01[axis0] = cIdx00[axis0] + 1;
+ cIdx01[axis1] = cIdx00[axis1];
+ cIdx01[axis2] = cIdx00[axis2];
+ AMRGridCell cp3 = mParentLevel->getGridCell(cIdx01);
+
+ int cIdx10[3];
+ cIdx10[axis0] = cIdx00[axis0];
+ cIdx10[axis1] = cIdx00[axis1] + 1;
+ cIdx10[axis2] = cIdx00[axis2];
+ AMRGridCell cp1 = mParentLevel->getGridCell(cIdx10);
+
+ int cIdx11[3];
+ cIdx11[axis0] = cIdx00[axis0] + 1;
+ cIdx11[axis1] = cIdx00[axis1] + 1;
+ cIdx11[axis2] = cIdx00[axis2];
+ AMRGridCell cp2 = mParentLevel->getGridCell(cIdx11);;
+
+ int fIdx00[3];
+ fIdx00[axis0] = fFaceIdx0;
+ fIdx00[axis1] = fFaceIdx1;
+ if (faceType == min)
+ fIdx00[axis2] = 0;
+ else
+ fIdx00[axis2] = mStitchGrid->dims[axis2] - 1;
+ AMRGridCell fp0(mStitchGrid, fIdx00[0], fIdx00[1], fIdx00[2]);
+
+ int fIdx01[3];
+ fIdx01[axis0] = fIdx00[axis0] + 1;
+ fIdx01[axis1] = fIdx00[axis1];
+ fIdx01[axis2] = fIdx00[axis2];
+ AMRGridCell fp3(mStitchGrid, fIdx01[0], fIdx01[1], fIdx01[2]);
+
+ int fIdx10[3];
+ fIdx10[axis0] = fIdx00[axis0];
+ fIdx10[axis1] = fIdx00[axis1] + 1;
+ fIdx10[axis2] = fIdx00[axis2];
+ AMRGridCell fp1(mStitchGrid, fIdx10[0], fIdx10[1], fIdx10[2]);
+
+ int fIdx11[3];
+ fIdx11[axis0] = fIdx00[axis0] + 1;
+ fIdx11[axis1] = fIdx00[axis1] + 1;
+ fIdx11[axis2] = fIdx00[axis2];
+ AMRGridCell fp2(mStitchGrid, fIdx11[0], fIdx11[1], fIdx11[2]);
+
+ // Compute combination from 2D case. If i is even, we connect with the corresponding
+ // point, if it is odd, we connect with the corresponding edge. The same for j.
+ // The combination yields:
+ // Axis 1 Axis 0 Result
+ // ======================
+ // point point point
+ // point edge edge 0 (parallel axis 0)
+ // edge point edge 1 (parallel to axis 1)
+ // edge edge quad
+ enum ConnectionTypeType { Point = 0, Edge0 = 1, Edge1 = 2, Quad = 3 };
+ ConnectionTypeType connectionType = ConnectionTypeType((fFaceIdx1%2) << 1 | fFaceIdx0%2);
+ switch (connectionType) {
+ case Point:
+ connectQuadToVertex(fp0, fp1, fp2, fp3, cp0, axis0, axis1, axis2, faceType);
+ break;
+ case Edge0:
+ //connectQuadToAxis0Edge(fp0, fp1, fp2, fp3, cp0, cp3, axis0, axis1, axis2, faceType);
+ connectQuadToEdge(fp0, fp1, fp2, fp3, cp0, cp3, axis1, axis0, axis2, min, max, faceType);
+ break;
+ case Edge1:
+ //connectQuadToAxis1Edge(fp0, fp1, fp2, fp3, cp0, cp1, axis0, axis1, axis2, faceType);
+ connectQuadToEdge(fp3, fp0, fp1, fp2, cp0, cp1, axis0, axis1, axis2, max, max, faceType);
+ break;
+ case Quad:
+ connectQuadToQuad(fp0, fp1, fp2, fp3, cp0, cp1, cp2, cp3, axis1, axis0, axis2, max, max, faceType);
+ break;
+ default:
+ std::cerr << "Internal Error (generateCellsForFace(AxisType, AxisType, AxisType)): Invalid enum value." << std::endl;
+ abort();
+ }
+ }
+ }
+ catch (AMRLevel::NoGrid ng) {
+ std::cerr << "Error (AMRGridStitcher::generateCellsForFace(AxisType, AxisType, AxisType, MinMaxType): " << ng << std::endl;
+ }
+}
+
+ template<class StitchCellHandler>
+void AMRGridStitcher<StitchCellHandler>::generateCellsForEdge(AxisType edgeAxis, AxisType nonEdgeAxis0, MinMaxType nonEdgeAxis0Type, AxisType nonEdgeAxis1, MinMaxType nonEdgeAxis1Type)
+{
+ AxisType addAxis0132;
+ AxisType addAxis0451;
+ MinMaxType addAxis0132Type;
+ MinMaxType addAxis0451Type;
+ if (nonEdgeAxis1Type == min && nonEdgeAxis0Type == min) {
+ addAxis0132 = nonEdgeAxis0;
+ addAxis0451 = nonEdgeAxis1;
+ addAxis0132Type = min;
+ addAxis0451Type = min;
+ }
+ else if (nonEdgeAxis1Type == min && nonEdgeAxis0Type == max) {
+ addAxis0132 = nonEdgeAxis1;
+ addAxis0451 = nonEdgeAxis0;
+ addAxis0132Type = min;
+ addAxis0451Type = max;
+ }
+ if (nonEdgeAxis1Type == max && nonEdgeAxis0Type == min) {
+ addAxis0132 = nonEdgeAxis1;
+ addAxis0451 = nonEdgeAxis0;
+ addAxis0132Type = max;
+ addAxis0451Type = min;
+ }
+ if (nonEdgeAxis1Type == max && nonEdgeAxis0Type == max) {
+ addAxis0132 = nonEdgeAxis0;
+ addAxis0451 = nonEdgeAxis1;
+ addAxis0132Type = max;
+ addAxis0451Type = max;
+ }
+
+ try {
+ for (int edgeIdx=0; edgeIdx<mStitchGrid->dims[edgeAxis]-1; ++edgeIdx) {
+ int cIdx0[3];
+ cIdx0[edgeAxis] = mOriginInParentLevel[edgeAxis] + edgeIdx/2;
+ if (nonEdgeAxis0Type == min)
+ cIdx0[nonEdgeAxis0] = mOriginInParentLevel[nonEdgeAxis0] - 1;
+ else
+ cIdx0[nonEdgeAxis0] = mMaxExtInParentLevel[nonEdgeAxis0] + 1;
+ if (nonEdgeAxis1Type == min)
+ cIdx0[nonEdgeAxis1] = mOriginInParentLevel[nonEdgeAxis1] - 1;
+ else
+ cIdx0[nonEdgeAxis1] = mMaxExtInParentLevel[nonEdgeAxis1] + 1;
+ AMRGridCell cp0 = mParentLevel->getGridCell(cIdx0);
+
+ int cIdx1[3];
+ cIdx1[edgeAxis] = cIdx0[edgeAxis] + 1;
+ cIdx1[nonEdgeAxis0] = cIdx0[nonEdgeAxis0];
+ cIdx1[nonEdgeAxis1] = cIdx0[nonEdgeAxis1];
+ AMRGridCell cp1 = mParentLevel->getGridCell(cIdx1);
+
+ int cIdx2[3];
+ cIdx2[edgeAxis] = cIdx0[edgeAxis];
+ if (addAxis0132Type == min)
+ cIdx2[addAxis0132] = cIdx0[addAxis0132] + 1;
+ else
+ cIdx2[addAxis0132] = cIdx0[addAxis0132] - 1;
+ cIdx2[addAxis0451] = cIdx0[addAxis0451];
+ AMRGridCell cp2 = mParentLevel->getGridCell(cIdx2);
+
+ int cIdx3[3];
+ cIdx3[edgeAxis] = cIdx2[edgeAxis] + 1;
+ cIdx3[addAxis0132] = cIdx2[addAxis0132];
+ cIdx3[addAxis0451] = cIdx2[addAxis0451];
+ AMRGridCell cp3 = mParentLevel->getGridCell(cIdx3);
+
+ int cIdx4[3];
+ cIdx4[edgeAxis] = cIdx0[edgeAxis];
+ cIdx4[addAxis0132] = cIdx0[addAxis0132];
+ if (addAxis0451Type == min)
+ cIdx4[addAxis0451] = cIdx0[addAxis0451] + 1;
+ else
+ cIdx4[addAxis0451] = cIdx0[addAxis0451] - 1;
+ AMRGridCell cp4 = mParentLevel->getGridCell(cIdx4);
+
+ int cIdx5[3];
+ cIdx5[edgeAxis] = cIdx4[edgeAxis] + 1;
+ cIdx5[addAxis0132] = cIdx4[addAxis0132];
+ cIdx5[addAxis0451] = cIdx4[addAxis0451];
+ AMRGridCell cp5 = mParentLevel->getGridCell(cIdx5);
+
+ int eIdx0[3];
+ eIdx0[edgeAxis] = edgeIdx;
+ if (nonEdgeAxis0Type == min)
+ eIdx0[nonEdgeAxis0] = 0;
+ else
+ eIdx0[nonEdgeAxis0] = mStitchGrid->dims[nonEdgeAxis0]-1;
+ if (nonEdgeAxis1Type == min)
+ eIdx0[nonEdgeAxis1] = 0;
+ else
+ eIdx0[nonEdgeAxis1] = mStitchGrid->dims[nonEdgeAxis1]-1;
+ AMRGridCell ep0(mStitchGrid, eIdx0[0], eIdx0[1], eIdx0[2]);
+
+ int eIdx1[3];
+ eIdx1[edgeAxis] = eIdx0[edgeAxis] + 1;
+ eIdx1[nonEdgeAxis0] = eIdx0[nonEdgeAxis0];
+ eIdx1[nonEdgeAxis1] = eIdx0[nonEdgeAxis1];
+ AMRGridCell ep1(mStitchGrid, eIdx1[0], eIdx1[1], eIdx1[2]);
+
+ if (edgeIdx % 2) {
+ connectEdgeSegmentToQuads(ep0, ep1, cp0, cp1, cp2, cp3, cp4, cp5, edgeAxis, addAxis0132, addAxis0132Type, addAxis0451, addAxis0451Type);
+ }
+ else {
+ connectEdgeSegmentToEdges(ep0, ep1, cp0, cp2, cp4, edgeAxis, addAxis0132, addAxis0132Type, addAxis0451, addAxis0451Type);
+ }
+ }
+ }
+ catch (AMRLevel::NoGrid ng) {
+ std::cerr << "Error (AMRGridStitcher::generateCellsForEdge(AxisType, AxisType, MinMaxType, AxisType, MinMaxType): " << ng << std::endl;
+ }
+}
+
+ template<class StitchCellHandler>
+void AMRGridStitcher<StitchCellHandler>::generateCellsForVertex(AxisType axis0, AxisType axis1, AxisType axis2, MinMaxType axis0VertexType, MinMaxType axis1VertexType, MinMaxType axis2VertexType)
+{
+ try {
+ int fIdx[3];
+ fIdx[axis0] = axis0VertexType == min ? 0 : mStitchGrid->dims[axis0] - 1;
+ fIdx[axis1] = axis1VertexType == min ? 0 : mStitchGrid->dims[axis1] - 1;
+ fIdx[axis2] = axis2VertexType == min ? 0 : mStitchGrid->dims[axis2] - 1;
+ AMRGridCell fp(mStitchGrid, fIdx);
+
+ int cp0Idx[3];
+ cp0Idx[axis0] = axis0VertexType == min ? mOriginInParentLevel[axis0] - 1 : mMaxExtInParentLevel[axis0] + 1;
+ cp0Idx[axis1] = axis1VertexType == min ? mOriginInParentLevel[axis1] - 1 : mMaxExtInParentLevel[axis1] + 1;
+ cp0Idx[axis2] = axis2VertexType == min ? mOriginInParentLevel[axis2] - 1 : mMaxExtInParentLevel[axis2] + 1;
+ AMRGridCell cp0 = mParentLevel->getGridCell(cp0Idx);
+
+ int cp1Idx[3];
+ cp1Idx[axis0] = cp0Idx[axis0];
+ cp1Idx[axis1] = axis1VertexType == min ? cp0Idx[axis1] + 1 : cp0Idx[axis1] - 1;
+ cp1Idx[axis2] = cp0Idx[axis2];
+ AMRGridCell cp1 = mParentLevel->getGridCell(cp1Idx);
+
+ int cp2Idx[3];
+ cp2Idx[axis0] = axis0VertexType == min ? cp0Idx[axis0] + 1 : cp0Idx[axis0] - 1;
+ cp2Idx[axis1] = cp0Idx[axis1];
+ cp2Idx[axis2] = cp0Idx[axis2];
+ AMRGridCell cp2 = mParentLevel->getGridCell(cp2Idx);
+
+ int cp3Idx[3];
+ cp3Idx[axis0] = axis0VertexType == min ? cp1Idx[axis0] + 1 : cp1Idx[axis0] - 1;
+ cp3Idx[axis1] = cp1Idx[axis1];
+ cp3Idx[axis2] = cp1Idx[axis2];
+ AMRGridCell cp3 = mParentLevel->getGridCell(cp3Idx);
+
+ int cp4Idx[3];
+ cp4Idx[axis0] = cp0Idx[axis0];
+ cp4Idx[axis1] = cp0Idx[axis1];
+ cp4Idx[axis2] = axis2VertexType == min ? cp0Idx[axis2] + 1 : cp0Idx[axis2] - 1;
+ AMRGridCell cp4 = mParentLevel->getGridCell(cp4Idx);
+
+ int cp5Idx[3];
+ cp5Idx[axis0] = cp1Idx[axis0];
+ cp5Idx[axis1] = cp1Idx[axis1];
+ cp5Idx[axis2] = axis2VertexType == min ? cp1Idx[axis2] + 1 : cp1Idx[axis2] - 1;
+ AMRGridCell cp5 = mParentLevel->getGridCell(cp5Idx);
+
+ int cp6Idx[3];
+ cp6Idx[axis0] = cp2Idx[axis0];
+ cp6Idx[axis1] = cp0Idx[axis1];
+ cp6Idx[axis2] = cp4Idx[axis2];
+ AMRGridCell cp6 = mParentLevel->getGridCell(cp6Idx);
+
+ if (cp6.refiningId() == AMRGrid::NoGrid && cp5.refiningId() == AMRGrid::NoGrid && cp4.refiningId() == AMRGrid::NoGrid && cp3.refiningId() == AMRGrid::NoGrid && cp2.refiningId() == AMRGrid::NoGrid && cp1.refiningId() == AMRGrid::NoGrid && cp0.refiningId() == AMRGrid::NoGrid) {
+ mStitchCellHandler.handlePyramidCell(cp0, cp2, cp3, cp1, fp);
+ mStitchCellHandler.handlePyramidCell(cp0, cp1, cp5, cp4, fp);
+ mStitchCellHandler.handlePyramidCell(cp0, cp4, cp6, cp2, fp);
+ }
+ else if (!(cp3.refiningId() != AMRGrid::NoGrid || cp5.refiningId() != AMRGrid::NoGrid || cp6.refiningId() != AMRGrid::NoGrid)) {
+ connectVertexToQuad(fp, cp3, cp1, cp0, cp2);
+ connectVertexToQuad(fp, cp5, cp4, cp0, cp1);
+ connectVertexToQuad(fp, cp6, cp2, cp0, cp4);
+ }
+ else if (cp3.refiningId() != AMRGrid::NoGrid) {
+ AMRGrid *cp3RefiningGrid = mAMRDataSet.getGridByIndex(cp3.refiningId());
+ AxisAlignedBox<int> cp3RefiningCells = cp3RefiningGrid->getRefiningCells(cp3.grid(), cp3.idx(xAxis), cp3.idx(yAxis), cp3.idx(zAxis));
+ int cp3RefIdx[3];
+ cp3RefIdx[axis0] = axis0VertexType == min ? cp3RefiningCells.min(axis0) : cp3RefiningCells.max(axis0);
+ cp3RefIdx[axis1] = axis1VertexType == min ? cp3RefiningCells.min(axis1) : cp3RefiningCells.max(axis1);
+ cp3RefIdx[axis2] = axis2VertexType == min ? cp3RefiningCells.max(axis2) : cp3RefiningCells.min(axis2);
+ AMRGridCell cp3Ref(cp3RefiningGrid, cp3RefIdx);
+ if (axis2VertexType == min)
+ connectEdgeSegmentToQuads(cp3Ref, fp, cp0, cp4, cp2, cp6, cp1, cp5, axis2, axis0, axis0VertexType, axis1, axis1VertexType);
+ else
+ connectEdgeSegmentToQuads(fp, cp3Ref, cp4, cp0, cp5, cp1, cp6, cp2, axis2, axis1, axis1VertexType, axis0, axis0VertexType);
+ }
+ else if (cp5.refiningId() != AMRGrid::NoGrid) {
+ AMRGrid *cp5RefiningGrid = mAMRDataSet.getGridByIndex(cp5.refiningId());
+ AxisAlignedBox<int> cp5RefiningCells = cp5RefiningGrid->getRefiningCells(cp5.grid(), cp5.idx(xAxis), cp5.idx(yAxis), cp5.idx(zAxis));
+ int cp5RefIdx[3];
+ cp5RefIdx[axis0] = axis0VertexType == min ? cp5RefiningCells.max(axis0) : cp5RefiningCells.min(axis0);
+ cp5RefIdx[axis1] = axis1VertexType == min ? cp5RefiningCells.min(axis1) : cp5RefiningCells.max(axis1);
+ cp5RefIdx[axis2] = axis2VertexType == min ? cp5RefiningCells.min(axis2) : cp5RefiningCells.max(axis2);
+ AMRGridCell cp5Ref(cp5RefiningGrid, cp5RefIdx);
+ if (axis0VertexType == min)
+ connectEdgeSegmentToQuads(cp5Ref, fp, cp0, cp2, cp1, cp3, cp4, cp6, axis0, axis1, axis1VertexType, axis2, axis2VertexType);
+ else
+ connectEdgeSegmentToQuads(fp, cp5Ref, cp2, cp0, cp6, cp4, cp3, cp1, axis0, axis2, axis2VertexType, axis1, axis1VertexType);
+ }
+ else if (cp6.refiningId() != AMRGrid::NoGrid) {
+ AMRGrid *cp6RefiningGrid = mAMRDataSet.getGridByIndex(cp6.refiningId());
+ AxisAlignedBox<int> cp6RefiningCells = cp6RefiningGrid->getRefiningCells(cp6.grid(), cp6.idx(xAxis), cp6.idx(yAxis), cp6.idx(zAxis));
+ int cp6RefIdx[3];
+ cp6RefIdx[axis0] = axis0VertexType == min ? cp6RefiningCells.min(axis0) : cp6RefiningCells.max(axis0);
+ cp6RefIdx[axis1] = axis1VertexType == min ? cp6RefiningCells.max(axis1) : cp6RefiningCells.min(axis1);
+ cp6RefIdx[axis2] = axis2VertexType == min ? cp6RefiningCells.min(axis2) : cp6RefiningCells.max(axis2);
+ AMRGridCell cp6Ref(cp6RefiningGrid, cp6RefIdx);
+ if (axis0VertexType == min)
+ connectEdgeSegmentToQuads(cp6Ref, fp, cp0, cp1, cp4, cp5, cp2, cp3, axis1, axis2, axis2VertexType, axis0, axis0VertexType);
+ else
+ connectEdgeSegmentToQuads(fp, cp6Ref, cp1, cp0, cp3, cp2, cp5, cp4, axis1, axis0, axis0VertexType, axis2, axis2VertexType);
+ }
+ }
+ catch (AMRLevel::NoGrid ng) {
+ std::cerr << "Error (AMRGridStitcher::generateCellsForVertex(AxisType, AxisType, AxisType, MinMaxType, MinMaxType, MinMaxType): " << ng << std::endl;
+ }
+}