117 |
for(typename EdgeElements::iterator i = edgeElements.begin(); |
for(typename EdgeElements::iterator i = edgeElements.begin(); |
118 |
i != edgeElements.end(); ++i) { |
i != edgeElements.end(); ++i) { |
119 |
const Edge::Pair& e = (*i).first; |
const Edge::Pair& e = (*i).first; |
120 |
const real_t norm = Norm(e.first->Vector3()-e.second->Vector3()); |
const real_t norm = Norm(*(e.first)-*(e.second)); |
121 |
edgeSizes[norm] = (*i).first; |
edgeSizes[norm] = (*i).first; |
122 |
maxSize = std::max(norm, maxSize); |
maxSize = std::max(norm, maxSize); |
123 |
} |
} |
124 |
|
|
125 |
// Edge collapsing |
// Edge collapsing |
126 |
for (typename EdgeSizes::iterator i = edgeSizes.begin(); |
for (typename EdgeSizes::iterator i = edgeSizes.begin(); |
127 |
(*i).first < 0.5*maxSize; ++i) { |
(*i).first < 0.1*maxSize; ++i) { |
128 |
|
if (edgeElements.find((*i).second) != edgeElements.end()) { |
129 |
|
|
130 |
TinyVector<ElementType::NumberOfVertices, const Vertex*> newVertices; |
TinyVector<ElementType::NumberOfVertices, const Vertex*> newVertices; |
131 |
|
|
132 |
Vertex* v0 = ((*i).second).first; |
Vertex* v0 = ((*i).second).first; |
133 |
Vertex* v1 = ((*i).second).second; |
Vertex* v1 = ((*i).second).second; |
134 |
|
|
135 |
size_t v0Number = (*vertices).number(*v0); |
size_t v1Number = (*vertices).number(*v1); |
136 |
|
|
137 |
std::set<ElementType*>& trianglesToModify = vertexTriangles[v1]; |
std::set<ElementType*>& trianglesToModify = vertexTriangles[v1]; |
138 |
|
|
139 |
for(typename std::list<ElementType*>::iterator |
fferr(0) << "Points: " << v0 << ':' << v1 << '\n'; |
140 |
j = edgeElements[(*i).second].begin(); |
|
141 |
j != edgeElements[(*i).second].end(); ++j) { |
for(typename std::list<ElementType*>::iterator |
142 |
intermediateCells.erase(*j); |
j = edgeElements[(*i).second].begin(); |
143 |
trianglesToModify.erase(*j); |
j != edgeElements[(*i).second].end(); ++j) { |
144 |
} |
for (size_t n=0; n<3; ++n) { |
145 |
|
const Edge& E = (*(*j)).edge(n); |
146 |
for (typename std::set<ElementType*>::iterator tt = trianglesToModify.begin(); |
if (edgeElements.find(E) != edgeElements.end()) |
147 |
tt != trianglesToModify.end(); ++tt) { |
edgeElements.erase(E); |
148 |
(*tt)->replace(v1, v0); |
} |
149 |
|
intermediateCells.erase(*j); |
150 |
|
trianglesToModify.erase(*j); |
151 |
|
} |
152 |
|
|
153 |
|
for (typename std::set<ElementType*>::iterator tt = trianglesToModify.begin(); |
154 |
|
tt != trianglesToModify.end(); ++tt) { |
155 |
|
fferr(0) << "before: " << &(*(*tt))(0) << ':' << &(*(*tt))(1) << ':' << &(*(*tt))(2) << '\n'; |
156 |
|
(*tt)->replace(v1, v0); |
157 |
|
fferr(0) << "after : " << &(*(*tt))(0) << ':' << &(*(*tt))(1) << ':' << &(*(*tt))(2) << '\n'; |
158 |
|
for (size_t l=0; l<3; ++l) { |
159 |
|
if (&(*(*tt))(l) != v0) { |
160 |
|
fferr(3) << "="; |
161 |
|
Edge newEdge((*(*tt))(l), *v0); |
162 |
|
edgeElements[newEdge].push_back(*tt); |
163 |
|
} |
164 |
|
} |
165 |
|
fferr(0) << '\n'; |
166 |
|
} |
167 |
|
|
168 |
|
// clean the vertex to edge correspondance |
169 |
|
// std::set<Edge::Pair>& v1Edges = vertexEdges[v1Number]; |
170 |
|
// for (std::set<Edge::Pair>::iterator e = v1Edges.begin(); |
171 |
|
// e != v1Edges.end(); ++e) { |
172 |
|
// edgeElements.erase((*e)); |
173 |
|
// } |
174 |
|
vertexEdges.erase(v1Number); |
175 |
} |
} |
176 |
|
// clean-up the list! |
177 |
|
edgeSizes.erase(i); |
178 |
|
fferr(0) << "----\n"; |
179 |
} |
} |
180 |
|
|
181 |
ReferenceCounting<Vector<ElementType> > cells |
ReferenceCounting<Vector<ElementType> > cells |