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 #ifndef MESHBASEDTISSUEWITHGHOSTNODES_HPP_
00029 #define MESHBASEDTISSUEWITHGHOSTNODES_HPP_
00030
00031 #include "MeshBasedTissue.hpp"
00032
00033 #include <boost/serialization/access.hpp>
00034 #include <boost/serialization/base_object.hpp>
00035 #include <boost/serialization/vector.hpp>
00036
00043 template<unsigned DIM>
00044 class MeshBasedTissueWithGhostNodes : public MeshBasedTissue<DIM>
00045 {
00046 private:
00047
00049 friend class TestMeshBasedTissueWithGhostNodes;
00050
00052 std::vector<bool> mIsGhostNode;
00053
00055 friend class boost::serialization::access;
00067 template<class Archive>
00068 void serialize(Archive & archive, const unsigned int version)
00069 {
00070 archive & boost::serialization::base_object<MeshBasedTissue<DIM> >(*this);
00071 archive & mIsGhostNode;
00072 }
00073
00079 void SetGhostNodes(const std::set<unsigned>& ghostNodeIndices);
00080
00090 void Validate();
00091
00092 public:
00093
00102 MeshBasedTissueWithGhostNodes(MutableMesh<DIM, DIM>& rMesh,
00103 const std::vector<TissueCell>& rCells,
00104 const std::vector<unsigned> locationIndices=std::vector<unsigned>(),
00105 bool deleteMesh=false);
00106
00112 MeshBasedTissueWithGhostNodes(MutableMesh<DIM, DIM>& rMesh);
00113
00124 void UpdateNodeLocations(const std::vector< c_vector<double, DIM> >& rNodeForces, double dt);
00125
00129 std::vector<bool>& rGetGhostNodes();
00130
00141 bool IsGhostNode(unsigned index);
00142
00146 std::set<unsigned> GetGhostNodeIndices();
00147
00154 void UpdateGhostPositions(double dt);
00155
00161 void UpdateGhostNodesAfterReMesh(NodeMap& rMap);
00162
00171 c_vector<double, DIM> CalculateForceBetweenNodes(const unsigned& rNodeAGlobalIndex, const unsigned& rNodeBGlobalIndex);
00172
00183 TissueCell* AddCell(TissueCell& rNewCell, c_vector<double,DIM> newLocation, TissueCell* pParentCell=NULL);
00184
00185 };
00186
00187
00188 #include "TemplatedExport.hpp"
00189 EXPORT_TEMPLATE_CLASS_SAME_DIMS(MeshBasedTissueWithGhostNodes)
00190
00191 namespace boost
00192 {
00193 namespace serialization
00194 {
00198 template<class Archive, unsigned DIM>
00199 inline void save_construct_data(
00200 Archive & ar, const MeshBasedTissueWithGhostNodes<DIM> * t, const BOOST_PFTO unsigned int file_version)
00201 {
00202
00203 const MutableMesh<DIM,DIM>* p_mesh = &(t->rGetMesh());
00204 ar & p_mesh;
00205 }
00206
00211 template<class Archive, unsigned DIM>
00212 inline void load_construct_data(
00213 Archive & ar, MeshBasedTissueWithGhostNodes<DIM> * t, const unsigned int file_version)
00214 {
00215
00216 assert(MeshArchiveInfo::meshPathname.length() > 0);
00217 MutableMesh<DIM,DIM>* p_mesh;
00218 ar >> p_mesh;
00219
00220
00221 p_mesh->Clear();
00222 TrianglesMeshReader<DIM,DIM> mesh_reader(MeshArchiveInfo::meshPathname);
00223 p_mesh->ConstructFromMeshReader(mesh_reader);
00224
00225
00226 NodeMap map(p_mesh->GetNumNodes());
00227 p_mesh->ReMesh(map);
00228
00229
00230 ::new(t)MeshBasedTissueWithGhostNodes<DIM>(*p_mesh);
00231
00232 }
00233 }
00234 }
00235
00236 #endif