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
00037 #ifndef _ABSTRACTTETRAHEDRALMESHWRITER_HPP_
00038 #define _ABSTRACTTETRAHEDRALMESHWRITER_HPP_
00039
00040
00041 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00042 class AbstractTetrahedralMesh;
00043
00044 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00045 class DistributedTetrahedralMesh;
00046
00047 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00048 class MixedDimensionMesh;
00049
00050 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00051 struct MeshWriterIterators;
00052
00053 #include <fstream>
00054 #include <sstream>
00055 #include <boost/scoped_array.hpp>
00056
00057 #include "AbstractMeshWriter.hpp"
00058 #include "AbstractMesh.hpp"
00059 #include "NodeMap.hpp"
00060
00061 #include "GenericEventHandler.hpp"
00063 class MeshEventHandler : public GenericEventHandler<11, MeshEventHandler>
00064 {
00065 public:
00066 static const char* EventName[11];
00069 typedef enum
00070 {
00071 TRIANGLES=0,
00072 BINTRI,
00073 VTK,
00074 PVTK,
00075 NODE,
00076 ELE,
00077 FACE,
00078 NCL,
00079 COMM1,
00080 COMM2
00081 } EventType;
00082 };
00083
00084
00088 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00089 class AbstractTetrahedralMeshWriter : public AbstractMeshWriter<ELEMENT_DIM, SPACE_DIM>
00090 {
00091 private:
00100 void PostElement(unsigned globalIndex, unsigned indices[], unsigned numIndices, unsigned tag, double attribute)
00101 {
00102 MeshEventHandler::BeginEvent(MeshEventHandler::COMM1);
00103 MPI_Ssend(indices, numIndices, MPI_UNSIGNED, 0,
00104 tag,
00105 PETSC_COMM_WORLD);
00106 MeshEventHandler::EndEvent(MeshEventHandler::COMM1);
00107
00108 MeshEventHandler::BeginEvent(MeshEventHandler::COMM2);
00109 MPI_Ssend(&attribute, 1, MPI_DOUBLE, 0,
00110 tag,
00111 PETSC_COMM_WORLD);
00112 MeshEventHandler::EndEvent(MeshEventHandler::COMM2);
00113 }
00121 void UnpackElement(ElementData& rElementData, unsigned globalIndex, unsigned numIndices, unsigned tag)
00122 {
00123 assert( numIndices == rElementData.NodeIndices.size());
00124 boost::scoped_array<unsigned> raw_indices(new unsigned[numIndices]);
00125 MPI_Status status;
00126
00127 MeshEventHandler::BeginEvent(MeshEventHandler::COMM1);
00128 MPI_Recv(raw_indices.get(), numIndices, MPI_UNSIGNED, MPI_ANY_SOURCE,
00129 tag,
00130 PETSC_COMM_WORLD, &status);
00131 MeshEventHandler::EndEvent(MeshEventHandler::COMM1);
00132
00133 for (unsigned j=0; j< rElementData.NodeIndices.size(); j++)
00134 {
00135 rElementData.NodeIndices[j] = raw_indices[j];
00136 }
00137
00138
00139 double attribute;
00140 MeshEventHandler::BeginEvent(MeshEventHandler::COMM2);
00141 MPI_Recv(&attribute, 1U, MPI_DOUBLE, MPI_ANY_SOURCE,
00142 tag,
00143 PETSC_COMM_WORLD, &status);
00144 MeshEventHandler::EndEvent(MeshEventHandler::COMM2);
00145
00146
00147 rElementData.AttributeValue = attribute;
00148 }
00149
00156 virtual void WriteFilesUsingParallelMesh(bool keepOriginalElementIndexing=true);
00157
00165 void WriteNclFile(AbstractTetrahedralMesh<ELEMENT_DIM, SPACE_DIM>& rMesh,
00166 bool invertMeshPermutation=false);
00167
00171 virtual void CreateFilesWithHeaders();
00172
00176 virtual void AppendLocalDataToFiles();
00177
00181 virtual void WriteFilesFooter();
00182
00183 NodeMap* mpNodeMap;
00185 protected:
00186
00187 unsigned mNodesPerElement;
00188 unsigned mNodesPerBoundaryElement;
00190 AbstractTetrahedralMesh<ELEMENT_DIM,SPACE_DIM>* mpMesh;
00191 DistributedTetrahedralMesh<ELEMENT_DIM,SPACE_DIM>* mpDistributedMesh;
00192 MixedDimensionMesh<ELEMENT_DIM,SPACE_DIM>* mpMixedMesh;
00193 MeshWriterIterators<ELEMENT_DIM,SPACE_DIM>* mpIters;
00195 bool mIndexFromZero;
00196 bool mWriteMetaFile;
00197 unsigned mNodeCounterForParallelMesh;
00198 unsigned mElementCounterForParallelMesh;
00199 unsigned mBoundaryElementCounterForParallelMesh;
00200 unsigned mCableElementCounterForParallelMesh;
00201 bool mFilesAreBinary;
00203 public:
00204
00212 AbstractTetrahedralMeshWriter(const std::string& rDirectory,
00213 const std::string& rBaseName,
00214 const bool clearOutputDir=true);
00215
00219 virtual ~AbstractTetrahedralMeshWriter();
00220
00230 virtual void WriteFilesUsingMesh(AbstractTetrahedralMesh<ELEMENT_DIM, SPACE_DIM>& rMesh,
00231 bool keepOriginalElementIndexing=true);
00232
00242 void WriteFilesUsingMeshReaderAndMesh(AbstractMeshReader<ELEMENT_DIM, SPACE_DIM>& rMeshReader,
00243 AbstractTetrahedralMesh<ELEMENT_DIM, SPACE_DIM>& rMesh);
00244
00248 std::vector<double> GetNextNode();
00249
00250
00254 ElementData GetNextElement();
00255
00259 ElementData GetNextBoundaryElement();
00260
00264 ElementData GetNextCableElement();
00265 };
00266
00267 #endif //_ABSTRACTTETRAHEDRALMESHWRITER_HPP_