$extrastylesheet
00001 // The libMesh Finite Element Library. 00002 // Copyright (C) 2002-2014 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner 00003 00004 // This library is free software; you can redistribute it and/or 00005 // modify it under the terms of the GNU Lesser General Public 00006 // License as published by the Free Software Foundation; either 00007 // version 2.1 of the License, or (at your option) any later version. 00008 00009 // This library is distributed in the hope that it will be useful, 00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 // Lesser General Public License for more details. 00013 00014 // You should have received a copy of the GNU Lesser General Public 00015 // License along with this library; if not, write to the Free Software 00016 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00017 00018 00019 00020 // C++ includes 00021 #include <iomanip> 00022 #include <fstream> 00023 00024 // Local includes 00025 #include "libmesh/libmesh_config.h" 00026 #include "libmesh/libmesh_logging.h" 00027 #include "libmesh/mesh_base.h" 00028 #include "libmesh/medit_io.h" 00029 #include "libmesh/elem.h" 00030 00031 namespace libMesh 00032 { 00033 00034 00035 // ------------------------------------------------------------ 00036 // MEDITIO members 00037 void MEDITIO::write (const std::string& fname) 00038 { 00039 if (this->mesh().processor_id() == 0) 00040 if (!this->binary()) 00041 this->write_ascii (fname); 00042 } 00043 00044 00045 00046 void MEDITIO::write_nodal_data (const std::string& fname, 00047 const std::vector<Number>& soln, 00048 const std::vector<std::string>& names) 00049 { 00050 START_LOG("write_nodal_data()", "MEDITIO"); 00051 00052 if (this->mesh().processor_id() == 0) 00053 if (!this->binary()) 00054 this->write_ascii (fname, &soln, &names); 00055 00056 STOP_LOG("write_nodal_data()", "MEDITIO"); 00057 } 00058 00059 00060 00061 void MEDITIO::write_ascii (const std::string& fname, 00062 const std::vector<Number>* vec, 00063 const std::vector<std::string>* solution_names) 00064 { 00065 // Current lacks in implementation: 00066 // (i) only 3D meshes. 00067 // (ii) only QUAD4, TRI3, TET4 elements, others are omitted ! 00068 // (iii) no distinction between materials. 00069 // (iv) no vector output, just first scalar as output 00070 00071 // libmesh_assert three dimensions (should be extended later) 00072 libmesh_assert_equal_to (MeshOutput<MeshBase>::mesh().mesh_dimension(), 3); 00073 00074 // Open the output file stream 00075 std::ofstream out_stream (fname.c_str()); 00076 00077 // Make sure it opened correctly 00078 if (!out_stream.good()) 00079 libmesh_file_error(fname.c_str()); 00080 00081 // Get a reference to the mesh 00082 const MeshBase& the_mesh = MeshOutput<MeshBase>::mesh(); 00083 00084 // Begin interfacing with the MEdit data file 00085 { 00086 // header: 00087 out_stream << "MeshVersionFormatted 1\n"; 00088 out_stream << "Dimension 3\n"; 00089 out_stream << "# Mesh generated by libmesh\n\n"; 00090 00091 // write the nodes: 00092 out_stream << "# Set of mesh vertices\n"; 00093 out_stream << "Vertices\n"; 00094 out_stream << the_mesh.n_nodes() << "\n"; 00095 00096 for (unsigned int v=0; v<the_mesh.n_nodes(); v++) 00097 out_stream << the_mesh.point(v)(0) << " " << the_mesh.point(v)(1) << " " << the_mesh.point(v)(2) << " 0\n"; 00098 } 00099 00100 { 00101 // write the connectivity: 00102 out_stream << "\n# Set of Polys\n\n"; 00103 00104 // count occurrences of output elements: 00105 int n_tri3 = 0; 00106 int n_quad4 = 0; 00107 int n_tet4 = 0; 00108 00109 { 00110 MeshBase::const_element_iterator it = the_mesh.active_elements_begin(); 00111 const MeshBase::const_element_iterator end = the_mesh.active_elements_end(); 00112 00113 for ( ; it != end; ++it) 00114 { 00115 if ((*it)->type() == TRI3) n_tri3++; 00116 if ((*it)->type() == QUAD4) n_quad4++; 00117 if ((*it)->type() == QUAD9) n_quad4+=4; // (QUAD9 is written as 4 QUAD4.) 00118 if ((*it)->type() == TET4) n_tet4++; 00119 } // for 00120 } 00121 00122 // First: write out TRI3 elements: 00123 out_stream << "Triangles\n"; 00124 out_stream << n_tri3 << "\n"; 00125 00126 { 00127 MeshBase::const_element_iterator it = the_mesh.active_elements_begin(); 00128 const MeshBase::const_element_iterator end = the_mesh.active_elements_end(); 00129 00130 for ( ; it != end; ++it) 00131 if ((*it)->type() == TRI3) 00132 out_stream << (*it)->node(0)+1 << " " << (*it)->node(1)+1 << " " << (*it)->node(2)+1 << " 0\n"; 00133 } 00134 00135 // Second: write out QUAD4 elements: 00136 out_stream << "Quadrilaterals\n"; 00137 out_stream << n_quad4 << "\n"; 00138 00139 { 00140 MeshBase::const_element_iterator it = the_mesh.active_elements_begin(); 00141 const MeshBase::const_element_iterator end = the_mesh.active_elements_end(); 00142 00143 for ( ; it != end; ++it) 00144 if ((*it)->type() == QUAD4) 00145 { 00146 out_stream << (*it)->node(0)+1 << " " 00147 << (*it)->node(1)+1 << " " 00148 << (*it)->node(2)+1 << " " 00149 << (*it)->node(3)+1 <<" 0\n"; 00150 } // if 00151 else if ((*it)->type() == QUAD9) 00152 { 00153 out_stream << (*it)->node(0)+1 << " " 00154 << (*it)->node(4)+1 << " " 00155 << (*it)->node(8)+1 << " " 00156 << (*it)->node(7)+1 <<" 0\n"; 00157 out_stream << (*it)->node(7)+1 << " " 00158 << (*it)->node(8)+1 << " " 00159 << (*it)->node(6)+1 << " " 00160 << (*it)->node(3)+1 <<" 0\n"; 00161 out_stream << (*it)->node(4)+1 << " " 00162 << (*it)->node(1)+1 << " " 00163 << (*it)->node(5)+1 << " " 00164 << (*it)->node(8)+1 <<" 0\n"; 00165 out_stream << (*it)->node(8)+1 << " " 00166 << (*it)->node(5)+1 << " " 00167 << (*it)->node(2)+1 << " " 00168 << (*it)->node(6)+1 <<" 0\n"; 00169 } // if 00170 } 00171 00172 00173 // Third: write out TET4 elements: 00174 out_stream << "Tetrahedra\n"; 00175 out_stream << n_tet4 << "\n"; 00176 00177 { 00178 MeshBase::const_element_iterator it = the_mesh.active_elements_begin(); 00179 const MeshBase::const_element_iterator end = the_mesh.active_elements_end(); 00180 00181 for ( ; it != end; ++it) 00182 if ((*it)->type() == TET4) 00183 { 00184 out_stream << (*it)->node(0)+1 << " " 00185 << (*it)->node(1)+1 << " " 00186 << (*it)->node(2)+1 << " " 00187 << (*it)->node(3)+1 <<" 0\n"; 00188 } // if 00189 } 00190 00191 } 00192 // end of the out file 00193 out_stream << '\n' << "# end of file\n"; 00194 00195 // optionally write the data 00196 if ((solution_names != NULL) && 00197 (vec != NULL)) 00198 { 00199 // Open the ".bb" file stream 00200 std::size_t idx = fname.find_last_of("."); 00201 std::string bbname = fname.substr(0,idx) + ".bb"; 00202 00203 std::ofstream bbout (bbname.c_str()); 00204 00205 // Make sure it opened correctly 00206 if (!bbout.good()) 00207 libmesh_file_error(bbname.c_str()); 00208 00209 // Header: 3: 3D mesh, 1: scalar output, 2: node-indexed 00210 const std::size_t n_vars = solution_names->size(); 00211 bbout << "3 1 " << the_mesh.n_nodes() << " 2\n"; 00212 for (dof_id_type n=0; n<the_mesh.n_nodes(); n++) 00213 bbout << std::setprecision(10) << (*vec)[n*n_vars + scalar_idx] << " "; 00214 bbout << "\n"; 00215 } // endif 00216 } 00217 00218 } // namespace libMesh