SundanceTriangleMeshReader.hpp
Go to the documentation of this file.
00001 /* @HEADER@ */
00002 // ************************************************************************
00003 // 
00004 //                              Sundance
00005 //                 Copyright (2005) Sandia Corporation
00006 // 
00007 // Copyright (year first published) Sandia Corporation.  Under the terms 
00008 // of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government 
00009 // retains certain rights in this software.
00010 // 
00011 // This library is free software; you can redistribute it and/or modify
00012 // it under the terms of the GNU Lesser General Public License as
00013 // published by the Free Software Foundation; either version 2.1 of the
00014 // License, or (at your option) any later version.
00015 //  
00016 // This library is distributed in the hope that it will be useful, but
00017 // WITHOUT ANY WARRANTY; without even the implied warranty of
00018 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00019 // Lesser General Public License for more details.
00020 //                                                                                 
00021 // You should have received a copy of the GNU Lesser General Public
00022 // License along with this library; if not, write to the Free Software
00023 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
00024 // USA                                                                                
00025 // Questions? Contact Kevin Long (krlong@sandia.gov), 
00026 // Sandia National Laboratories, Livermore, California, USA
00027 // 
00028 // ************************************************************************
00029 /* @HEADER@ */
00030 
00031 #ifndef SUNDANCE_TRIANGLEMESHREADER_H
00032 #define SUNDANCE_TRIANGLEMESHREADER_H
00033 
00034 #include "SundanceDefs.hpp"
00035 #include "SundanceMeshReaderBase.hpp"
00036 
00037 namespace Sundance
00038 {
00039   using namespace Teuchos;
00040   
00041   /**
00042    * TriangleMeshReader reads a mesh stored in Shewchuk's Triangle format.
00043    * This format is documented at 
00044    * <A HREF="http://www-2.cs.cmu.edu/~quake/triangle.html"> 
00045    * the Triangle homepage. 
00046    * </A>
00047    * This reader expects to find node information in <tt>.node</tt> files
00048    * and element information in <tt>.ele</tt> files. The <tt> filename </tt>
00049    * constructor argument is the stem of the filenames, and so that 
00050    * a reader constructed with filename <tt>joe</tt> will look for node and
00051    * element data in <tt>joe.node</tt> and <tt>joe.ele</tt> respectively.
00052    * Node and element
00053    * attributes are read if present, and can be accessed with the 
00054    * <tt>getAttributes()</tt> method of <tt>MeshSource.</tt>
00055    * 
00056    * <h4> Parallel extensions </h4>
00057    * We have extended the Triangle format to deal with distributed meshes.
00058    * A TriangleMeshReader is constructed with an MPIComm object, and if
00059    * that communicator has more than one processor the mesh is assumed
00060    * to be split into files, one for each processor. Data
00061    * on mesh "joe" for the <i>nnn</i>-th processor will be found in the files
00062    * <ul>
00063    * <li> <tt>joe.node.</tt><i>nnn</i>
00064    * <li> <tt>joe.ele.</tt><i>nnn</i>
00065    * <li> <tt>joe.par.</tt><i>nnn</i>
00066    * </ul>
00067    * The <tt>.node.</tt><i>nnn</i> and <tt>.ele.</tt><i>nnn</i> files contain the
00068    * node and element data for the part of the mesh seen 
00069    * by the <i>nnn</i>-th
00070    * processor. The node and element 
00071    * numberings given in those two files are <b>local</b> indexes.
00072    * The <tt>.par.</tt><i>nnn</i> contains node and element 
00073    * ownership information for the part of the mesh seen 
00074    * by the <i>nnn</i>-th
00075    * processor. 
00076    *
00077    * <br> 
00078    *
00079    * A <tt>.par</tt> file is formatted as follows:
00080    * <ul>
00081    * <li> First line: <tt> rank numProcs </tt>
00082    * <li> Second line: <tt> numPoints </tt>
00083    * <li> Next <i> nPoints </i> lines: <tt> ptLID ptGID ptOwnerRank </tt>
00084    * <li> Next line: <tt> numElems </tt>
00085    * <li> Next <i> nElems </i> lines: <tt> elemLID elemGID elemOwnerRank </tt>
00086    * </ul>
00087    * 
00088    */
00089   class TriangleMeshReader : public MeshReaderBase
00090   {
00091   public:
00092     /** */
00093     TriangleMeshReader(const std::string& filename, 
00094       const MeshType& meshType,
00095       int verbosity=0,
00096       const MPIComm& comm = MPIComm::world());
00097 
00098     /** Construct from a ParameterList */
00099     TriangleMeshReader(const ParameterList& params);
00100 
00101     /** virtual dtor */
00102     virtual ~TriangleMeshReader(){;}
00103 
00104 
00105     /** Create a mesh */
00106     virtual Mesh fillMesh() const ;
00107 
00108     /** Print a short descriptive std::string */
00109     virtual std::string description() const 
00110     {return "TriangleMeshReader[file=" + filename() + "]";}
00111       
00112 
00113     /** Return a ref count pointer to self */
00114     virtual RCP<MeshSourceBase> getRcp() {return rcp(this);}
00115 
00116   private:
00117     /** */
00118     void readParallelInfo(Array<int>& ptGID, Array<int>& ptOwner,
00119                           Array<int>& elemGID, Array<int>& elemOwner) const ;
00120 
00121     /** */
00122     Mesh readNodes(Array<int>& ptGID,
00123                    Array<int>& ptOwner) const ;
00124 
00125     void readSides(Mesh& mesh) const ;
00126 
00127     /** */
00128     void readElems(Mesh& mesh,
00129                    const Array<int>& nodeGID,
00130                    Array<int>& elemGID,
00131                    Array<int>& elemOwner) const ;
00132     
00133 
00134     /** */
00135     std::string nodeFilename_;
00136 
00137     /** */
00138     std::string elemFilename_;
00139 
00140     /** */
00141     std::string parFilename_;
00142 
00143     /** */
00144     std::string sideFilename_;
00145 
00146     /** */
00147     mutable int offset_;
00148   };
00149 }
00150 
00151 #endif

Site Contact