PottsMeshReader.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 "PottsMeshReader.hpp"
00037 #include "Exception.hpp"
00038
00039 #include <sstream>
00040
00041 template<unsigned SPACE_DIM>
00042 PottsMeshReader<SPACE_DIM>::PottsMeshReader(std::string pathBaseName)
00043 : mFilesBaseName(pathBaseName),
00044 mIndexFromZero(false),
00045 mNumNodes(0),
00046 mNumElements(0),
00047 mNodesRead(0),
00048 mElementsRead(0),
00049 mNumElementAttributes(0)
00050 {
00051 OpenFiles();
00052 ReadHeaders();
00053 }
00054
00055 template<unsigned SPACE_DIM>
00056 unsigned PottsMeshReader<SPACE_DIM>::GetNumElements() const
00057 {
00058 return mNumElements;
00059 }
00060
00061 template<unsigned SPACE_DIM>
00062 unsigned PottsMeshReader<SPACE_DIM>::GetNumNodes() const
00063 {
00064 return mNumNodes;
00065 }
00066
00067 template<unsigned SPACE_DIM>
00068 unsigned PottsMeshReader<SPACE_DIM>::GetNumElementAttributes() const
00069 {
00070 return mNumElementAttributes;
00071 }
00072
00073 template<unsigned SPACE_DIM>
00074 ElementData PottsMeshReader<SPACE_DIM>::GetNextFaceData()
00075 {
00077 ElementData ret;
00078 ret.NodeIndices = std::vector<unsigned>();
00079 ret.AttributeValue = 0;
00080 return ret;
00081 }
00082
00083 template<unsigned SPACE_DIM>
00084 unsigned PottsMeshReader<SPACE_DIM>::GetNumFaces() const
00085 {
00087 return 0;
00088 }
00089
00090 template<unsigned SPACE_DIM>
00091 void PottsMeshReader<SPACE_DIM>::Reset()
00092 {
00093 CloseFiles();
00094 OpenFiles();
00095 ReadHeaders();
00096
00097 mNodesRead = 0;
00098 mElementsRead = 0;
00099 }
00100
00101 template<unsigned SPACE_DIM>
00102 std::vector<double> PottsMeshReader<SPACE_DIM>::GetNextNode()
00103 {
00104 std::vector<double> node_data;
00105
00106 std::string buffer;
00107 GetNextLineFromStream(mNodesFile, buffer);
00108
00109 std::stringstream buffer_stream(buffer);
00110
00111 unsigned index;
00112 buffer_stream >> index;
00113
00114 unsigned offset = mIndexFromZero ? 0 : 1;
00115 if (index != mNodesRead + offset)
00116 {
00117 EXCEPTION("Data for node " << mNodesRead << " missing");
00118 }
00119
00120 double node_value;
00121 for (unsigned i=0; i<SPACE_DIM+1; i++)
00122 {
00123 buffer_stream >> node_value;
00124 node_data.push_back(node_value);
00125 }
00126
00127 mNodesRead++;
00128 return node_data;
00129 }
00130
00131 template<unsigned SPACE_DIM>
00132 ElementData PottsMeshReader<SPACE_DIM>::GetNextElementData()
00133 {
00134
00135 ElementData element_data;
00136
00137 std::string buffer;
00138 GetNextLineFromStream(mElementsFile, buffer);
00139
00140 std::stringstream buffer_stream(buffer);
00141
00142 unsigned element_index;
00143 buffer_stream >> element_index;
00144
00145 unsigned offset = mIndexFromZero ? 0 : 1;
00146 if (element_index != mElementsRead + offset)
00147 {
00148 EXCEPTION("Data for element " << mElementsRead << " missing");
00149 }
00150
00151 unsigned num_nodes_in_element;
00152 buffer_stream >> num_nodes_in_element;
00153
00154
00155 unsigned node_index;
00156 for (unsigned i=0; i<num_nodes_in_element; i++)
00157 {
00158 buffer_stream >> node_index;
00159 element_data.NodeIndices.push_back(node_index - offset);
00160 }
00161
00162 if (mNumElementAttributes > 0)
00163 {
00164 assert(mNumElementAttributes==1);
00165
00166 unsigned attribute_value;
00167 buffer_stream >> attribute_value;
00168 element_data.AttributeValue = attribute_value;
00169 }
00170 else
00171 {
00172 element_data.AttributeValue = 0;
00173 }
00174
00175 mElementsRead++;
00176 return element_data;
00177 }
00178
00179 template<unsigned SPACE_DIM>
00180 void PottsMeshReader<SPACE_DIM>::OpenFiles()
00181 {
00182 OpenNodeFile();
00183 OpenElementsFile();
00184 }
00185
00186 template<unsigned SPACE_DIM>
00187 void PottsMeshReader<SPACE_DIM>::OpenNodeFile()
00188 {
00189
00190 std::string file_name = mFilesBaseName + ".node";
00191 mNodesFile.open(file_name.c_str());
00192 if (!mNodesFile.is_open())
00193 {
00194 EXCEPTION("Could not open data file: " + file_name);
00195 }
00196 }
00197
00198 template<unsigned SPACE_DIM>
00199 void PottsMeshReader<SPACE_DIM>::OpenElementsFile()
00200 {
00201
00202 std::string file_name;
00203 file_name = mFilesBaseName + ".cell";
00204
00205 mElementsFile.open(file_name.c_str());
00206 if (!mElementsFile.is_open())
00207 {
00208 EXCEPTION("Could not open data file: " + file_name);
00209 }
00210 }
00211
00212 template<unsigned SPACE_DIM>
00213 void PottsMeshReader<SPACE_DIM>::ReadHeaders()
00214 {
00215 std::string buffer;
00216
00217 GetNextLineFromStream(mNodesFile, buffer);
00218 std::stringstream buffer_stream(buffer);
00219 buffer_stream >> mNumNodes >> mNumNodeAttributes;
00220
00221
00222 GetNextLineFromStream(mNodesFile, buffer);
00223 std::stringstream node_buffer_stream(buffer);
00224
00225 unsigned first_index;
00226 node_buffer_stream >> first_index;
00227 assert(first_index == 0 || first_index == 1);
00228 mIndexFromZero = (first_index == 0);
00229
00230
00231 mNodesFile.close();
00232 OpenNodeFile();
00233 GetNextLineFromStream(mNodesFile, buffer);
00234
00235 GetNextLineFromStream(mElementsFile, buffer);
00236 std::stringstream element_buffer_stream(buffer);
00237
00238 element_buffer_stream >> mNumElements >> mNumElementAttributes;
00239 }
00240
00241 template<unsigned SPACE_DIM>
00242 void PottsMeshReader<SPACE_DIM>::CloseFiles()
00243 {
00244 mNodesFile.close();
00245 mElementsFile.close();
00246 }
00247
00248 template<unsigned SPACE_DIM>
00249 void PottsMeshReader<SPACE_DIM>::GetNextLineFromStream(std::ifstream& fileStream, std::string& rawLine)
00250 {
00251 bool line_is_blank;
00252
00253 do
00254 {
00255 getline(fileStream, rawLine);
00256
00257 if (fileStream.eof())
00258 {
00259 EXCEPTION("Cannot get the next line from node or element file due to incomplete data");
00260 }
00261
00262
00263 rawLine = rawLine.substr(0,rawLine.find('#', 0));
00264
00265 line_is_blank = (rawLine.find_first_not_of(" \t", 0) == std::string::npos);
00266 }
00267 while (line_is_blank);
00268 }
00269
00271
00273
00274 template class PottsMeshReader<1>;
00275 template class PottsMeshReader<2>;
00276 template class PottsMeshReader<3>;