MeshLib::NodePartitionedMesh* NodePartitionedMeshReader::readBinary( const std::string &file_name_base) { //---------------------------------------------------------------------------------- // Read headers const std::string fname_header = file_name_base + "_partitioned_msh_"; const std::string fname_num_p_ext = std::to_string(_mpi_comm_size) + ".bin"; if (!readBinaryDataFromFile(fname_header + "cfg" + fname_num_p_ext, static_cast<MPI_Offset>( static_cast<unsigned>(_mpi_rank) * sizeof(_mesh_info)), MPI_LONG, _mesh_info)) return nullptr; //---------------------------------------------------------------------------------- // Read Nodes std::vector<NodeData> nodes(_mesh_info.nodes); if (!readBinaryDataFromFile(fname_header + "nod" + fname_num_p_ext, static_cast<MPI_Offset>(_mesh_info.offset[2]), _mpi_node_type, nodes)) return nullptr; std::vector<MeshLib::Node*> mesh_nodes; std::vector<unsigned long> glb_node_ids; setNodes(nodes, mesh_nodes, glb_node_ids); //---------------------------------------------------------------------------------- // Read non-ghost elements std::vector<unsigned long> elem_data( _mesh_info.regular_elements + _mesh_info.offset[0]); if (!readBinaryDataFromFile(fname_header + "ele" + fname_num_p_ext, static_cast<MPI_Offset>(_mesh_info.offset[3]), MPI_LONG, elem_data)) return nullptr; std::vector<MeshLib::Element*> mesh_elems( _mesh_info.regular_elements + _mesh_info.ghost_elements); setElements(mesh_nodes, elem_data, mesh_elems); //---------------------------------------------------------------------------------- //Read ghost element std::vector<unsigned long> ghost_elem_data( _mesh_info.ghost_elements + _mesh_info.offset[1]); if (!readBinaryDataFromFile(fname_header + "ele_g" + fname_num_p_ext, static_cast<MPI_Offset>(_mesh_info.offset[4]), MPI_LONG, ghost_elem_data)) return nullptr; const bool process_ghost = true; setElements(mesh_nodes, ghost_elem_data, mesh_elems, process_ghost); //---------------------------------------------------------------------------------- return newMesh(BaseLib::extractBaseName(file_name_base), mesh_nodes, glb_node_ids, mesh_elems); }
/* ************************************************************************************ */ int readBinaryDataFromFile(FILE *iStream, int nItemsToRead, float **arrayToRead, int swab_flag) { // Reads binary data to stream, swab's if requested (1=swab, 0=don't swab) // Swab if needed...Put swabbed results in different array so no need to "unswab" when done // Allocate memory to read array into float *inputArray; inputArray = (float *) calloc(nItemsToRead,sizeof(float)); if(inputArray == NULL) { printf("\n ERROR: Allocating memory for inputArray in readBinaryDataFromFile"); return(FAIL); } if(OK != readBinaryDataFromFile(iStream, nItemsToRead, inputArray, swab_flag)) { printf("\n ERROR: Reading binary data from file"); return(FAIL); } *arrayToRead = inputArray; return(OK); }