$extrastylesheet
medit_io.C
Go to the documentation of this file.
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