std::vector<double> PottsMeshReader<SPACE_DIM>::GetNextNode() { std::vector<double> node_data; std::string buffer; GetNextLineFromStream(mNodesFile, buffer); std::stringstream buffer_stream(buffer); unsigned index; buffer_stream >> index; unsigned offset = mIndexFromZero ? 0 : 1; if (index != mNodesRead + offset) { EXCEPTION("Data for node " << mNodesRead << " missing"); } double node_value; for (unsigned i=0; i<SPACE_DIM+1; i++) { buffer_stream >> node_value; node_data.push_back(node_value); } mNodesRead++; return node_data; }
ElementData PottsMeshReader<SPACE_DIM>::GetNextElementData() { // Create data structure for this element ElementData element_data; std::string buffer; GetNextLineFromStream(mElementsFile, buffer); std::stringstream buffer_stream(buffer); unsigned element_index; buffer_stream >> element_index; unsigned offset = mIndexFromZero ? 0 : 1; if (element_index != mElementsRead + offset) { EXCEPTION("Data for element " << mElementsRead << " missing"); } unsigned num_nodes_in_element; buffer_stream >> num_nodes_in_element; // Store node indices owned by this element unsigned node_index; for (unsigned i=0; i<num_nodes_in_element; i++) { buffer_stream >> node_index; element_data.NodeIndices.push_back(node_index - offset); } if (mNumElementAttributes > 0) { assert(mNumElementAttributes==1); unsigned attribute_value; buffer_stream >> attribute_value; element_data.AttributeValue = attribute_value; }
void TrianglesMeshReader<ELEMENT_DIM, SPACE_DIM>::ReadHeaders() { /* * Reading node file header */ std::string buffer; GetNextLineFromStream(mNodesFile, buffer); std::stringstream node_header_line(buffer); unsigned dimension; node_header_line >> mNumNodes >> dimension >> mNumNodeAttributes >> mMaxNodeBdyMarker; if (SPACE_DIM != dimension) { EXCEPTION("SPACE_DIM != dimension read from file "); } // Is there anything else on the header line? std::string extras; node_header_line >> extras; if (extras == "BIN") { mFilesAreBinary = true; mNodeFileDataStart = mNodesFile.tellg(); // Record the position of the first byte after the header. mNodeItemWidth = SPACE_DIM * sizeof(double); // We enforce that all binary files (written by Chaste) are indexed from zero mIndexFromZero = true; } else { // #1621 - ncl files are only supported in binary read mode. assert(!mNclFileAvailable); // Get the next line to see if it is indexed from zero or not GetNextLineFromStream(mNodesFile, buffer); std::stringstream node_first_line(buffer); unsigned first_index; node_first_line >> first_index; assert(first_index == 0 || first_index == 1); mIndexFromZero = (first_index == 0); // Close, reopen, skip header mNodesFile.close(); OpenNodeFile(); GetNextLineFromStream(mNodesFile, buffer); } /* * Reading element file header */ GetNextLineFromStream(mElementsFile, buffer); std::stringstream element_header_line(buffer); unsigned extra_attributes = 0; if (ELEMENT_DIM == SPACE_DIM) { element_header_line >> mNumElements >> mNumElementNodes >> mNumElementAttributes; extra_attributes = mNumElementAttributes; // Is there anything else on the header line? std::string element_extras; element_header_line >> element_extras; if (element_extras == "BIN") { // Double check for binaryness assert (mFilesAreBinary); } else if (element_extras == "HEX") { mMeshIsHexahedral = true; if ( ELEMENT_DIM == 2 ) { mNodesPerElement = 4; mNodesPerBoundaryElement = 2; } if ( ELEMENT_DIM == 3 ) { mNodesPerElement = 8; mNodesPerBoundaryElement = 4; } } else { assert (element_extras == ""); } // The condition below allows the writer to cope with a NodesOnlyMesh if (mNumElements != 0) { if (mNumElementNodes != mNodesPerElement) { EXCEPTION("Number of nodes per elem, " << mNumElementNodes << ", does not match " << "expected number, " << mNodesPerElement << " (which is calculated given " << "the order of elements chosen, " << mOrderOfElements << " (1=linear, 2=quadratics)"); } } }