AbstractPerElementWriter.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 #ifndef ABSTRACTPERELEMENTWRITER_HPP_
00036 #define ABSTRACTPERELEMENTWRITER_HPP_
00037
00038 #include "AbstractTetrahedralMesh.hpp"
00039 #include "UblasCustomFunctions.hpp"
00040 #include "OutputFileHandler.hpp"
00041 #include "Version.hpp"
00042
00048 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM, unsigned DATA_SIZE>
00049 class AbstractPerElementWriter
00050 {
00051 private:
00052 bool mFileIsBinary;
00054 protected:
00058 AbstractTetrahedralMesh<ELEMENT_DIM, SPACE_DIM>* mpMesh;
00059
00064 out_stream mpMasterFile;
00065
00074 virtual void Visit(Element<ELEMENT_DIM, SPACE_DIM>* pElement,
00075 unsigned localElementIndex,
00076 c_vector<double, DATA_SIZE>& rData)=0;
00077
00085 virtual void WriteElementOnMaster(const c_vector<double, DATA_SIZE>& rData)
00086 {
00087 if (mFileIsBinary)
00088 {
00089
00090 mpMasterFile->write((char*)&rData[0], DATA_SIZE*sizeof(double));
00091 }
00092 else
00093 {
00094 for (unsigned i=0; i<DATA_SIZE; i++)
00095 {
00096 (*mpMasterFile) << rData[i] << "\t";
00097 }
00098 (*mpMasterFile)<<"\n";
00099 }
00100 }
00101
00109 virtual void WriteHeaderOnMaster()
00110 {
00111 }
00112
00119 virtual void PreWriteCalculations(OutputFileHandler& rOutputDirectory)
00120 {
00121 }
00122
00123 public:
00124
00130 AbstractPerElementWriter(AbstractTetrahedralMesh<ELEMENT_DIM, SPACE_DIM>* pMesh)
00131 : mFileIsBinary(false),
00132 mpMesh(pMesh),
00133 mpMasterFile(NULL)
00134 {
00135
00136 }
00137
00149 void WriteData(OutputFileHandler& rHandler, const std::string& rFileName)
00150 {
00151 PreWriteCalculations(rHandler);
00152
00153 c_vector<double, DATA_SIZE> data;
00154 if (PetscTools::AmMaster())
00155 {
00156 mpMasterFile = rHandler.OpenOutputFile(rFileName);
00157 MPI_Status status;
00158 status.MPI_ERROR = MPI_SUCCESS;
00159 WriteHeaderOnMaster();
00160
00161 if (mFileIsBinary)
00162 {
00163 *mpMasterFile << "\tBIN\n";
00164 }
00165 else
00166 {
00167 *mpMasterFile << "\n";
00168 }
00169
00170
00171
00172 unsigned local_element_index=0u;
00173 typename AbstractTetrahedralMesh<ELEMENT_DIM,SPACE_DIM>::ElementIterator iter = mpMesh->GetElementIteratorBegin();
00174
00175 for (unsigned global_element_index=0; global_element_index<mpMesh->GetNumElements(); global_element_index++)
00176 {
00177 if (mpMesh->CalculateDesignatedOwnershipOfElement(global_element_index))
00178 {
00179 Element<ELEMENT_DIM,SPACE_DIM>* p_elem = mpMesh->GetElement(global_element_index);
00180
00181 while (&(*iter) != p_elem)
00182 {
00183 ++iter;
00184 local_element_index++;
00185 assert(iter != mpMesh->GetElementIteratorEnd());
00186 }
00187
00188 Visit(p_elem, local_element_index, data);
00189 }
00190 else
00191 {
00192
00193 MPI_Recv(&data[0], DATA_SIZE, MPI_DOUBLE, MPI_ANY_SOURCE, global_element_index, PETSC_COMM_WORLD, &status);
00194 }
00195 WriteElementOnMaster(data);
00196 }
00197 *mpMasterFile << "# "<<ChasteBuildInfo::GetProvenanceString();
00198 mpMasterFile->close();
00199 }
00200 else
00201 {
00202
00203 unsigned previous_index = 0u;
00204 unsigned local_index = 0u;
00205 for (typename AbstractTetrahedralMesh<ELEMENT_DIM,SPACE_DIM>::ElementIterator iter = mpMesh->GetElementIteratorBegin();
00206 iter != mpMesh->GetElementIteratorEnd();
00207 ++iter, local_index++)
00208 {
00209 unsigned element_index = iter->GetIndex();
00210
00211 if (previous_index>0u)
00212 {
00213 assert(element_index > previous_index);
00214 }
00215 previous_index = element_index;
00216 if (mpMesh->CalculateDesignatedOwnershipOfElement(element_index))
00217 {
00218
00219 Visit(&(*iter), local_index, data);
00221 MPI_Ssend(&data[0], DATA_SIZE, MPI_DOUBLE, 0, element_index, PETSC_COMM_WORLD);
00222 }
00223 }
00224
00225 }
00226 }
00227
00235 void SetWriteFileAsBinary(bool binary=true)
00236 {
00237 mFileIsBinary = binary;
00238 }
00239
00243 virtual ~AbstractPerElementWriter()
00244 {
00245 }
00246 };
00247
00248
00249 #endif