Hdf5ToXdmfConverter.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 "Hdf5ToXdmfConverter.hpp"
00037
00038 template <unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00039 Hdf5ToXdmfConverter<ELEMENT_DIM, SPACE_DIM>::Hdf5ToXdmfConverter(const FileFinder& rInputDirectory,
00040 const std::string& rFileBaseName,
00041 AbstractTetrahedralMesh<ELEMENT_DIM, SPACE_DIM>* pMesh)
00042 : AbstractHdf5Converter<ELEMENT_DIM,SPACE_DIM>(rInputDirectory, rFileBaseName, pMesh, "xdmf_output", 0u),
00043 XdmfMeshWriter<ELEMENT_DIM,SPACE_DIM>("TestHdf5ToXdmfConverter/xdmf_output", rFileBaseName, false )
00044 {
00046
00047
00048 std::vector<double> time_values = this->mpReader->GetUnlimitedDimensionValues();
00049 unsigned num_timesteps = time_values.size();
00050 this->mNumberOfTimePoints = num_timesteps;
00051
00052 if (num_timesteps > 1)
00053 {
00054 this->mTimeStep = time_values[1] - time_values[0];
00055 }
00056
00057 this->WriteFilesUsingMesh(*pMesh);
00058 }
00059
00060 #ifndef _MSC_VER
00061
00062 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00063 void Hdf5ToXdmfConverter<ELEMENT_DIM, SPACE_DIM>::AddDataOnNodes(XERCES_CPP_NAMESPACE_QUALIFIER DOMElement* pGridElement,
00064 XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument* pDomDocument,
00065 unsigned timeStep)
00066 {
00067
00068 XERCES_CPP_NAMESPACE_USE
00069
00070 unsigned num_timesteps = this->mpReader->GetUnlimitedDimensionValues().size();
00071
00072
00073 for (unsigned var_index=0; var_index<this->mNumVariables; var_index++)
00074 {
00075 std::string variable_name = this->mpReader->GetVariableNames()[var_index];
00076
00077
00078
00079
00080 DOMElement* p_attr_element = pDomDocument->createElement(X("Attribute"));
00081 p_attr_element->setAttribute(X("Name"), X(variable_name));
00082 p_attr_element->setAttribute(X("Center"), X("Node"));
00083 pGridElement->appendChild(p_attr_element);
00084
00085
00086
00087
00088 DOMElement* p_hype_element = pDomDocument->createElement(X("DataItem"));
00089 p_hype_element->setAttribute(X("ItemType"), X("HyperSlab"));
00090 std::stringstream dim_stream;
00091
00092
00094
00095
00096 unsigned num_nodes = AbstractHdf5Converter<ELEMENT_DIM, SPACE_DIM>::mpMesh->GetNumNodes();
00097 dim_stream << "1 " << num_nodes << " 1";
00098 p_hype_element->setAttribute(X("Dimensions"), X(dim_stream.str()));
00099 p_attr_element->appendChild(p_hype_element);
00100
00101
00102
00103
00104 DOMElement* p_xml_element = pDomDocument->createElement(X("DataItem"));
00105 p_xml_element->setAttribute(X("Format"), X("XML"));
00106 p_xml_element->setAttribute(X("Dimensions"), X("3 3"));
00107 p_hype_element->appendChild(p_xml_element);
00108
00109
00110
00111
00112 std::stringstream XMLStream;
00113 XMLStream << timeStep << " 0 " << var_index << " ";
00114 XMLStream << "1 1 1 ";
00115
00116 XMLStream << "1 " << num_nodes << " 1";
00117 DOMText* p_xml_text = pDomDocument->createTextNode(X(XMLStream.str()));
00118 p_xml_element->appendChild(p_xml_text);
00119
00120
00121
00122
00123 DOMElement* p_hdf_element = pDomDocument->createElement(X("DataItem"));
00124 p_hdf_element->setAttribute(X("Format"), X("HDF"));
00125 p_hdf_element->setAttribute(X("NumberType"), X("Float"));
00126 p_hdf_element->setAttribute(X("Precision"), X("8"));
00127 std::stringstream hdf_dims_stream;
00128
00129 hdf_dims_stream << num_timesteps << " " << num_nodes << " " << this->mNumVariables;
00130 p_hdf_element->setAttribute(X("Dimensions"), X(hdf_dims_stream.str()));
00131 p_hype_element->appendChild(p_hdf_element);
00132
00133
00134
00135
00136 std::stringstream HDFStream;
00137 HDFStream << "../" << AbstractHdf5Converter<ELEMENT_DIM, SPACE_DIM>::mFileBaseName << ".h5:/Data";
00138 DOMText* p_hdf_text = pDomDocument->createTextNode(X(HDFStream.str()));
00139 p_hdf_element->appendChild(p_hdf_text);
00140 }
00141 }
00142
00143 #endif
00144
00146
00148
00149 template class Hdf5ToXdmfConverter<1,1>;
00150 template class Hdf5ToXdmfConverter<1,2>;
00151 template class Hdf5ToXdmfConverter<2,2>;
00152 template class Hdf5ToXdmfConverter<1,3>;
00153 template class Hdf5ToXdmfConverter<2,3>;
00154 template class Hdf5ToXdmfConverter<3,3>;