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