void ExodusII_IO::write_element_data (const EquationSystems & es) { // The first step is to collect the element data onto this processor. // We want the constant monomial data. std::vector<Number> soln; std::vector<std::string> names; // If _output_variables is populated we need to filter the monomials we output if (_output_variables.size()) { std::vector<std::string> monomials; const FEType type(CONSTANT, MONOMIAL); es.build_variable_names(monomials, &type); for (std::vector<std::string>::iterator it = monomials.begin(); it != monomials.end(); ++it) if (std::find(_output_variables.begin(), _output_variables.end(), *it) != _output_variables.end()) names.push_back(*it); } // If we pass in a list of names to "get_solution" it'll filter the variables comming back es.get_solution( soln, names ); // The data must ultimately be written block by block. This means that this data // must be sorted appropriately. if (!exio_helper->created()) { libMesh::err << "ERROR, ExodusII file must be initialized " << "before outputting element variables.\n" << std::endl; libmesh_error(); } const MeshBase & mesh = MeshOutput<MeshBase>::mesh(); exio_helper->initialize_element_variables( mesh, names ); exio_helper->write_element_values(mesh,soln,_timestep); }
void ExodusII_IO::write_element_data (const EquationSystems & es) { // Be sure the file has been opened for writing! if (MeshOutput<MeshBase>::mesh().processor_id() == 0 && !exio_helper->opened_for_writing) libmesh_error_msg("ERROR, ExodusII file must be initialized before outputting element variables."); // This function currently only works on SerialMeshes. We rely on // having a reference to a non-const MeshBase object from our // MeshInput parent class to construct a MeshSerializer object, // similar to what is done in ExodusII_IO::write(). Note that // calling ExodusII_IO::write_timestep() followed by // ExodusII_IO::write_element_data() when the underlying Mesh is a // ParallelMesh will result in an unnecessary additional // serialization/re-parallelization step. MeshSerializer serialize(MeshInput<MeshBase>::mesh(), !MeshOutput<MeshBase>::_is_parallel_format); // To be (possibly) filled with a filtered list of variable names to output. std::vector<std::string> names; // If _output_variables is populated, only output the monomials which are // also in the _output_variables vector. if (_output_variables.size() > 0) { std::vector<std::string> monomials; const FEType type(CONSTANT, MONOMIAL); // Create a list of monomial variable names es.build_variable_names(monomials, &type); // Filter that list against the _output_variables list. Note: if names is still empty after // all this filtering, all the monomial variables will be gathered std::vector<std::string>::iterator it = monomials.begin(); for (; it!=monomials.end(); ++it) if (std::find(_output_variables.begin(), _output_variables.end(), *it) != _output_variables.end()) names.push_back(*it); } // If we pass in a list of names to "get_solution" it'll filter the variables coming back std::vector<Number> soln; es.get_solution(soln, names); if(soln.empty()) // If there is nothing to write just return return; // The data must ultimately be written block by block. This means that this data // must be sorted appropriately. if(MeshOutput<MeshBase>::mesh().processor_id()) return; const MeshBase & mesh = MeshOutput<MeshBase>::mesh(); #ifdef LIBMESH_USE_COMPLEX_NUMBERS std::vector<std::string> complex_names = exio_helper->get_complex_names(names); exio_helper->initialize_element_variables(complex_names); unsigned int num_values = soln.size(); unsigned int num_vars = names.size(); unsigned int num_elems = num_values / num_vars; // This will contain the real and imaginary parts and the magnitude // of the values in soln std::vector<Real> complex_soln(3*num_values); for (unsigned i=0; i<num_vars; ++i) { for (unsigned int j=0; j<num_elems; ++j) { Number value = soln[i*num_vars + j]; complex_soln[3*i*num_elems + j] = value.real(); } for (unsigned int j=0; j<num_elems; ++j) { Number value = soln[i*num_vars + j]; complex_soln[3*i*num_elems + num_elems +j] = value.imag(); } for (unsigned int j=0; j<num_elems; ++j) { Number value = soln[i*num_vars + j]; complex_soln[3*i*num_elems + 2*num_elems + j] = std::abs(value); } } exio_helper->write_element_values(mesh, complex_soln, _timestep); #else exio_helper->initialize_element_variables(names); exio_helper->write_element_values(mesh, soln, _timestep); #endif }