MixedDimensionMesh.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 MIXEDDIMENSIONMESH_HPP_
00037 #define MIXEDDIMENSIONMESH_HPP_
00038
00039 #include "DistributedTetrahedralMesh.hpp"
00040 #include "AbstractMeshReader.hpp"
00041
00042 #include "ChasteSerialization.hpp"
00043 #include <boost/serialization/base_object.hpp>
00044
00050 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00051 class MixedDimensionMesh : public DistributedTetrahedralMesh<ELEMENT_DIM, SPACE_DIM>
00052 {
00053 public:
00054
00060 MixedDimensionMesh(DistributedTetrahedralMeshPartitionType::type partitioningMethod=DistributedTetrahedralMeshPartitionType::METIS_LIBRARY);
00061
00066 ~MixedDimensionMesh();
00067
00073 void ConstructFromMeshReader(AbstractMeshReader<ELEMENT_DIM,SPACE_DIM>& rMeshReader);
00074
00080 void RegisterCableElement(unsigned index);
00081
00085 unsigned GetNumCableElements() const;
00086
00090 unsigned GetNumLocalCableElements() const;
00091
00098 Element<1u, SPACE_DIM>* GetCableElement(unsigned globalElementIndex) const;
00099
00106 bool CalculateDesignatedOwnershipOfCableElement( unsigned globalElementIndex );
00107
00109 typedef typename std::multimap<const Node<SPACE_DIM>*, Element<1u, SPACE_DIM>*>::iterator NodeCableIterator;
00110
00112 typedef std::pair<NodeCableIterator, NodeCableIterator> CableRangeAtNode;
00113
00120 CableRangeAtNode GetCablesAtNode(const Node<SPACE_DIM>* pNode);
00121
00122 private:
00124 std::vector<Element<1u, SPACE_DIM>*> mCableElements;
00125
00127 unsigned mNumCableElements;
00128
00130 std::map<unsigned, unsigned> mCableElementsMapping;
00131
00133 std::multimap<const Node<SPACE_DIM>*, Element<1u, SPACE_DIM>*> mNodeToCablesMapping;
00134
00136 friend class boost::serialization::access;
00143 template<class Archive>
00144 void serialize(Archive & archive, const unsigned int version)
00145 {
00146 archive & boost::serialization::base_object<DistributedTetrahedralMesh<ELEMENT_DIM, SPACE_DIM> >(*this);
00147 }
00148
00149 public:
00150
00152
00154
00156 typedef typename std::vector<Element<1, SPACE_DIM> *>::const_iterator CableElementIterator;
00157
00161 CableElementIterator GetCableElementIteratorBegin() const;
00162
00167 CableElementIterator GetCableElementIteratorEnd() const;
00168
00169
00170 };
00171
00172
00173 #include "SerializationExportWrapper.hpp"
00174 EXPORT_TEMPLATE_CLASS_ALL_DIMS(MixedDimensionMesh)
00175
00176 namespace boost
00177 {
00178 namespace serialization
00179 {
00183 template<class Archive, unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00184 inline void save_construct_data(
00185 Archive & ar, const MixedDimensionMesh<ELEMENT_DIM, SPACE_DIM> * t, const BOOST_PFTO unsigned int file_version)
00186 {
00187 unsigned num_procs = PetscTools::GetNumProcs();
00188 const DistributedTetrahedralMeshPartitionType::type partition_type = t->GetPartitionType();
00189 ar << num_procs;
00190 ar << partition_type;
00191 }
00192
00197 template<class Archive, unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00198 inline void load_construct_data(
00199 Archive & ar, MixedDimensionMesh<ELEMENT_DIM, SPACE_DIM> * t, const unsigned int file_version)
00200 {
00201 unsigned num_procs;
00202 DistributedTetrahedralMeshPartitionType::type partition_type;
00203
00204 ar >> num_procs;
00205 ar >> partition_type;
00206
00207
00209
00210 ::new(t)MixedDimensionMesh<ELEMENT_DIM, SPACE_DIM>(DistributedTetrahedralMeshPartitionType::DUMB);
00211
00212
00213
00214
00215
00216 if (DistributedVectorFactory::CheckNumberOfProcessesOnLoad() &&
00217 num_procs != PetscTools::GetNumProcs())
00218 {
00219 EXCEPTION("This archive was written for a different number of processors");
00220 }
00221
00222 }
00223 }
00224 }
00225
00226 #endif