void ExodusII_IO::write_nodal_data (const std::string& fname, const std::vector<Number>& soln, const std::vector<std::string>& names) { START_LOG("write_nodal_data()", "ExodusII_IO"); const MeshBase & mesh = MeshOutput<MeshBase>::mesh(); int num_vars = libmesh_cast_int<int>(names.size()); dof_id_type num_nodes = mesh.n_nodes(); // The names of the variables to be output std::vector<std::string> output_names; if(_output_variables.size()) output_names = _output_variables; else output_names = names; // FIXME: Will we ever _not_ need to do this? // DRG: Yes... when writing multiple timesteps to the same file. if (!exio_helper->created()) { exio_helper->create(fname); exio_helper->initialize(fname,mesh); exio_helper->write_nodal_coordinates(mesh); exio_helper->write_elements(mesh); exio_helper->write_sidesets(mesh); exio_helper->write_nodesets(mesh); exio_helper->initialize_nodal_variables(output_names); } // This will count the number of variables actually output for (int c=0; c<num_vars; c++) { std::vector<std::string>::iterator pos = std::find(output_names.begin(), output_names.end(), names[c]); if (pos == output_names.end()) continue; unsigned int variable_name_position = libmesh_cast_int<unsigned int>(pos - output_names.begin()); std::vector<Number> cur_soln(num_nodes); //Copy out this variable's solution for(dof_id_type i=0; i<num_nodes; i++) cur_soln[i] = soln[i*num_vars + c];//c*num_nodes+i]; exio_helper->write_nodal_values(variable_name_position+1,cur_soln,_timestep); } STOP_LOG("write_nodal_data()", "ExodusII_IO"); }
void ExodusII_IO::write_nodal_data_discontinuous (const std::string& fname, const std::vector<Number>& soln, const std::vector<std::string>& names) { START_LOG("write_nodal_data_discontinuous()", "ExodusII_IO"); const MeshBase & mesh = MeshOutput<MeshBase>::mesh(); int num_vars = names.size(); int num_nodes = 0; MeshBase::const_element_iterator it = mesh.active_elements_begin(); const MeshBase::const_element_iterator end = mesh.active_elements_end(); for ( ; it != end; ++it) num_nodes += (*it)->n_nodes(); // FIXME: Will we ever _not_ need to do this? // DRG: Yes... when writing multiple timesteps to the same file. if (!exio_helper->created()) { exio_helper->create(fname); exio_helper->initialize_discontinuous(fname,mesh); exio_helper->write_nodal_coordinates_discontinuous(mesh); exio_helper->write_elements_discontinuous(mesh); exio_helper->write_sidesets(mesh); exio_helper->write_nodesets(mesh); exio_helper->initialize_nodal_variables(names); } if (libMesh::processor_id() == 0) for (int c=0; c<num_vars; c++) { //Copy out this variable's solution std::vector<Number> cur_soln(num_nodes); for(int i=0; i<num_nodes; i++) cur_soln[i] = soln[i*num_vars + c];//c*num_nodes+i]; exio_helper->write_nodal_values(c+1,cur_soln,_timestep); } STOP_LOG("write_nodal_data_discontinuous()", "ExodusII_IO"); }
void ExodusII_IO::write_nodal_data_discontinuous (const std::string & fname, const std::vector<Number> & soln, const std::vector<std::string> & names) { START_LOG("write_nodal_data_discontinuous()", "ExodusII_IO"); const MeshBase & mesh = MeshOutput<MeshBase>::mesh(); int num_vars = cast_int<int>(names.size()); int num_nodes = 0; MeshBase::const_element_iterator it = mesh.active_elements_begin(); const MeshBase::const_element_iterator end = mesh.active_elements_end(); for ( ; it != end; ++it) num_nodes += (*it)->n_nodes(); #ifdef LIBMESH_USE_COMPLEX_NUMBERS std::vector<std::string> complex_names = exio_helper->get_complex_names(names); // Call helper function for opening/initializing data, giving it the // complex variable names this->write_nodal_data_common(fname, complex_names, /*continuous=*/false); #else // Call helper function for opening/initializing data this->write_nodal_data_common(fname, names, /*continuous=*/false); #endif if (mesh.processor_id()) { STOP_LOG("write_nodal_data_discontinuous()", "ExodusII_IO"); return; } for (int c=0; c<num_vars; c++) { #ifdef LIBMESH_USE_COMPLEX_NUMBERS std::vector<Real> real_parts(num_nodes); std::vector<Real> imag_parts(num_nodes); std::vector<Real> magnitudes(num_nodes); for (int i=0; i<num_nodes; ++i) { real_parts[i] = soln[i*num_vars + c].real(); imag_parts[i] = soln[i*num_vars + c].imag(); magnitudes[i] = std::abs(soln[i*num_vars + c]); } exio_helper->write_nodal_values(3*c+1,real_parts,_timestep); exio_helper->write_nodal_values(3*c+2,imag_parts,_timestep); exio_helper->write_nodal_values(3*c+3,magnitudes,_timestep); #else // Copy out this variable's solution std::vector<Number> cur_soln(num_nodes); for (int i=0; i<num_nodes; i++) cur_soln[i] = soln[i*num_vars + c]; exio_helper->write_nodal_values(c+1,cur_soln,_timestep); #endif } STOP_LOG("write_nodal_data_discontinuous()", "ExodusII_IO"); }
void ExodusII_IO::write_nodal_data (const std::string & fname, const std::vector<Number> & soln, const std::vector<std::string> & names) { START_LOG("write_nodal_data()", "ExodusII_IO"); const MeshBase & mesh = MeshOutput<MeshBase>::mesh(); int num_vars = cast_int<int>(names.size()); dof_id_type num_nodes = mesh.n_nodes(); // The names of the variables to be output std::vector<std::string> output_names; if(_allow_empty_variables || !_output_variables.empty()) output_names = _output_variables; else output_names = names; #ifdef LIBMESH_USE_COMPLEX_NUMBERS std::vector<std::string> complex_names = exio_helper->get_complex_names(names); // Call helper function for opening/initializing data, giving it the // complex variable names this->write_nodal_data_common(fname, complex_names, /*continuous=*/true); #else // Call helper function for opening/initializing data this->write_nodal_data_common(fname, output_names, /*continuous=*/true); #endif if(mesh.processor_id()) { STOP_LOG("write_nodal_data()", "ExodusII_IO"); return; } // This will count the number of variables actually output for (int c=0; c<num_vars; c++) { std::stringstream name_to_find; std::vector<std::string>::iterator pos = std::find(output_names.begin(), output_names.end(), names[c]); if (pos == output_names.end()) continue; unsigned int variable_name_position = cast_int<unsigned int>(pos - output_names.begin()); #ifdef LIBMESH_USE_COMPLEX_NUMBERS std::vector<Real> real_parts(num_nodes); std::vector<Real> imag_parts(num_nodes); std::vector<Real> magnitudes(num_nodes); for (unsigned int i=0; i<num_nodes; ++i) { real_parts[i] = soln[i*num_vars + c].real(); imag_parts[i] = soln[i*num_vars + c].imag(); magnitudes[i] = std::abs(soln[i*num_vars + c]); } exio_helper->write_nodal_values(3*variable_name_position+1,real_parts,_timestep); exio_helper->write_nodal_values(3*variable_name_position+2,imag_parts,_timestep); exio_helper->write_nodal_values(3*variable_name_position+3,magnitudes,_timestep); #else std::vector<Number> cur_soln(num_nodes); // Copy out this variable's solution for (dof_id_type i=0; i<num_nodes; i++) cur_soln[i] = soln[i*num_vars + c]; exio_helper->write_nodal_values(variable_name_position+1,cur_soln,_timestep); #endif } STOP_LOG("write_nodal_data()", "ExodusII_IO"); }