00001 #include "DAPTA.hpp"
00002
00003 namespace DAPTA {
00004
00005
00006
00007
00008
00009 template <typename Traits>
00010 void Mesh<Traits>::FractureFace(ElementHandle e, int f) {
00011
00012 int f_2=ElementType::num_adjacents;
00013 ElementHandle e_2 = e->adjacents.at(f);
00014
00015
00016 if(e_2 == NULL)
00017 return;
00018
00019
00020 if(e->coh_adjacents.at(f) != NULL)
00021 return;
00022
00023 FaceElementType face_1 = e->GetFace(f);
00024 FaceElementType face_2 = face_1;
00025 bool found_face_2 = false;
00026
00027 for(int i=0; i<ElementType::num_adjacents; i++) {
00028 face_2 = e_2->GetFace(i);
00029
00030 if((!face_2 == face_1)) {
00031 found_face_2 = true;
00032 f_2 = i;
00033 break;
00034 }
00035 }
00036 assert(found_face_2);
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 std::vector<EdgeElementType> frac_edges = e->GetEdges(f);
00058
00059
00060
00061
00062
00063
00064 for(int i=0; i<frac_edges.size(); i++) {
00065 std::sort(frac_edges.at(i).vertices.begin(), frac_edges.at(i).vertices.end(), IDComparison<VertexType>());
00066 edges[frac_edges.at(i)]->break_chain(e->globalID, e_2->globalID);
00067 }
00068
00069 CohElementHandle coh_elem = new CohElementType(e, f, e_2, f_2);
00070 e->coh_adjacents.at(f) = coh_elem;
00071 e_2->coh_adjacents.at(f_2) = coh_elem;
00072
00073 AddCohElement(coh_elem);
00074
00075
00076 }
00077
00078 template <typename Traits>
00079 void Mesh<Traits>::UpdateEdges() {
00080 for(EdgeMapIterator iter=EdgeMapBegin(); iter!=EdgeMapEnd(); ++iter) {
00081
00082 if(iter->second->needSplit()) {
00083 std::vector<typename ElementConListType::iterator> del_iters;
00084 for(typename ElementConListType::iterator edge_iter=iter->second->begin(); edge_iter!=iter->second->end(); ++edge_iter) {
00085
00086 if(edge_iter->link_state != ElementConListType::con) {
00087 typename ElementConListType::iterator save=edge_iter; save++;
00088 del_iters.push_back(save);
00089 edge_iter->link_state = ElementConListType::discon;
00090 }
00091 }
00092
00093 boost::array<VertexHandle, EdgeElementType::num_vertices> old_vs;
00094 for(int j=0; j<EdgeElementType::num_vertices; j++) {
00095 old_vs.at(j) = iter->first.vertices.at(j);
00096 }
00097
00098
00099 for(int i=0; i<del_iters.size()-1; i++) {
00100 typename ElementConListType::iterator start = del_iters.at(i), end = del_iters.at(i+1);
00101
00102
00103 ElementConListHandle new_con_list = new ElementConListType();
00104
00105
00106 boost::array<VertexHandle, EdgeElementType::num_vertices> new_vs;
00107 for(int j=0; j<EdgeElementType::num_vertices; j++) {
00108 new_vs.at(j) = new VertexType(old_vs.at(j));
00109 AddVertex(new_vs.at(j));
00110 }
00111 EdgeElementType edge_2(new_vs);
00112 edges[edge_2] = new_con_list;
00113
00114 for(typename ElementConListType::iterator edge_iter=start; edge_iter!=end; ++edge_iter) {
00115
00116
00117
00118
00119 ElementHandle elem = FindElementFromIndex((*edge_iter).elem_globalID);
00120 if(elem != NULL) {
00121 for(int j=0; j<EdgeElementType::num_vertices; j++) {
00122 for(int k=0; k<ElementType::num_vertices; k++) {
00123 if(elem->vertices.at(k) == old_vs.at(j)) {
00124 elem->vertices.at(k) = new_vs.at(j);
00125 }
00126 }
00127 }
00128 }
00129 }
00130
00131 new_con_list->insert(new_con_list->begin(), start, end);
00132 iter->second->erase(start, end);
00133 }
00134 }
00135 }
00136 }
00137
00138
00139
00140
00141
00142 template <typename Traits>
00143 bool Mesh<Traits>::ReadFile (std::istream &in) {
00144 std::string elem_keyword = ElementType::deck_keyword;
00145 std::string node_keyword = VertexType::deck_keyword;
00146
00147 std::string cur_keyword;
00148 bool startdata=false;
00149 bool enddata=false;
00150
00151 std::map<int, VertexHandle> temp_vertices;
00152
00153 while(!in.eof()) {
00154 in >> cur_keyword;
00155 if(startdata && !enddata) {
00156 if(cur_keyword == node_keyword) {
00157 int node_num;
00158 in >> node_num;
00159
00160 double x=0.0, y=0.0, z=0.0;
00161 in >> x >> y >> z;
00162
00163 VertexHandle v = new VertexType(x,y,z,node_num);
00164 this->AddVertex(v);
00165
00166
00167 temp_vertices[node_num] = v;
00168 }
00169 else if(cur_keyword == elem_keyword) {
00170 int elem_num;
00171 in >> elem_num;
00172
00173 boost::array<VertexHandle, ElementType::num_vertices> nodes;
00174
00175 int node_num=0;
00176 for(int i=0; i<ElementType::num_vertices; i++) {
00177 in >> node_num; nodes.at(i) = temp_vertices[node_num];
00178 }
00179
00180 ElementHandle e = new ElementType(nodes);
00181 e->globalID = elem_num;
00182 this->AddElement(e);
00183 }
00184 else {
00185
00186 }
00187 }
00188 if(cur_keyword == "STARTDATA") {
00189 startdata = true;
00190 }
00191 if(cur_keyword == "ENDDATA") {
00192 enddata = true;
00193 }
00194 }
00195
00196
00197 std::for_each(ElementMapBegin(), ElementMapEnd(), bind1st(std::mem_fun(&Mesh<Traits>::ConnectElement),this));
00198
00199
00200 std::for_each(ElementMapBegin(), ElementMapEnd(), bind1st(std::mem_fun(&Mesh<Traits>::AddElementToConLists),this));
00201
00202 return true;
00203 }
00204
00205
00206
00207
00208
00209 template <typename Traits>
00210 std::string Mesh<Traits>::ExportFile() {
00211 std::stringstream export_file;
00212
00213 export_file << "STARTDATA\n";
00214
00215 for(VertexMapIterator v_iter=VertexMapBegin(); v_iter!=VertexMapEnd(); ++v_iter) {
00216 export_file << VertexType::deck_keyword << "\t";
00217 export_file << " " << (*v_iter)->globalID;
00218 for(int i=0; i<VertexType::dimension; i++) {
00219 export_file << "\t" << (*v_iter)->coords.at(i);
00220 }
00221 export_file << "\n";
00222 }
00223 for(ElementMapIterator e_iter=ElementMapBegin(); e_iter!=ElementMapEnd(); ++e_iter) {
00224 export_file << ElementType::deck_keyword << "\t";
00225 export_file << " " << (*e_iter)->globalID;
00226 for(int i=0; i<ElementType::num_vertices; i++) {
00227 export_file << "\t" << (*e_iter)->vertices.at(i)->globalID;
00228 }
00229 export_file << "\n";
00230 }
00231
00232 export_file << "ENDDATA\n";
00233
00234 return export_file.str();
00235 }
00236
00237
00238
00239
00240
00241 template <typename Traits>
00242 std::string Mesh<Traits>::ExportDomainFile (std::set<Mesh<Traits>::VertexHandle> part_vert, std::set<Mesh<Traits>::ElementHandle> part_elem) {
00243 std::stringstream export_file;
00244
00245 export_file << "STARTDATA\n";
00246
00247 for(typename std::set<VertexHandle>::iterator v_iter=part_vert.begin(); v_iter!=part_vert.end(); ++v_iter) {
00248 export_file << VertexType::deck_keyword << "\t";
00249 export_file << " " << (*v_iter)->globalID;
00250 for(int i=0; i<VertexType::dimension; i++) {
00251 export_file << "\t" << (*v_iter)->coords.at(i);
00252 }
00253 export_file << "\n";
00254 }
00255 for(typename std::set<ElementHandle>::iterator e_iter=part_elem.begin(); e_iter!=part_elem.end(); ++e_iter) {
00256 export_file << ElementType::deck_keyword << "\t";
00257 export_file << " " << (*e_iter)->globalID;
00258 for(int i=0; i<ElementType::num_vertices; i++) {
00259 export_file << "\t" << (*e_iter)->vertices.at(i)->globalID;
00260 }
00261 export_file << "\n";
00262 }
00263
00264 export_file << "ENDDATA\n";
00265
00266 return export_file.str();
00267 }
00268
00269
00270
00271
00272
00273 template <typename Traits>
00274 bool Mesh<Traits>::AddVertex(VertexHandle v) {
00275 vertices.push_back(v);
00276 if(v->globalID == 0)
00277 v->globalID = this->maxVertex+1;
00278 this->maxVertex = std::max(v->globalID, this->maxVertex);
00279 std::stringstream s; s << newPrefix << v->globalID;
00280 int new_id; s >> new_id;
00281 v->globalID = new_id;
00282 return true;
00283 }
00284
00285
00286
00287
00288
00289 template <typename Traits>
00290 bool Mesh<Traits>::AddElement(ElementHandle e) {
00291
00292 elements.push_back(e);
00293 if(e->globalID == 0)
00294 e->globalID = this->maxElement+1;
00295 this->maxElement = std::max(e->globalID, this->maxElement);
00296 return true;
00297 }
00298
00299
00300
00301
00302
00303 template <typename Traits>
00304 bool Mesh<Traits>::AddCohElement(CohElementHandle e) {
00305 cohelements.push_back(e);
00306 if(e->globalID == 0)
00307 e->globalID = this->maxCohElement+1;
00308 this->maxCohElement = std::max(e->globalID, this->maxCohElement);
00309 return true;
00310 }
00311
00312
00313
00314
00315
00316 template <typename Traits>
00317 bool Mesh<Traits>::ClearMesh() {
00318 std::for_each(VertexMapBegin(), VertexMapEnd(), zap<VertexHandle>);
00319 std::for_each(ElementMapBegin(), ElementMapEnd(), zap<ElementHandle>);
00320 std::for_each(CohElementMapBegin(), CohElementMapEnd(), zap<CohElementHandle>);
00321 std::for_each(EdgeMapBegin(), EdgeMapEnd(), TakeSecond<typename EdgeMapType::value_type>(zap<ElementConListHandle>));
00322
00323 vertices.clear();
00324 elements.clear();
00325 cohelements.clear();
00326 faces.clear();
00327 edges.clear();
00328 return true;
00329 }
00330
00331
00332
00333
00334 template <typename Traits>
00335 bool Mesh<Traits>::RemoveElement(ElementHandle e) {
00336 ElementMapIterator e_iter = std::find(ElementMapBegin(), ElementMapEnd(), e);
00337 assert(e_iter != ElementMapEnd());
00338 elements.erase(e_iter);
00339 elements_inactive.push_back(e);
00340
00341 return true;
00342 }
00343
00344
00345
00346
00347 template <typename Traits>
00348 bool Mesh<Traits>::RemoveElements(std::vector<int> elems) {
00349 for(std::vector<int>::iterator iter=elems.begin(); iter!=elems.end(); ++iter) {
00350 RemoveElement(FindElementFromIndex(*iter));
00351 }
00352 return true;
00353 }
00354
00355
00356
00357
00358 template <typename Traits>
00359 bool Mesh<Traits>::RemoveVertex(VertexHandle v) {
00360 VertexMapIterator v_iter = std::find(VertexMapBegin(), VertexMapEnd(), v);
00361 assert(v_iter != VertexMapEnd());
00362 vertices.erase(v_iter);
00363 vertices_inactive.push_back(v);
00364
00365 return true;
00366 }
00367
00368
00369
00370
00371 template <typename Traits>
00372 bool Mesh<Traits>::RemoveVertices(std::vector<int> verts) {
00373 for(std::vector<int>::iterator iter=verts.begin(); iter!=verts.end(); ++iter) {
00374 RemoveVertex(FindVertexFromIndex(*iter));
00375 }
00376 return true;
00377 }
00378
00379
00380
00381
00382 template <typename Traits>
00383 bool Mesh<Traits>::SetActive(std::vector<int> act_elems_vec) {
00384 std::copy(elements.begin(), elements.end(), std::back_inserter(elements_inactive));
00385 elements.clear();
00386
00387 for(std::vector<int>::iterator act_iter=act_elems_vec.begin(); act_iter!=act_elems_vec.end(); ++act_iter) {
00388 ElementMapIterator found = std::find_if(elements_inactive.begin(),
00389 elements_inactive.end(),
00390 std::bind1st(IDEqual<ElementType>(), *act_iter));
00391 if(found != elements_inactive.end()) {
00392 elements.push_back(*found);
00393 elements_inactive.erase(found);
00394 }
00395 }
00396
00397 std::sort(elements.begin(), elements.end(), IDComparison<ElementType>());
00398
00399 std::copy(vertices.begin(), vertices.end(), std::back_inserter(vertices_inactive));
00400 vertices.clear();
00401
00402 for(ElementMapIterator e_iter=elements.begin(); e_iter!=elements.end(); ++e_iter) {
00403 for(int i=0; i<ElementType::num_vertices; i++) {
00404 VertexMapIterator found = std::find(vertices_inactive.begin(),
00405 vertices_inactive.end(),
00406 (*e_iter)->vertices.at(i));
00407 if(found != vertices_inactive.end()) {
00408 vertices.push_back(*found);
00409 vertices_inactive.erase(found);
00410 }
00411 }
00412 }
00413
00414 std::sort(vertices.begin(), vertices.end(), IDComparison<VertexType>());
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452 return true;
00453 }
00454
00455
00456
00457
00458 template <typename Traits>
00459 typename Mesh<Traits>::VertexHandle Mesh<Traits>::FindVertexFromIndex (int index) {
00460 VertexMapIterator found = std::find_if(VertexMapBegin(), VertexMapEnd(), std::bind1st(IDEqual<VertexType>(), index));
00461
00462
00463
00464
00465
00466 if(found != VertexMapEnd())
00467 return (*found);
00468 else return NULL;
00469 }
00470
00471
00472
00473
00474 template <typename Traits>
00475 typename Mesh<Traits>::ElementHandle Mesh<Traits>::FindElementFromIndex (int index) {
00476 ElementMapIterator found = std::find_if(ElementMapBegin(), ElementMapEnd(), std::bind1st(IDEqual<ElementType>(), index));
00477
00478
00479
00480
00481
00482 if(found != ElementMapEnd()) return (*found);
00483 else return NULL;
00484 }
00485
00486
00487
00488
00489 template <typename Traits>
00490 void Mesh<Traits>::ConnectElement(ElementHandle e) {
00491 for(int i=0; i<ElementType::num_adjacents; i++) {
00492 FaceElementType f = e->GetFace(i);
00493
00494 std::sort(f.vertices.begin(), f.vertices.end(), IDComparison<VertexType>());
00495 FaceMapIterator find_face = faces.find(f);
00496
00497 if(find_face != FaceMapEnd()) {
00498 e->MakeConnection(i, faces[f]);
00499 faces[f]->MakeConnection(faces[f]->GetFaceIndex(f), e);
00500 }
00501 else {
00502 faces[f] = e;
00503 }
00504 }
00505 }
00506
00507
00508
00509
00510 template <typename Traits>
00511 void Mesh<Traits>::AddElementToConLists(ElementHandle e) {
00512 for(int i=0; i<ElementType::num_edges; i++) {
00513 EdgeElementType edge = e->GetEdge(i);
00514 int next_ind = 0, prev_ind = 0;
00515
00516 std::sort(edge.vertices.begin(), edge.vertices.end(), IDComparison<VertexType>());
00517
00518
00519
00520
00521 if(e->NextOnEdge(edge) != NULL) next_ind = e->NextOnEdge(edge)->globalID;
00522 if(e->PrevOnEdge(edge) != NULL) prev_ind = e->PrevOnEdge(edge)->globalID;
00523
00524 EdgeMapIterator find_edge = edges.find(edge);
00525 if(find_edge == EdgeMapEnd()) {
00526 edges[edge] = new ElementConListType();
00527 }
00528 edges[edge]->add_elem(e->globalID, prev_ind, next_ind);
00529 e->con_lists.at(i) = edges[edge];
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548 }
00549 }
00550
00551
00552
00553
00554
00555
00556 template <typename Traits>
00557 std::vector<typename Mesh<Traits>::VertexHandle> Mesh<Traits>::GetCentres() {
00558 std::vector<VertexHandle> centres;
00559
00560 for(ElementMapIterator e_iter=ElementMapBegin(); e_iter!=ElementMapEnd(); ++e_iter) {
00561 VertexHandle centre_vertex = (*e_iter)->GetCentre();
00562 centre_vertex->globalID = (*e_iter)->globalID;
00563 centres.push_back(centre_vertex);
00564 }
00565
00566 return centres;
00567 }
00568
00569 }