mesh/Mesh.cpp

00001 #include "DAPTA.hpp"
00002 
00003 namespace DAPTA { // Define namespace DAPTA
00004 
00005 /*
00006 void Mesh<Traits>::FractureFace(ElementHandle e, int f)
00007 Fracture the f'th face on e and updates the vertices and cohesive elements lists as appropriate.
00008 */
00009 template <typename Traits>
00010 void Mesh<Traits>::FractureFace(ElementHandle e, int f) {
00011    // Setup some variables for later
00012    int f_2=ElementType::num_adjacents;
00013    ElementHandle e_2 = e->adjacents.at(f);
00014    
00015    // If no adjacent then we can't fracture, so return NULL
00016    if(e_2 == NULL)
00017       return;
00018    
00019    // If there's already a cohesive element here then return
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 //    if((face_2 == face_1) || (!face_2 == face_1)) {
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 /*    if(e->globalID == 255) {
00039          std::cout << "   FACE = " << f_2 << "(" << face_2.vertices[0]->globalID << ":" << face_2.vertices[1]->globalID << ")" << std::endl;
00040       }
00041    while(!(face_1 == face_2) && (f_2 != ElementType::num_adjacents)) {
00042       f_2++;
00043       face_2 = e_2->GetFace(f_2);
00044       if(e->globalID == 255) {
00045          std::cout << "   " << f_2 << std::endl;
00046       }
00047       if(e->globalID == 255) {
00048          std::cout << "   FACE = " << f_2 << "(" << face_2.vertices[0]->globalID << ":" << face_2.vertices[1]->globalID << ")" << std::endl;
00049       }
00050    }
00051    if(e->globalID == 255) {
00052       std::cout << "   " << f_2 << std::endl;
00053    }
00054    assert(f_2 != ElementType::num_adjacents); // Stops the whole thing looping in the while loop above */
00055    
00056    // Get list of edges for this face
00057    std::vector<EdgeElementType> frac_edges = e->GetEdges(f);
00058    
00059 /* for(typename std::vector<EdgeElementType>::iterator iter=frac_edges.begin(); iter!=frac_edges.end(); ++iter) {
00060       std::sort(iter->vertices.begin(), iter->vertices.end(), IDComparison<VertexType>());
00061    }*/
00062    
00063    // Loop through each edge
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    /*return coh_elem;*/
00076 }
00077 
00078 template <typename Traits>
00079 void Mesh<Traits>::UpdateEdges() {
00080    for(EdgeMapIterator iter=EdgeMapBegin(); iter!=EdgeMapEnd(); ++iter) {
00081       // Check if this edge needs splitting and new nodes created
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             // Check if broken or not linked
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          // Now we have a split list of where the new nodes need to be - so now update them!
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             // Create the new element connectivity list
00103             ElementConListHandle new_con_list = new ElementConListType();
00104             
00105             // Create the new vertices and edge data structure
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                // Update the element
00116                /* For parallel, the element might not be on this processor, so we don't need to update it, 
00117                 * so we try to find the element, but if it's NULL then we know it's not on this processor.
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 bool Mesh<Traits>::ReadFile (std::istream in)
00140 Setup the mesh by reading from an input file
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             // Note - not checking to see if node is already defined!
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             //return false;
00186          }
00187       }
00188       if(cur_keyword == "STARTDATA") {
00189          startdata = true;
00190       }
00191       if(cur_keyword == "ENDDATA") {
00192          enddata = true;
00193       }
00194    }
00195    
00196    // Connect all the elements
00197    std::for_each(ElementMapBegin(), ElementMapEnd(), bind1st(std::mem_fun(&Mesh<Traits>::ConnectElement),this));
00198    
00199    // Form the element connectivity lists
00200    std::for_each(ElementMapBegin(), ElementMapEnd(), bind1st(std::mem_fun(&Mesh<Traits>::AddElementToConLists),this));
00201    
00202    return true;
00203 }
00204 
00205 /*
00206 std::string Mesh<Traits>::ExportFile()
00207 Export the mesh to a file
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 std::string Mesh<Traits>::ExportDomainFile (std::set<Mesh<Traits>::VertexHandle> part_vert, std::set<Mesh<Traits>::ElementHandle> part_elem)
00239 Export part of the mesh to a file
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 bool Mesh<Traits>::AddVertex(VertexHandle v)
00271 Add a vertex to the Mesh.
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 bool Mesh<Traits>::AddElement(ElementHandle e)
00287 Add an element to the Mesh.
00288 */
00289 template <typename Traits>
00290 bool Mesh<Traits>::AddElement(ElementHandle e) {
00291    //ConnectElement(e);
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 bool Mesh<Traits>::AddCohElement(CohElementHandle e)
00301 Add a cohesive element to the Mesh.
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 bool Mesh<Traits>::ClearMesh()
00314 Clear all vertices and elements from the mesh
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 bool Mesh<Traits>::RemoveElement(ElementHandle e)
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    //delete e;
00341    return true;
00342 }
00343 
00344 /*
00345 bool Mesh<Traits>::RemoveElements(std::vector<int> elems)
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 bool Mesh<Traits>::RemoveVertex(VertexHandle v)
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    //delete v;
00365    return true;
00366 }
00367 
00368 /*
00369 bool Mesh<Traits>::RemoveVertices(std::vector<int> verts)
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 bool SetActive(std::vector<int> elems)
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    /*std::vector<int> all_elems_vec;
00417    for(ElementMapIterator e_iter=ElementMapBegin(); e_iter!=ElementMapEnd(); ++e_iter)
00418       all_elems_vec.push_back((*e_iter)->globalID);
00419    
00420    std::set<int> all_elems(all_elems_vec.begin(), all_elems_vec.end());
00421    std::set<int> act_elems(act_elems_vec.begin(), act_elems_vec.end());
00422    
00423    std::set<int> del_elems;
00424    std::set_difference(all_elems.begin(), all_elems.end(), 
00425                        act_elems.begin(), act_elems.end(), 
00426                   std::insert_iterator<std::set<int> >(del_elems, del_elems.begin()));
00427    std::vector<int> del_elems_vec(del_elems.begin(), del_elems.end());
00428    
00429    std::vector<int> all_verts_vec;
00430    for(VertexMapIterator v_iter=VertexMapBegin(); v_iter!=VertexMapEnd(); ++v_iter)
00431       all_verts_vec.push_back((*v_iter)->globalID);
00432    
00433    std::set<int> all_verts(all_verts_vec.begin(), all_verts_vec.end());
00434    
00435    std::set<int> act_verts;
00436    for(std::vector<int>::iterator de_iter=del_elems_vec.begin(); de_iter!=del_elems_vec.end(); ++de_iter) {
00437       ElementHandle e = FindElementFromIndex(*de_iter);
00438       for(int i=0; i<ElementType::num_vertices; i++) {
00439          act_verts.insert(e->vertices.at(i)->globalID);
00440       }
00441    }
00442    
00443    std::set<int> del_verts;
00444    std::set_difference(all_verts.begin(), all_verts.end(), 
00445                        act_verts.begin(), act_verts.end(), 
00446                   std::insert_iterator<std::set<int> >(del_verts, del_verts.begin()););
00447    std::vector<int> del_verts_vec(del_verts.begin(), del_verts.end());
00448    
00449    RemoveElements(del_elems_vec);
00450    RemoveVertices(del_verts_vec);*/
00451    
00452    return true;
00453 }
00454 
00455 /*
00456 typename Mesh<Traits>::VertexHandle Mesh<Traits>::FindVertexFromIndex (int index)
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    /*for(VertexMapIterator v_iter=VertexMapBegin(); v_iter!=VertexMapEnd(); ++v_iter) {
00462       if((*v_iter)->globalID == index)
00463          return (*v_iter);
00464    }
00465    return NULL*/
00466    if(found != VertexMapEnd())
00467       return (*found);
00468    else return NULL;
00469 }
00470 
00471 /*
00472 typename Mesh<Traits>::ElementHandle Mesh<Traits>::FindElementFromIndex (int index)
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    /*for(ElementMapIterator e_iter=ElementMapBegin(); e_iter!=ElementMapEnd(); ++e_iter) {
00478       if((*e_iter)->globalID == index)
00479          return (*e_iter);
00480    }
00481    return NULL;*/
00482    if(found != ElementMapEnd()) return (*found);
00483    else return NULL;
00484 }
00485 
00486 /*
00487 void Mesh<Traits>::ConnectElement(ElementHandle e)
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 void Mesh<Traits>::AddElementToConLists(ElementHandle e)
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       //if(e->NextOnEdge(i) != NULL) next_ind = e->NextOnEdge(i)->globalID;
00519       //if(e->PrevOnEdge(i) != NULL) prev_ind = e->PrevOnEdge(i)->globalID;
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       /*if(EdgeElementType::num_vertices > 1) {
00531          EdgeMapIterator find_not_edge = edges.find(!edge);
00532          if(find_not_edge == EdgeMapEnd()) {
00533             edges[!edge] = new ElementConListType();
00534          }
00535          edges[!edge]->add_elem(e->globalID, next_ind, prev_ind);
00536       }*/
00537       
00538       /* if(edge.vertices[0]->globalID == 950) {
00539          std::cout << "ELEM: " << e->globalID << ", NEXT: " << next_ind << ", PREV: " << prev_ind << std::endl;
00540          std::cout << " " << edge.vertices.at(0)->globalID << "\t";
00541          std::cout << edges[edge]->isClosed() << "\t";
00542          std::cout << edges[edge]->needSplit() << "\t";
00543          for(typename ElementConListType::iterator list_iter=edges[edge]->begin(); list_iter!=edges[edge]->end(); ++list_iter) {
00544             std::cout << (*list_iter).elem_globalID << "(" << (*list_iter).link_state << ")" << "->";
00545          }
00546          std::cout << std::endl;
00547       } */
00548    }
00549 }
00550 
00551 /*
00552 std::vector<typename Mesh<Traits>::VertexHandle> Mesh<Traits>::GetCentres()
00553 Return a list of vertices denoting the centres of all the elements in the mesh.
00554 Each vertex will have its global ID set to the global ID of the element
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 } // namespace DAPTA

Generated on Tue May 29 17:13:48 2007 for DAPTA by  doxygen 1.5.1