00001 #include "xdmfwriter.h"
00002 #include "stringfunctions.h"
00003 #include <fstream>
00004 #include "stringfunctions.h"
00005
00006 XdmfWriter::XdmfWriter()
00007 {
00008
00009 }
00010 using StringFunctions::to_string;
00011
00012 void XdmfWriter::writeXdmf(std::string hdf5FileName)
00013 {
00014
00015 h5Reader.open(hdf5FileName);
00016
00017 StringList trias = h5Reader.ls("/Triangulations");
00018
00019 StringList fieldvs= h5Reader.ls("/DataSets");
00020
00021 for (unsigned i=0;i<fieldvs.size();i++)
00022 {
00023
00024 fieldvs[i]="/DataSets/"+fieldvs[i];
00025 StringList vInst=h5Reader.ls(fieldvs[i]);
00026
00027 for (unsigned j=0;j<vInst.size();j++)
00028 {
00029 vInst[j]=fieldvs[i]+"/"+vInst[j];
00030 std::string triaName=h5Reader.getDataSetTriangulation(vInst[j]);
00031 std::string time=h5Reader.readAtt(vInst[j],"Time",false);
00032 m_map[triaName][time].push_back(vInst[j]);
00033 }
00034 }
00035
00036 std::string xdmfFileName = StringFunctions::get_prefix_file(StringFunctions::get_file_name(hdf5FileName));
00037 xdmfFileName+=".xdmf";
00038
00039
00040 xmlwriter xml(xdmfFileName);
00041
00042
00043
00044 xml.CreateTag("Xdmf");
00045 xml.CreateTag("Domain");
00046
00047 for (MeshxTimexDataSets::iterator it= m_map.begin();it!=m_map.end();it++)
00048 {
00049
00050 write_grid_info(xml,it->first);
00051 }
00052
00053 std::string dataName;
00054
00055 unsigned gridRef=1;
00056 for (MeshxTimexDataSets::iterator it= m_map.begin();it!=m_map.end();it++)
00057 {
00058 StringList times;
00059
00060 write_temporal_grid_collection(xml,it->first);
00061
00062
00063 for (TimexDataSets::iterator txd=it->second.begin();txd!=it->second.end();txd++)
00064 {
00065 times.push_back(txd->first);
00066 }
00067
00068
00069
00070 for (TimexDataSets::iterator txd=it->second.begin();txd!=it->second.end();txd++)
00071 {
00072 write_grid_reference(xml,it->first+"_"+txd->first,gridRef);
00073
00074 write_time(xml,txd->first);
00075 StringList &strLst=txd->second;
00076 for (StringList::iterator dataIt=strLst.begin();dataIt!=strLst.end();dataIt++)
00077 {
00078 dataName=StringFunctions::get_file_name(*dataIt);
00079 dataName=StringFunctions::strip_from_end(dataName,'_');
00080 write_dataset(xml,*dataIt,dataName);
00081 }
00082 xml.CloseTag("Grid");
00083 }
00084 gridRef++;
00085 xml.CloseTag("Grid");
00086 }
00087 xml.CloseTag("Domain");
00088 xml.CloseTag("Xdmf");
00089
00090 }
00091
00092
00093
00094
00095 void XdmfWriter::printData()
00096 {
00097 for (MeshxTimexDataSets::iterator it= m_map.begin();it!=m_map.end();it++)
00098 {
00099 for (TimexDataSets::iterator it2=it->second.begin();it2!=it->second.end();it2++)
00100 for (StringList::iterator it3=it2->second.begin();it3!=it2->second.end();it3++)
00101 std::cout << it->first << " " << it2->first << " " << *it3 << std::endl;
00102 }
00103 }
00104
00105
00106 void XdmfWriter::write_grid(std::ofstream &out,std::string tria)
00107 {
00108 std::string path="/Triangulations/" + tria;
00109 std::string connections=path+"/connections";
00110 std::string vertices=path+"/vertices";
00111 VecIndex conDims=h5Reader.getDataSetDim(connections);
00112 VecIndex vertDims=h5Reader.getDataSetDim(vertices);
00113
00114 assert(conDims[1] == 8);
00115 assert(vertDims[1] == 3);
00116
00117 char str[10000];
00118
00119
00120
00121 sprintf(str,"\
00122 <Topology TopologyType=\"Tetrahedron\" Order=\"0 1 3 2 4 5 7 6\" NumberOfElements=\"%d\">\n\
00123 <DataItem ItemType=\"Uniform\" Format=\"HDF\" NumberType=\"Int\" Dimensions=\"%d 8\">\n\
00124 %s\n\
00125 </DataItem>\n\
00126 </Topology>\n\
00127 <Geometry GeometryType=\"XYZ\">\n\
00128 <DataItem ItemType=\"Uniform\" Format=\"HDF\" NumberType=\"Float\" Precision=\"8\" Dimensions=\"%d 3\">\n\
00129 %s\n\
00130 </DataItem>\n\
00131 </Geometry>\n",conDims[0],conDims[0],connections.c_str(),vertDims[0],vertices.c_str());
00132 out << str;
00133
00134
00135 }
00136
00137
00138 void XdmfWriter::write_grid_info(xmlwriter &xml,std::string tria)
00139 {
00140 std::string path="/Triangulations/" + tria;
00141 std::string connections=path+"/connections";
00142 std::string vertices=path+"/vertices";
00143 VecIndex conDims=h5Reader.getDataSetDim(connections);
00144 VecIndex vertDims=h5Reader.getDataSetDim(vertices);
00145
00146 assert(conDims[1] == 8);
00147 assert(vertDims[1] == 3);
00148
00149
00150 xml.AddAttributes("TopologyType","Hexahedron");
00151 xml.AddAttributes("Order","0 1 3 2 4 5 7 6");
00152 xml.AddAttributes("NumberType","Int");
00153 xml.AddAttributes("NumberOfElements",to_string(conDims[0]));
00154 xml.CreateTag("Topology");
00155
00156 xml.AddAttributes("ItemType","Uniform");
00157 xml.AddAttributes("Format","HDF");
00158 xml.AddAttributes("NumberType","Int");
00159 xml.AddAttributes("Dimensions",to_string(conDims[0],8));
00160 xml.CreateTag("DataItem");
00161 xml.AddString(h5Reader.getFileName()+":"+connections);
00162 xml.CloseTag("DataItem");
00163 xml.CloseTag("Topology");
00164
00165 xml.AddAttributes("GeometryType","XYZ");
00166 xml.CreateTag("Geometry");
00167
00168 xml.AddAttributes("ItemType","Uniform");
00169 xml.AddAttributes("Format","HDF");
00170 xml.AddAttributes("NumberType","Float");
00171 xml.AddAttributes("Precision","8");
00172 xml.AddAttributes("Dimensions",to_string(vertDims[0],3));
00173 xml.CreateTag("DataItem");
00174 xml.AddString(h5Reader.getFileName()+":"+vertices);
00175 xml.CloseTag("DataItem");
00176 xml.CloseTag("Geometry");
00177
00178
00179
00180
00181 }
00182
00183
00184 void XdmfWriter::write_temporal_grid_collection(xmlwriter &xml,std::string tria)
00185 {
00186
00187 xml.AddAttributes("Name","TimeSeries_"+tria);
00188 xml.AddAttributes("GridType","Collection");
00189 xml.AddAttributes("CollectionType","Temporal");
00190 xml.CreateTag("Grid");
00191
00192 }
00193
00194
00195 void XdmfWriter::write_grid_reference(xmlwriter &out,std::string gridName,unsigned infoNumber)
00196 {
00197 out.AddAttributes("Name",gridName);
00198 out.AddAttributes("GridType","Uniform");
00199 out.CreateTag("Grid");
00200 out.AddAttributes("Reference","/Xdmf/Domain/Topology[" + to_string(infoNumber) + "]");
00201 out.CreateEmptyElement("Topology");
00202 out.AddAttributes("Reference","/Xdmf/Domain/Geometry[" + to_string(infoNumber) + "]");
00203 out.CreateEmptyElement("Geometry");
00204
00205
00206 }
00207
00208
00209
00210 void XdmfWriter::write_dataset(xmlwriter &xml,std::string dataset,std::string datasetName)
00211 {
00212 VecIndex datasetDims=h5Reader.getDataSetDim(dataset);
00213 assert(datasetDims.size() == 1);
00214 xml.AddAttributes("Name",datasetName);
00215 xml.AddAttributes("Center","Node");
00216 xml.CreateTag("Attribute");
00217
00218 xml.AddAttributes("Format","HDF");
00219 xml.AddAttributes("DataType","Float");
00220 xml.AddAttributes("Precision","8");
00221 xml.AddAttributes("Dimensions",to_string(datasetDims[0]));
00222 xml.CreateChild("DataItem",h5Reader.getFileName()+":" +dataset);
00223 xml.CloseTag("Attribute");
00224 }
00225
00226
00227 void XdmfWriter::write_time_list(xmlwriter &xml,StringList times)
00228 {
00229 xml.AddAttributes("TimeType","List");
00230 xml.CreateTag("Time");
00231
00232 xml.AddAttributes("Format","XML");
00233 xml.AddAttributes("DataType","Float");
00234 xml.AddAttributes("Precision","4");
00235 xml.AddAttributes("Dimensions",to_string(times.size()));
00236 xml.CreateChild("DataItem",to_string(times));
00237 xml.CloseTag("Time");
00238
00239
00240 }
00241
00242
00243 void XdmfWriter::write_time(xmlwriter &xml,std::string time)
00244 {
00245 xml.AddAttributes("Value",time);
00246 xml.CreateEmptyElement("Time");
00247 }