Hdf5ToMeshalyzerConverter.cpp
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 #include "Hdf5ToMeshalyzerConverter.hpp"
00030 #include "MeshalyzerMeshWriter.hpp"
00031 #include "GenericMeshReader.hpp"
00032 #include "UblasCustomFunctions.hpp"
00033 #include "HeartConfig.hpp"
00034 #include "PetscTools.hpp"
00035 #include "Exception.hpp"
00036 #include "ReplicatableVector.hpp"
00037 #include "DistributedVector.hpp"
00038 #include "DistributedVectorFactory.hpp"
00039 #include "Version.hpp"
00040
00041 template <unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00042 void Hdf5ToMeshalyzerConverter<ELEMENT_DIM,SPACE_DIM>::Write(std::string type)
00043 {
00044 out_stream p_file = out_stream(NULL);
00045 if (PetscTools::AmMaster())
00046 {
00047 p_file = this->mpOutputFileHandler->OpenOutputFile(this->mFileBaseName + "_" + type + ".dat");
00048
00049
00050 unsigned num_digits = HeartConfig::Instance()->GetVisualizerOutputPrecision();
00051 if (num_digits != 0)
00052 {
00053 p_file->precision(num_digits);
00054 }
00055 }
00056
00057 unsigned num_nodes = this->mpReader->GetNumberOfRows();
00058 unsigned num_timesteps = this->mpReader->GetUnlimitedDimensionValues().size();
00059
00060 DistributedVectorFactory factory(num_nodes);
00061
00062 Vec data = factory.CreateVec();
00063 ReplicatableVector repl_data(num_nodes);
00064 for (unsigned time_step=0; time_step<num_timesteps; time_step++)
00065 {
00066 this->mpReader->GetVariableOverNodes(data, type, time_step);
00067 repl_data.ReplicatePetscVector(data);
00068
00069 assert(repl_data.GetSize() == num_nodes);
00070
00071 if (PetscTools::AmMaster())
00072 {
00073 for (unsigned i=0; i<num_nodes; i++)
00074 {
00075 *p_file << repl_data[i] << "\n";
00076 }
00077 }
00078 }
00079 VecDestroy(data);
00080 if (PetscTools::AmMaster())
00081 {
00082 std::string comment = "# " + ChasteBuildInfo::GetProvenanceString();
00083 *p_file << comment;
00084 p_file->close();
00085 }
00086 }
00087
00088 template <unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00089 Hdf5ToMeshalyzerConverter<ELEMENT_DIM,SPACE_DIM>::Hdf5ToMeshalyzerConverter(std::string inputDirectory,
00090 std::string fileBaseName,
00091 AbstractTetrahedralMesh<ELEMENT_DIM,SPACE_DIM>* pMesh,
00092 bool usingOriginalNodeOrdering)
00093 : AbstractHdf5Converter<ELEMENT_DIM,SPACE_DIM>(inputDirectory, fileBaseName, pMesh, "output")
00094 {
00095 std::vector<std::string> variable_names = this->mpReader->GetVariableNames();
00096 for (unsigned i=0; i<variable_names.size(); i++)
00097 {
00098 Write(variable_names[i]);
00099 }
00100
00101
00102 std::string output_directory = inputDirectory + "/" + this->mRelativeSubdirectory;
00103 MeshalyzerMeshWriter<ELEMENT_DIM,SPACE_DIM> mesh_writer(output_directory, fileBaseName+"_mesh", false);
00104
00105
00106 if (!usingOriginalNodeOrdering)
00107 {
00108
00109 mesh_writer.WriteFilesUsingMesh(*(this->mpMesh), false);
00110 }
00111 else
00112 {
00113
00115
00116 std::string original_file = this->mpMesh->GetMeshFileBaseName();
00117 std::auto_ptr<AbstractMeshReader<ELEMENT_DIM, SPACE_DIM> > p_original_mesh_reader
00118 = GenericMeshReader<ELEMENT_DIM, SPACE_DIM>(original_file);
00119 mesh_writer.WriteFilesUsingMeshReader(*p_original_mesh_reader);
00120 }
00121 PetscTools::Barrier("Hdf5ToMeshalyzerConverter");
00122 }
00123
00125
00127
00128 template class Hdf5ToMeshalyzerConverter<1,1>;
00129 template class Hdf5ToMeshalyzerConverter<1,2>;
00130 template class Hdf5ToMeshalyzerConverter<2,2>;
00131 template class Hdf5ToMeshalyzerConverter<1,3>;
00132 template class Hdf5ToMeshalyzerConverter<2,3>;
00133 template class Hdf5ToMeshalyzerConverter<3,3>;