// ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- void VoxelDataContainer::addVertexData(const std::string &name, IDataArray::Pointer data) { if (data->GetName().compare(name) != 0) { std::cout << "Adding Vertex array with different array name than key name" << std::endl; std::cout << "Key name: " << name << std::endl; std::cout << "Array Name:" << data->GetName() << std::endl; data->SetName(name); } m_VertexData[name] = data; m_NumVertexTuples = data->GetNumberOfTuples(); }
// ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- void SurfaceMeshDataContainer::addEnsembleData(const std::string &name, IDataArray::Pointer data) { if (data->GetName().compare(name) != 0) { std::cout << "Adding Ensemble array with different array name than key name" << std::endl; std::cout << "Key name: " << name << std::endl; std::cout << "Array Name:" << data->GetName() << std::endl; data->SetName(name); } m_EnsembleData[name] = data; m_NumEnsembleTuples = data->GetNumberOfTuples(); }
// ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- void FieldDataCSVWriter::execute() { int err = 0; setErrorCondition(err); VoxelDataContainer* m = getVoxelDataContainer(); if(NULL == m) { setErrorCondition(-999); notifyErrorMessage("The DataContainer Object was NULL", -999); return; } // Make sure any directory path is also available as the user may have just typed // in a path without actually creating the full path std::string parentPath = MXAFileInfo::parentPath(m_FieldDataFile); if(!MXADir::mkdir(parentPath, true)) { std::stringstream ss; ss << "Error creating parent path '" << parentPath << "'"; notifyErrorMessage(ss.str(), -1); setErrorCondition(-1); return; } std::string filename = getFieldDataFile(); std::ofstream outFile; outFile.open(filename.c_str(), std::ios_base::binary); char space = DREAM3D::GrainData::Delimiter; // Write the total number of grains outFile << m->getNumFieldTuples()-1 << std::endl; // Get all the names of the arrays from the Data Container std::list<std::string> headers = m->getFieldArrayNameList(); std::vector<IDataArray::Pointer> data; //For checking if an array is a neighborlist NeighborList<int>::Pointer neighborlistPtr = NeighborList<int>::New(); // Print the GrainIds Header before the rest of the headers outFile << DREAM3D::GrainData::GrainID; // Loop throught the list and print the rest of the headers, ignoring those we don't want for(std::list<std::string>::iterator iter = headers.begin(); iter != headers.end(); ++iter) { // Only get the array if the name does NOT match those listed IDataArray::Pointer p = m->getFieldData(*iter); if(p->getNameOfClass().compare(neighborlistPtr->getNameOfClass()) != 0) { if (p->GetNumberOfComponents() == 1) { outFile << space << (*iter); } else // There are more than a single component so we need to add multiple header values { for(int k = 0; k < p->GetNumberOfComponents(); ++k) { outFile << space << (*iter) << "_" << k; } } // Get the IDataArray from the DataContainer data.push_back(p); } } outFile << std::endl; // Get the number of tuples in the arrays size_t numTuples = data[0]->GetNumberOfTuples(); std::stringstream ss; float threshold = 0.0f; // Skip the first grain for(size_t i = 1; i < numTuples; ++i) { if (((float)i / numTuples) * 100.0f > threshold) { ss.str(""); ss << "Writing Field Data - " << ((float)i / numTuples) * 100 << "% Complete"; notifyStatusMessage(ss.str()); threshold = threshold + 5.0f; if (threshold < ((float)i / numTuples) * 100.0f) { threshold = ((float)i / numTuples) * 100.0f; } } // Print the grain id outFile << i; // Print a row of data for( std::vector<IDataArray::Pointer>::iterator p = data.begin(); p != data.end(); ++p) { outFile << space; (*p)->printTuple(outFile, i, space); } outFile << std::endl; } if(m_WriteNeighborListData == true) { // Print the GrainIds Header before the rest of the headers // Loop throught the list and print the rest of the headers, ignoring those we don't want for(std::list<std::string>::iterator iter = headers.begin(); iter != headers.end(); ++iter) { // Only get the array if the name does NOT match those listed IDataArray::Pointer p = m->getFieldData(*iter); if(p->getNameOfClass().compare(neighborlistPtr->getNameOfClass()) == 0) { outFile << DREAM3D::GrainData::GrainID << space << DREAM3D::GrainData::NumNeighbors << space << (*iter) << std::endl; size_t numTuples = p->GetNumberOfTuples(); // float threshold = 0.0f; // Skip the first grain for(size_t i = 1; i < numTuples; ++i) { // Print the grain id outFile << i; // Print a row of data outFile << space; p->printTuple(outFile, i, space); outFile << std::endl; } } } } outFile.close(); // If there is an error set this to something negative and also set a message notifyStatusMessage("FieldDataCSVWriter Completed"); }
// ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- void ChangeResolution::execute() { int err = 0; setErrorCondition(err); DREAM3D_RANDOMNG_NEW() VoxelDataContainer* m = getVoxelDataContainer(); if(NULL == m) { setErrorCondition(-999); notifyErrorMessage("The DataContainer Object was NULL", -999); return; } setErrorCondition(0); if (getErrorCondition() < 0) { return; } if(m->getXRes() == m_Resolution.x && m->getYRes() == m_Resolution.y && m->getZRes() == m_Resolution.z) { return; } size_t dims[3]; m->getDimensions(dims); float sizex = (dims[0])*m->getXRes(); float sizey = (dims[1])*m->getYRes(); float sizez = (dims[2])*m->getZRes(); int m_XP = int(sizex / m_Resolution.x); int m_YP = int(sizey / m_Resolution.y); int m_ZP = int(sizez / m_Resolution.z); int64_t totalPoints = m_XP*m_YP*m_ZP; float x, y, z; int col, row, plane; int index; int index_old; std::vector<size_t> newindicies; newindicies.resize(totalPoints); for (int i = 0; i < m_ZP; i++) { std::stringstream ss; ss << "Changing Resolution - " << ((float)i/m->getZPoints())*100 << " Percent Complete"; notifyStatusMessage(ss.str()); for (int j = 0; j < m_YP; j++) { for (int k = 0; k < m_XP; k++) { x = (k * m_Resolution.x); y = (j * m_Resolution.y); z = (i * m_Resolution.z); col = int(x / m->getXRes()); row = int(y / m->getYRes()); plane = int(z / m->getZRes()); index_old = (plane * m->getXPoints() * m->getYPoints()) + (row * m->getXPoints()) + col; index = (i * m_XP * m_YP) + (j * m_XP) + k; newindicies[index] = index_old; } } } std::list<std::string> voxelArrayNames = m->getCellArrayNameList(); for (std::list<std::string>::iterator iter = voxelArrayNames.begin(); iter != voxelArrayNames.end(); ++iter) { std::string name = *iter; IDataArray::Pointer p = m->getCellData(*iter); // Make a copy of the 'p' array that has the same name. When placed into // the data container this will over write the current array with // the same name. At least in theory IDataArray::Pointer data = p->createNewArray(p->GetNumberOfTuples(), p->GetNumberOfComponents(), p->GetName()); data->Resize(totalPoints); void* source = NULL; void* destination = NULL; size_t newIndicies_I = 0; int nComp = data->GetNumberOfComponents(); for (size_t i = 0; i < static_cast<size_t>(totalPoints); i++) { newIndicies_I = newindicies[i]; source = p->GetVoidPointer((nComp * newIndicies_I)); destination = data->GetVoidPointer((data->GetNumberOfComponents() * i)); ::memcpy(destination, source, p->GetTypeSize() * data->GetNumberOfComponents()); } m->addCellData(*iter, data); } m->setResolution(m_Resolution.x, m_Resolution.y, m_Resolution.z); m->setDimensions(m_XP, m_YP, m_ZP); notifyStatusMessage("Complete"); }
// ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- IDataArray::Pointer H5DataArrayReader::readStringDataArray(hid_t gid, const std::string &name, bool preflightOnly) { herr_t err = -1; herr_t retErr = 1; hid_t typeId = -1; H5T_class_t attr_type; size_t attr_size; std::string res; std::vector<hsize_t> dims; //Reusable for the loop IDataArray::Pointer ptr = IDataArray::NullPointer(); //std::cout << "Reading Attribute " << *iter << std::endl; typeId = H5Lite::getDatasetType(gid, name); if (typeId < 0) { return ptr; } err = H5Lite::getDatasetInfo(gid, name, dims, attr_type, attr_size); if(err < 0) { std::cout << "Error in getAttributeInfo method in readUserMetaData." << std::endl; } else { std::string classType; err = H5Lite::readStringAttribute(gid, name, DREAM3D::HDF5::ObjectType, classType); if (err < 0) { return ptr; } int numComp = 1; err = H5Lite::readScalarAttribute(gid, name, DREAM3D::HDF5::NumComponents, numComp); if (err < 0) { numComp = 1; } if(H5Tequal(typeId, H5T_STD_U8BE) || H5Tequal(typeId, H5T_STD_U8LE) || H5Tequal(typeId, H5T_STD_I8BE) || H5Tequal(typeId, H5T_STD_I8LE) ) { if (preflightOnly == false) { IDataArray::Pointer bufferPtr = Detail::readH5Dataset<char>(gid, name, dims); const char* buf = reinterpret_cast<char*>(bufferPtr->GetVoidPointer(0)); // count the number of 0x00 characters which are the 'null termination' of each string size_t size = bufferPtr->GetNumberOfTuples(); size_t count = 0; for(size_t i = 0; i < size; ++i) { if(buf[i] == 0) { ++count; } } ptr = StringDataArray::CreateArray(count, name); StringDataArray* strArray = StringDataArray::SafePointerDownCast(ptr.get()); size_t start = 0; size_t index = 0; for(size_t i = 0; i < size; ++i) { if(buf[i] == 0) { std::string str( &(buf[start]) ); strArray->SetValue(index, str); ++index; start = i + 1; } } } else // We are preflighting only so just create a StringDataArray of lenght 1 { ptr = StringDataArray::CreateArray(1, name); } } } CloseH5T(typeId, err, retErr); return ptr; }
// ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- std::string SurfaceMeshDataContainerWriter::writeXdmfAttributeDataHelper(int numComp, const std::string &attrType, const std::string &groupName, IDataArray::Pointer array, const std::string ¢ering, int precision, const std::string &xdmfTypeName) { std::stringstream out; std::stringstream dimStr; std::stringstream dimStr1; std::stringstream dimStr1half; std::stringstream dimStr2; std::stringstream dimStr2half; if((numComp%2) == 1) { out << " <Attribute Name=\"" << array->GetName() << "\" "; out << "AttributeType=\"" << attrType << "\" "; dimStr << array->GetNumberOfTuples() << " " << array->GetNumberOfComponents(); out << "Center=\"" << centering << "\">" << std::endl; // Open the <DataItem> Tag out << " <DataItem Format=\"HDF\" Dimensions=\"" << dimStr.str() << "\" "; out << "NumberType=\"" << xdmfTypeName << "\" " << "Precision=\"" << precision << "\" >" << std::endl; ssize_t nameSize = H5Fget_name(m_HdfFileId, NULL, 0) + 1; std::vector<char> nameBuffer(nameSize, 0); nameSize = H5Fget_name(m_HdfFileId, &(nameBuffer.front()), nameSize); std::string hdfFileName(&(nameBuffer.front()), nameSize); hdfFileName = MXAFileInfo::filename(hdfFileName); out << " " << hdfFileName << ":/SurfaceMeshDataContainer/" << groupName << "/" << array->GetName() << std::endl; out << " </DataItem>" << std::endl; out << " </Attribute>" << std::endl << std::endl; } else { //First Slab out << " <Attribute Name=\"" << array->GetName() << " (Field 0)\" "; out << "AttributeType=\"" << attrType << "\" "; dimStr1 << array->GetNumberOfTuples() << " " << array->GetNumberOfComponents(); dimStr1half << array->GetNumberOfTuples() << " " << (array->GetNumberOfComponents()/2); out << "Center=\"" << centering << "\">" << std::endl; // Open the <DataItem> Tag out << " <DataItem ItemType=\"HyperSlab\" Dimensions=\"" << dimStr1half.str() << "\" "; out << "Type=\"HyperSlab\" " << "Name=\"" << array->GetName() << " (Field 0)\" >" << std::endl; out << " <DataItem Dimensions=\"3 2\" " << "Format=\"XML\" >" << std::endl; out << " 0 0" << std::endl; out << " 1 1" << std::endl; out << " " << dimStr1half.str() << " </DataItem>" << std::endl; out << std::endl; out << " <DataItem Format=\"HDF\" Dimensions=\"" << dimStr1.str() << "\" " << "NumberType=\"" << xdmfTypeName << "\" " << "Precision=\"" << precision << "\" >" << std::endl; ssize_t nameSize = H5Fget_name(m_HdfFileId, NULL, 0) + 1; std::vector<char> nameBuffer(nameSize, 0); nameSize = H5Fget_name(m_HdfFileId, &(nameBuffer.front()), nameSize); std::string hdfFileName(&(nameBuffer.front()), nameSize); hdfFileName = MXAFileInfo::filename(hdfFileName); out << " " << hdfFileName << ":/SurfaceMeshDataContainer/" << groupName << "/" << array->GetName() << std::endl; out << " </DataItem>" << std::endl; out << " </DataItem>" << std::endl; out << " </Attribute>" << std::endl << std::endl; //Second Slab out << " <Attribute Name=\"" << array->GetName() << " (Field 1)\" "; out << "AttributeType=\"" << attrType << "\" "; dimStr2 << array->GetNumberOfTuples() << " " << array->GetNumberOfComponents(); dimStr2half << array->GetNumberOfTuples() << " " << (array->GetNumberOfComponents()/2); out << "Center=\"" << centering << "\">" << std::endl; // Open the <DataItem> Tag out << " <DataItem ItemType=\"HyperSlab\" Dimensions=\"" << dimStr2half.str() << "\" "; out << "Type=\"HyperSlab\" " << "Name=\"" << array->GetName() << " (Field 1)\" >" << std::endl; out << " <DataItem Dimensions=\"3 2\" " << "Format=\"XML\" >" << std::endl; out << " 0 " << (array->GetNumberOfComponents()/2) << std::endl; out << " 1 1" << std::endl; out << " " << dimStr2half.str() << " </DataItem>" << std::endl; out << std::endl; out << " <DataItem Format=\"HDF\" Dimensions=\"" << dimStr2.str() << "\" " << "NumberType=\"" << xdmfTypeName << "\" " << "Precision=\"" << precision << "\" >" << std::endl; ssize_t nameSize2 = H5Fget_name(m_HdfFileId, NULL, 0) + 1; std::vector<char> nameBuffer2(nameSize2, 0); nameSize2 = H5Fget_name(m_HdfFileId, &(nameBuffer2.front()), nameSize2); std::string hdfFileName2(&(nameBuffer2.front()), nameSize2); hdfFileName2 = MXAFileInfo::filename(hdfFileName2); out << " " << hdfFileName2 << ":/SurfaceMeshDataContainer/" << groupName << "/" << array->GetName() << std::endl; out << " </DataItem>" << std::endl; out << " </DataItem>" << std::endl; out << " </Attribute>" << std::endl << std::endl; } return out.str(); }