MutableMesh.hpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #ifndef MUTABLEMESH_HPP_
00037 #define MUTABLEMESH_HPP_
00038
00039 #include "ChasteSerialization.hpp"
00040 #include <boost/serialization/base_object.hpp>
00041 #include <boost/serialization/split_member.hpp>
00042
00043 #include "TetrahedralMesh.hpp"
00044 #include "NodeMap.hpp"
00045
00049 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00050 class MutableMesh : public TetrahedralMesh<ELEMENT_DIM, SPACE_DIM>
00051 {
00053 friend class boost::serialization::access;
00054
00061 template<class Archive>
00062 void save(Archive & archive, const unsigned int version) const
00063 {
00064 archive & boost::serialization::base_object<TetrahedralMesh<ELEMENT_DIM, SPACE_DIM> >(*this);
00065
00066
00067 bool does_have_attributes = this->mNodes[0]->HasNodeAttributes();
00068
00069 archive & does_have_attributes;
00070
00071 if (does_have_attributes)
00072 {
00073 for (unsigned i=0; i<this->mNodes.size(); i++)
00074 {
00075 double radius;
00076 radius = this->mNodes[i]->GetRadius();
00077 archive & radius;
00078
00079 bool is_particle;
00080 is_particle = this->mNodes[i]->IsParticle();
00081 archive & is_particle;
00082 }
00083 }
00084 }
00085
00092 template<class Archive>
00093 void load(Archive & archive, const unsigned int version)
00094 {
00095 archive & boost::serialization::base_object<TetrahedralMesh<ELEMENT_DIM, SPACE_DIM> >(*this);
00096
00097 bool does_have_attributes;
00098
00099 archive & does_have_attributes;
00100
00101 if (does_have_attributes)
00102 {
00103 for (unsigned i=0; i<this->mNodes.size(); i++)
00104 {
00105 double radius;
00106 archive & radius;
00107 this->mNodes[i]->SetRadius(radius);
00108
00109 bool is_particle;
00110 archive & is_particle;
00111
00112 if (is_particle)
00113 {
00114 this->mNodes[i]->SetIsParticle(true);
00115 }
00116 }
00117 }
00118
00119
00120
00121 if(ELEMENT_DIM==SPACE_DIM)
00122 {
00123 NodeMap map(this->GetNumNodes());
00124 this->ReMesh(map);
00125 assert(map.IsIdentityMap());
00126 }
00127 }
00128 BOOST_SERIALIZATION_SPLIT_MEMBER()
00129
00130 protected:
00131
00136 std::vector<unsigned> mDeletedElementIndices;
00137
00142 std::vector<unsigned> mDeletedBoundaryElementIndices;
00143
00148 std::vector<unsigned> mDeletedNodeIndices;
00149
00151 bool mAddedNodes;
00152
00153 private:
00154
00155 #define COVERAGE_IGNORE
00156
00164 bool CheckIsVoronoi(Element<ELEMENT_DIM, SPACE_DIM>* pElement, double maxPenetration);
00165 #undef COVERAGE_IGNORE
00166
00167 public:
00168
00172 MutableMesh();
00173
00179 MutableMesh(std::vector<Node<SPACE_DIM> *> nodes);
00180
00184 virtual ~MutableMesh();
00185
00189 void Clear();
00190
00194 unsigned GetNumNodes() const;
00195
00199 unsigned GetNumElements() const;
00200
00204 unsigned GetNumBoundaryElements() const;
00205
00207
00214 void RescaleMeshFromBoundaryNode(ChastePoint<1> updatedPoint, unsigned boundaryNodeIndex);
00215
00224 virtual unsigned AddNode(Node<SPACE_DIM>* pNewNode);
00225
00232 unsigned AddElement(Element<ELEMENT_DIM,SPACE_DIM>* pNewElement);
00233
00242 virtual void SetNode(unsigned index, ChastePoint<SPACE_DIM> point, bool concreteMove=true);
00243
00253 void MoveMergeNode(unsigned index, unsigned targetIndex, bool concreteMove=true);
00254
00255 #define COVERAGE_IGNORE
00256
00262 virtual void DeleteNode(unsigned index);
00263
00269 virtual void DeleteElement(unsigned index);
00270 #undef COVERAGE_IGNORE
00271
00280 void DeleteNodePriorToReMesh(unsigned index);
00281
00289 unsigned RefineElement(Element<ELEMENT_DIM,SPACE_DIM>* pElement, ChastePoint<SPACE_DIM> point);
00290
00303 void DeleteBoundaryNodeAt(unsigned index);
00304
00305 #define COVERAGE_IGNORE
00306
00312 void ReIndex(NodeMap& map);
00313 #undef COVERAGE_IGNORE
00314
00320 virtual void ReMesh(NodeMap& map);
00321
00327 void ReMesh();
00328
00329 #define COVERAGE_IGNORE
00330
00335 std::vector<c_vector<unsigned, 5> > SplitLongEdges(double cutoffLength);
00336 #undef COVERAGE_IGNORE
00337
00338 #define COVERAGE_IGNORE
00339
00346 c_vector<unsigned, 3> SplitEdge(Node<SPACE_DIM>* pNodeA, Node<SPACE_DIM>* pNodeB);
00347 #undef COVERAGE_IGNORE
00348
00349 #define COVERAGE_IGNORE
00350
00358 bool CheckIsVoronoi(double maxPenetration=0.0);
00359 #undef COVERAGE_IGNORE
00360 };
00361
00362 #include "SerializationExportWrapper.hpp"
00363 EXPORT_TEMPLATE_CLASS_ALL_DIMS(MutableMesh)
00364
00365 #endif