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
00030
00031
00032
00033
00034
00035
00036 #include "Hdf5ToMeshalyzerConverter.hpp"
00037 #include "MeshalyzerMeshWriter.hpp"
00038 #include "GenericMeshReader.hpp"
00039 #include "UblasCustomFunctions.hpp"
00040 #include "PetscTools.hpp"
00041 #include "Exception.hpp"
00042 #include "ReplicatableVector.hpp"
00043 #include "DistributedVector.hpp"
00044 #include "DistributedVectorFactory.hpp"
00045 #include "Version.hpp"
00046
00047 template <unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00048 void Hdf5ToMeshalyzerConverter<ELEMENT_DIM,SPACE_DIM>::Write(std::string type)
00049 {
00050
00051 std::string filename = "";
00052 if (this->mDatasetNames[this->mOpenDatasetIndex] == "Data")
00053 {
00054 filename += this->mFileBaseName + "_";
00055 }
00056 filename += type + ".dat";
00057
00058 out_stream p_file = out_stream(NULL);
00059 if (PetscTools::AmMaster())
00060 {
00061 p_file = this->mpOutputFileHandler->OpenOutputFile(filename);
00062
00063
00064 if (this->mPrecision != 0)
00065 {
00066 p_file->precision(this->mPrecision);
00067 }
00068 }
00069
00070 unsigned num_nodes = this->mpReader->GetNumberOfRows();
00071 unsigned num_timesteps = this->mpReader->GetUnlimitedDimensionValues().size();
00072
00073 DistributedVectorFactory factory(num_nodes);
00074
00075 Vec data = factory.CreateVec();
00076 ReplicatableVector repl_data(num_nodes);
00077 for (unsigned time_step=0; time_step<num_timesteps; time_step++)
00078 {
00079 this->mpReader->GetVariableOverNodes(data, type, time_step);
00080 repl_data.ReplicatePetscVector(data);
00081
00082 assert(repl_data.GetSize() == num_nodes);
00083
00084 if (PetscTools::AmMaster())
00085 {
00086 for (unsigned i=0; i<num_nodes; i++)
00087 {
00088 *p_file << repl_data[i] << "\n";
00089 }
00090 }
00091 }
00092 PetscTools::Destroy(data);
00093 if (PetscTools::AmMaster())
00094 {
00095 std::string comment = "# " + ChasteBuildInfo::GetProvenanceString();
00096 *p_file << comment;
00097 p_file->close();
00098 }
00099 }
00100
00101 template <unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00102 Hdf5ToMeshalyzerConverter<ELEMENT_DIM,SPACE_DIM>::Hdf5ToMeshalyzerConverter(const FileFinder& rInputDirectory,
00103 const std::string& rFileBaseName,
00104 AbstractTetrahedralMesh<ELEMENT_DIM,SPACE_DIM>* pMesh,
00105 bool usingOriginalNodeOrdering,
00106 unsigned precision)
00107 : AbstractHdf5Converter<ELEMENT_DIM,SPACE_DIM>(rInputDirectory, rFileBaseName, pMesh, "output", precision)
00108 {
00109 do
00110 {
00111 std::vector<std::string> variable_names = this->mpReader->GetVariableNames();
00112 for (unsigned i=0; i<variable_names.size(); i++)
00113 {
00114 Write(variable_names[i]);
00115 }
00116 }
00117 while ( this->MoveOntoNextDataset() );
00118
00119
00120
00121 FileFinder test_output("",RelativeTo::ChasteTestOutput);
00122 std::string output_directory = rInputDirectory.GetRelativePath(test_output) + "/" + this->mRelativeSubdirectory;
00123 FileFinder mesh_file(output_directory + "/" + rFileBaseName + "_mesh.pts", RelativeTo::ChasteTestOutput);
00124
00125 if (!mesh_file.IsFile())
00126 {
00127
00128 MeshalyzerMeshWriter<ELEMENT_DIM,SPACE_DIM> mesh_writer(output_directory, rFileBaseName + "_mesh", false);
00129
00130
00131 if (!usingOriginalNodeOrdering || !this->mpMesh->IsMeshOnDisk())
00132 {
00133
00134 mesh_writer.WriteFilesUsingMesh(*(this->mpMesh), false);
00135 }
00136 else
00137 {
00138
00140
00141 std::string original_file = this->mpMesh->GetMeshFileBaseName();
00142 std::auto_ptr<AbstractMeshReader<ELEMENT_DIM, SPACE_DIM> > p_original_mesh_reader
00143 = GenericMeshReader<ELEMENT_DIM, SPACE_DIM>(original_file);
00144 mesh_writer.WriteFilesUsingMeshReader(*p_original_mesh_reader);
00145 }
00146 }
00147 PetscTools::Barrier("Hdf5ToMeshalyzerConverter");
00148 }
00149
00151
00153
00154 template class Hdf5ToMeshalyzerConverter<1,1>;
00155 template class Hdf5ToMeshalyzerConverter<1,2>;
00156 template class Hdf5ToMeshalyzerConverter<2,2>;
00157 template class Hdf5ToMeshalyzerConverter<1,3>;
00158 template class Hdf5ToMeshalyzerConverter<2,3>;
00159 template class Hdf5ToMeshalyzerConverter<3,3>;