[cig-commits] r17881 - short/3D/PyLith/trunk/libsrc/topology
knepley at geodynamics.org
knepley at geodynamics.org
Tue Feb 15 17:15:56 PST 2011
Author: knepley
Date: 2011-02-15 17:15:55 -0800 (Tue, 15 Feb 2011)
New Revision: 17881
Modified:
short/3D/PyLith/trunk/libsrc/topology/RefineVol8Face4Edges2.cc
Log:
First try at Hex8 refinement
Modified: short/3D/PyLith/trunk/libsrc/topology/RefineVol8Face4Edges2.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/topology/RefineVol8Face4Edges2.cc 2011-02-16 00:40:19 UTC (rev 17880)
+++ short/3D/PyLith/trunk/libsrc/topology/RefineVol8Face4Edges2.cc 2011-02-16 01:15:55 UTC (rev 17881)
@@ -294,7 +294,6 @@
const Obj<mesh_type>& oldMesh,
const MeshOrder& orderOldMesh)
{ // overlapAddNewVertices
-#if 0
assert(!newMesh.isNull());
assert(!oldMesh.isNull());
@@ -334,10 +333,10 @@
std::insert_iterator<std::set<int> >(ranks, ranks.begin()));
if(ranks.size()) {
- newVerticesSection->addFiberDimension(std::min(e_iter->first.first, e_iter->first.second)+localOffset, 1);
- for(std::set<int>::const_iterator r_iter = ranks.begin(); r_iter != ranks.end(); ++r_iter) {
- bndryEdgeToRank[e_iter->first].push_back(*r_iter);
- } // for
+ newVerticesSection->addFiberDimension(std::min(e_iter->first.first, e_iter->first.second)+localOffset, 1);
+ for(std::set<int>::const_iterator r_iter = ranks.begin(); r_iter != ranks.end(); ++r_iter) {
+ bndryEdgeToRank[e_iter->first].push_back(*r_iter);
+ } // for
} // if
} // if
} // for
@@ -414,22 +413,42 @@
int v = 0;
value_type* values = (dim > 0) ? new value_type[dim] : 0;
-#if 0
for(std::map<FaceType, std::vector<int> >::const_iterator f_iter = bndryFaceToRank.begin(); f_iter != bndryFaceToRank.end() && v < dim; ++f_iter) {
- if (std::min(f_iter->first.first, f_iter->first.second)+localOffset == p) {
- values[v++] = FaceType(std::max(f_iter->first.first, f_iter->first.second)+localOffset, _faceToVertex[f_iter->first]);
+ const point_type first = f_iter->first.points[0];
+ point_type minVertex = first;
+
+ for(int i = 1; i < 4; ++i) {
+ const point_type nextVertex = f_iter->first.points[i];
+ minVertex = std::min(nextVertex, minVertex);
+ }
+
+ if (minVertex+localOffset == p) {
+ FaceType face;
+ int k = 0;
+
+ for(int i = 0; i < 4; ++i) {
+ if (f_iter->first.points[i] != minVertex) {
+ face.points[k++] = f_iter->first.points[i];
+ }
+ }
+ assert(k == 3);
+ std::sort(&face.points[0], &face.points[3]);
+ face.points[3] = _faceToVertex[f_iter->first];
+ values[v++] = face;
} // if
} // for
-#endif
+ assert(v == dim);
newFaceVerticesSection->updatePoint(p, values);
delete [] values;
} // for
// Copy across overlap
typedef ALE::Pair<int, point_type> overlap_point_type;
- Obj<ALE::Section<overlap_point_type, EdgeType> > overlapVertices = new ALE::Section<overlap_point_type, EdgeType>(oldMesh->comm());
+ Obj<ALE::Section<overlap_point_type, EdgeType> > overlapVertices = new ALE::Section<overlap_point_type, EdgeType>(oldMesh->comm());
+ Obj<ALE::Section<overlap_point_type, FaceType> > overlapFaceVertices = new ALE::Section<overlap_point_type, FaceType>(oldMesh->comm());
- ALE::Pullback::SimpleCopy::copy(newSendOverlap, newRecvOverlap, newVerticesSection, overlapVertices);
+ ALE::Pullback::SimpleCopy::copy(newSendOverlap, newRecvOverlap, newVerticesSection, overlapVertices);
+ ALE::Pullback::SimpleCopy::copy(newSendOverlap, newRecvOverlap, newFaceVerticesSection, overlapFaceVertices);
// Merge by translating edge to local points, finding edge in _edgeToVertex, and adding (local new vetex, remote new vertex) to overlap
for(std::map<EdgeType, std::vector<int> >::const_iterator e_iter = bndryEdgeToRank.begin(); e_iter != bndryEdgeToRank.end(); ++e_iter) {
const point_type localPoint = _edgeToVertex[e_iter->first];
@@ -440,43 +459,84 @@
const Obj<mesh_type::send_overlap_type::traits::supportSequence>& leftRanks = newSendOverlap->support(e_iter->first.first+localOffset);
for(mesh_type::send_overlap_type::traits::supportSequence::iterator lr_iter = leftRanks->begin(); lr_iter != leftRanks->end(); ++lr_iter) {
- if (rank == *lr_iter) {
- remoteLeft = lr_iter.color();
- break;
- } // if
+ if (rank == *lr_iter) {
+ remoteLeft = lr_iter.color();
+ break;
+ } // if
} // for
const Obj<mesh_type::send_overlap_type::traits::supportSequence>& rightRanks = newSendOverlap->support(e_iter->first.second+localOffset);
for(mesh_type::send_overlap_type::traits::supportSequence::iterator rr_iter = rightRanks->begin(); rr_iter != rightRanks->end(); ++rr_iter) {
- if (rank == *rr_iter) {
- remoteRight = rr_iter.color();
- break;
- } // if
+ if (rank == *rr_iter) {
+ remoteRight = rr_iter.color();
+ break;
+ } // if
} // for
const point_type remoteMin = std::min(remoteLeft, remoteRight);
const point_type remoteMax = std::max(remoteLeft, remoteRight);
const int remoteSize = overlapVertices->getFiberDimension(overlap_point_type(rank, remoteMin));
- const EdgeType *remoteVals = overlapVertices->restrictPoint(overlap_point_type(rank, remoteMin));
+ const EdgeType *remoteVals = overlapVertices->restrictPoint(overlap_point_type(rank, remoteMin));
point_type remotePoint = -1;
for(int d = 0; d < remoteSize; ++d) {
- if (remoteVals[d].first == remoteMax) {
- remotePoint = remoteVals[d].second;
- break;
- } // if
+ if (remoteVals[d].first == remoteMax) {
+ remotePoint = remoteVals[d].second;
+ break;
+ } // if
} // for
newSendOverlap->addArrow(localPoint, rank, remotePoint);
newRecvOverlap->addArrow(rank, localPoint, remotePoint);
} // for
} // for
+ // Merge by translating face to local points, finding face in _faceToVertex, and adding (local new vetex, remote new vertex) to overlap
+ for(std::map<FaceType, std::vector<int> >::const_iterator f_iter = bndryFaceToRank.begin(); f_iter != bndryFaceToRank.end(); ++f_iter) {
+ const point_type localPoint = _faceToVertex[f_iter->first];
+
+ for(std::vector<int>::const_iterator r_iter = f_iter->second.begin(); r_iter != f_iter->second.end(); ++r_iter) {
+ FaceType remoteVertices(-1);
+ const int rank = *r_iter;
-#if 1
+ for(int i = 0; i < 4; ++i) {
+ const Obj<mesh_type::send_overlap_type::traits::supportSequence>& faceRanks = newSendOverlap->support(f_iter->first.points[i]+localOffset);
+ for(mesh_type::send_overlap_type::traits::supportSequence::iterator fr_iter = faceRanks->begin(); fr_iter != faceRanks->end(); ++fr_iter) {
+ if (rank == *fr_iter) {
+ remoteVertices.points[i] = fr_iter.color();
+ break;
+ } // if
+ } // for
+ }
+ const point_type remoteMin = std::min(std::min(std::min(remoteVertices.points[0], remoteVertices.points[1]), remoteVertices.points[2]), remoteVertices.points[3]);
+ const int remoteSize = overlapFaceVertices->getFiberDimension(overlap_point_type(rank, remoteMin));
+ const FaceType *remoteVals = overlapFaceVertices->restrictPoint(overlap_point_type(rank, remoteMin));
+ point_type remotePoint = -1;
+ int k = 0;
+ FaceType remoteMax;
+
+ for(int i = 0; i < 4; ++i) {
+ if (remoteVertices.points[i] == remoteMin) continue;
+ remoteMax.points[k++] = remoteVertices.points[i];
+ }
+ assert(k == 3);
+ std::sort(&remoteMax.points[0], &remoteMax.points[3]);
+ for(int d = 0; d < remoteSize; ++d) {
+ int i = 0;
+
+ for(i = 0; i < 3; ++i) {
+ if (remoteVals[d].points[i] != remoteMax.points[i]) break;
+ }
+ if (i == 3) {
+ remotePoint = remoteVals[d].points[3];
+ break;
+ } // if
+ } // for
+ newSendOverlap->addArrow(localPoint, rank, remotePoint);
+ newRecvOverlap->addArrow(rank, localPoint, remotePoint);
+ } // for
+ } // for
+
oldSendOverlap->view("OLD SEND OVERLAP");
oldRecvOverlap->view("OLD RECV OVERLAP");
newSendOverlap->view("NEW SEND OVERLAP");
newRecvOverlap->view("NEW RECV OVERLAP");
-#endif
-
-#endif
} // overlapAddNewVertces
More information about the CIG-COMMITS
mailing list