00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "SundanceTriangleWriter.hpp"
00032 #include "PlayaExceptions.hpp"
00033 #include "SundanceOut.hpp"
00034 #include "PlayaTabs.hpp"
00035
00036
00037 using namespace Sundance;
00038 using namespace Sundance;
00039 using namespace Sundance;
00040 using namespace Teuchos;
00041
00042
00043 void TriangleWriter::write() const
00044 {
00045 std::string f = filename();
00046 if (nProc() > 1) f = f + Teuchos::toString(myRank());
00047
00048
00049 if (nProc() > 1 && myRank()==0) writeHeader(filename());
00050
00051
00052 writePoints(f);
00053 writeCells(f);
00054 writeEdges(f);
00055 if (mesh().spatialDim() > 2)
00056 {
00057 writeFaces(f);
00058 }
00059 if (nProc() > 1) writeParallelInfo(f);
00060 }
00061
00062 void TriangleWriter::writeHeader(const std::string& filename) const
00063 {
00064 std::string hdrfile = filename + ".hdr";
00065 std::ofstream os(hdrfile.c_str());
00066
00067 os << nProc() << std::endl;
00068 for (int p=0; p<nProc(); p++)
00069 {
00070 os << filename + Teuchos::toString(p) << std::endl;
00071 }
00072
00073 os << pointScalarNames().length() << std::endl;
00074 for (int i=0; i<pointScalarNames().length(); i++)
00075 {
00076 os << i << " " << pointScalarNames()[i] << std::endl;
00077 }
00078 os << cellScalarNames().length() << std::endl;
00079 for (int i=0; i<cellScalarNames().length(); i++)
00080 {
00081 os << i << " " << cellScalarNames()[i] << std::endl;
00082 }
00083
00084 for (int i=0; i<comments().length(); i++)
00085 {
00086 os << "# " << comments()[i] << std::endl;
00087 }
00088 }
00089
00090
00091 void TriangleWriter::writePoints(const std::string& filename) const
00092 {
00093 int nPts = mesh().numCells(0);
00094 int dim = mesh().spatialDim();
00095 int nAttr = pointScalarFields().length();
00096 int nBdryMarkers = 0;
00097
00098 std::string nodefile = filename + ".node";
00099 std::ofstream os(nodefile.c_str());
00100
00101 os << nPts << " " << dim << " " << nAttr << " " << nBdryMarkers << std::endl;
00102
00103 for (int i=0; i<nPts; i++)
00104 {
00105 os << i+indexOffset_;
00106 const Point& x = mesh().nodePosition(i);
00107 for (int d=0; d<dim; d++)
00108 {
00109 os << " " << x[d];
00110 }
00111
00112
00113
00114
00115
00116
00117
00118 for (int b=0; b<nBdryMarkers; b++)
00119 {
00120
00121 assert(0);
00122 }
00123 os << std::endl;
00124 }
00125
00126 for (int i=0; i<comments().length(); i++)
00127 {
00128 os << "# " << comments()[i] << std::endl;
00129 }
00130 }
00131
00132 void TriangleWriter::writeFaces(const std::string& filename) const
00133 {
00134 std::string facefile = filename + ".face";
00135 std::ofstream os(facefile.c_str());
00136
00137 int dim = 2;
00138 int nFaces = mesh().numCells(dim);
00139 int dummySign;
00140
00141 os << nFaces << " 0" << std::endl;
00142
00143 for (int c=0; c<nFaces; c++)
00144 {
00145 os << c + indexOffset_;
00146 int nNodes = 3;
00147
00148 for (int i=0; i<nNodes; i++)
00149 {
00150 os << " " << mesh().facetLID(2,c,0,i,dummySign) + indexOffset_;
00151 }
00152 os << std::endl;
00153 }
00154
00155 for (int i=0; i<comments().length(); i++)
00156 {
00157 os << "# " << comments()[i] << std::endl;
00158 }
00159 }
00160
00161 void TriangleWriter::writeEdges(const std::string& filename) const
00162 {
00163 std::string edgefile = filename + ".edge";
00164 std::ofstream os(edgefile.c_str());
00165
00166 int dim = 1;
00167 int nEdges = mesh().numCells(dim);
00168 int nNodes = 2;
00169 int dummySign;
00170
00171 os << nEdges << " 0" << std::endl;
00172
00173 for (int c=0; c<nEdges; c++)
00174 {
00175 os << c + indexOffset_;
00176 for (int i=0; i<nNodes; i++)
00177 {
00178 os << " " << mesh().facetLID(1,c,0,i,dummySign) + indexOffset_;
00179 }
00180 os << std::endl;
00181 }
00182
00183 for (int i=0; i<comments().length(); i++)
00184 {
00185 os << "# " << comments()[i] << std::endl;
00186 }
00187 }
00188
00189 void TriangleWriter::writeCells(const std::string& filename) const
00190 {
00191 std::string elefile = filename + ".ele";
00192 std::ofstream os(elefile.c_str());
00193
00194 int dim = mesh().spatialDim();
00195 int nCells = mesh().numCells(dim);
00196 int nAttr = cellScalarFields().length();
00197 int dummySign;
00198
00199 os << nCells << " " << dim+1 << " " << nAttr << std::endl;
00200
00201 for (int c=0; c<nCells; c++)
00202 {
00203 os << c + indexOffset_;
00204 int nNodes = dim+1;
00205
00206 for (int i=0; i<nNodes; i++)
00207 {
00208 os << " " << mesh().facetLID(dim,c,0,i,dummySign) + indexOffset_;
00209 }
00210
00211
00212
00213
00214
00215
00216 os << std::endl;
00217 }
00218
00219 for (int i=0; i<comments().length(); i++)
00220 {
00221 os << "# " << comments()[i] << std::endl;
00222 }
00223 }
00224
00225
00226 void TriangleWriter::writeParallelInfo(const std::string& filename) const
00227 {
00228 std::string parfile = filename + ".par";
00229 std::ofstream os(parfile.c_str());
00230
00231 int dim = mesh().spatialDim();
00232 int nCells = mesh().numCells(dim);
00233 int nEdges = mesh().numCells(1);
00234 int nPts = mesh().numCells(0);
00235
00236 os << myRank() << " " << nProc() << std::endl;
00237
00238 os << nPts << std::endl;
00239 for (int i=0; i<nPts; i++)
00240 {
00241 os << i << " " << mesh().mapLIDToGID(0,i)
00242 << " " << mesh().ownerProcID(0,i) << std::endl;
00243 }
00244
00245 os << nCells << std::endl;
00246 for (int c=0; c<nCells; c++)
00247 {
00248 os << c << " " << mesh().mapLIDToGID(dim,c)
00249 << " " << mesh().ownerProcID(dim,c) << std::endl;
00250 }
00251
00252 os << nEdges << std::endl;
00253 for (int c=0; c<nEdges; c++)
00254 {
00255 os << c << " " << mesh().mapLIDToGID(1,c)
00256 << " " << mesh().ownerProcID(1,c) << std::endl;
00257 }
00258
00259 if (dim > 2)
00260 {
00261 int nFaces = mesh().numCells(2);
00262 os << nFaces << std::endl;
00263 for (int c=0; c<nFaces; c++)
00264 {
00265 os << c << " " << mesh().mapLIDToGID(2,c)
00266 << " " << mesh().ownerProcID(2,c) << std::endl;
00267 }
00268 }
00269
00270 for (int i=0; i<comments().length(); i++)
00271 {
00272 os << "# " << comments()[i] << std::endl;
00273 }
00274 }
00275
00276