SundanceBamgMeshReader.cpp
Go to the documentation of this file.
00001 #include "SundanceBamgMeshReader.hpp"
00002 #include "SundanceOut.hpp"
00003 #include "SundanceExceptions.hpp"
00004 #include "Teuchos_StrUtils.hpp"
00005 
00006 using namespace Teuchos;
00007 using namespace Sundance;
00008 
00009 
00010 BamgMeshReader::BamgMeshReader(const std::string& fname,
00011                                const MeshType& meshType, bool bbAttr,
00012                                const MPIComm& comm)
00013   : MeshReaderBase(fname, meshType, comm),
00014     nodeFilename_(filename()),
00015     elemFilename_(filename()),
00016     parFilename_(filename()),
00017     meshFilename_(filename()), //new
00018     bbFilename_(filename()), //new
00019     bbAttr_(bbAttr) //new
00020   
00021 {
00022   
00023   //keep, but assume nProc() = 1
00024   if (nProc() > 1)
00025     {
00026       nodeFilename_ = nodeFilename_ + Teuchos::toString(myRank());
00027       parFilename_ = parFilename_ + Teuchos::toString(myRank());
00028       elemFilename_ = elemFilename_ + Teuchos::toString(myRank());
00029     }
00030   //
00031 
00032   nodeFilename_ = nodeFilename_ + ".node";
00033   elemFilename_ = elemFilename_ + ".ele";
00034   parFilename_ = parFilename_ + ".par";
00035   meshFilename_ = meshFilename_ + ".mesh"; //new
00036   bbFilename_ = bbFilename_ + ".bb"; //new
00037   
00038   setVerbosity( classVerbosity() );
00039   SUNDANCE_OUT(this->verb() > 1,
00040                "node filename = " << nodeFilename_);
00041   
00042   SUNDANCE_OUT(this->verb() > 1,
00043                "elem filename = " << elemFilename_);
00044 
00045   SUNDANCE_OUT(this->verb() > 1,
00046                "mesh filename = " << meshFilename_); //new
00047 
00048   SUNDANCE_OUT(this->verb() > 1,
00049                "bb filename = " << bbFilename_); //new
00050   
00051 }
00052 BamgMeshReader::BamgMeshReader(const ParameterList& params)
00053   : MeshReaderBase(params),
00054     nodeFilename_(filename()),
00055     elemFilename_(filename()),
00056     parFilename_(filename()),
00057     meshFilename_(filename()) //new
00058 {
00059   
00060   //keep, but assume nProc() = 1
00061   if (nProc() > 1)
00062     {
00063       nodeFilename_ = nodeFilename_ + Teuchos::toString(myRank());
00064       parFilename_ = parFilename_ + Teuchos::toString(myRank());
00065       elemFilename_ = elemFilename_ + Teuchos::toString(myRank());
00066     }
00067   //
00068 
00069   nodeFilename_ = nodeFilename_ + ".node";
00070   elemFilename_ = elemFilename_ + ".ele";
00071   parFilename_ = parFilename_ + ".par";
00072   meshFilename_ = meshFilename_ + ".mesh"; //new
00073   
00074   setVerbosity( classVerbosity() );
00075   SUNDANCE_OUT(this->verb() > 1,
00076                "node filename = " << nodeFilename_);
00077   
00078   SUNDANCE_OUT(this->verb() > 1,
00079                "elem filename = " << elemFilename_);
00080 
00081   SUNDANCE_OUT(this->verb() > 1,
00082                "mesh filename = " << meshFilename_); //new
00083 
00084   SUNDANCE_OUT(this->verb() > 1,
00085                "bb filename = " << bbFilename_); //new
00086   
00087 }
00088 
00089 
00090 Mesh BamgMeshReader::fillMesh() const 
00091 {
00092   Mesh mesh;
00093 
00094   Array<int> ptGID;
00095   Array<int> ptOwner;
00096   Array<int> cellGID;
00097   Array<int> cellOwner;
00098 
00099   readParallelInfo(ptGID, ptOwner, cellGID, cellOwner);
00100 
00101   //mesh = readNodes(ptGID, ptOwner); //replaced by readMesh
00102 
00103   //readElems(mesh, ptGID, cellGID, cellOwner); //readMesh reads nodes+elems
00104 
00105   mesh = readMesh(ptGID, ptOwner); //new -- replaces readNodes, readElems
00106 
00107   //  mesh.assignGlobalIndices();
00108 
00109   return mesh;
00110 }
00111 
00112 void BamgMeshReader::readParallelInfo(Array<int>& ptGID, 
00113                                       Array<int>& ptOwner,
00114                                       Array<int>& cellGID, 
00115                                       Array<int>& cellOwner) const
00116 {
00117   int nPoints;
00118   int nElems;
00119   std::string line;
00120   Array<string> tokens;
00121   try
00122     {
00123       ptGID.resize(0);
00124       ptOwner.resize(0);
00125       cellGID.resize(0);
00126       cellOwner.resize(0);
00127 
00128       //keep, but assume nProc() = 1
00129       /* if we're running in parallel, read the info on processor 
00130        * distribution */
00131       if (nProc() > 1)
00132         {
00133           RCP<std::ifstream> parStream 
00134             = openFile(parFilename_, "parallel info");
00135      
00136           /* read the number of processors and the processor rank in 
00137            * the file. These must be consistent with the current number of
00138            * processors and the current rank */
00139           getNextLine(*parStream, line, tokens, '#');
00140       
00141           TEST_FOR_EXCEPTION(tokens.length() != 2, RuntimeError,
00142                              "TriangleMeshReader::getMesh() expects 2 entries "
00143                              "on the first line of .par file. In " 
00144                              << parFilename_ << " I found \n[" << line << "]\n");
00145 
00146           int np = atoi(tokens[1]);
00147           int pid = atoi(tokens[0]);
00148 
00149           /* check consistency with the current number of
00150            * processors and the current rank */
00151       
00152           TEST_FOR_EXCEPTION(np != nProc(), RuntimeError,
00153                              "TriangleMeshReader::getMesh() found "
00154                              "a mismatch between the current number of processors="
00155                              << nProc() << 
00156                              "and the number of processors=" << np
00157                              << "in the file " << parFilename_);
00158 
00159           TEST_FOR_EXCEPTION(pid != myRank(), RuntimeError,
00160                              "TriangleMeshReader::getMesh() found "
00161                              "a mismatch between the current processor rank="
00162                              << myRank() << "and the processor rank="
00163                              << pid << " in the file " << parFilename_);
00164 
00165           /* read the number of points */
00166           getNextLine(*parStream, line, tokens, '#');
00167 
00168           TEST_FOR_EXCEPTION(tokens.length() != 1, RuntimeError,
00169                              "TriangleMeshReader::getMesh() requires 1 entry "
00170                              "on the second line of .par file. Found line \n[" 
00171                              << line << "]\n in file " << parFilename_);
00172       
00173           nPoints = StrUtils::atoi(tokens[0]);
00174 
00175           /* read the global ID and the owner PID for each point */
00176           ptGID.resize(nPoints);
00177           ptOwner.resize(nPoints);
00178 
00179           for (int i=0; i<nPoints; i++)
00180             {
00181               getNextLine(*parStream, line, tokens, '#');
00182 
00183               TEST_FOR_EXCEPTION(tokens.length() != 3, RuntimeError,
00184                                  "TriangleMeshReader::getMesh() requires 3 "
00185                                  "entries on each line of the point section in "
00186                                  "the .par file. Found line \n[" << line
00187                                  << "]\n in file " << parFilename_);
00188 
00189               ptGID[i] = StrUtils::atoi(tokens[1]);
00190               ptOwner[i] = StrUtils::atoi(tokens[2]);
00191             }
00192 
00193 
00194           /* Read the number of elements */
00195 
00196           getNextLine(*parStream, line, tokens, '#');
00197 
00198           TEST_FOR_EXCEPTION(tokens.length() != 1, RuntimeError,
00199                              "TriangleMeshReader::getMesh() requires 1 entry "
00200                              "on the cell count line of .par file. Found line \n[" 
00201                              << line << "]\n in file " << parFilename_);
00202 
00203           nElems = StrUtils::atoi(tokens[0]);
00204 
00205           SUNDANCE_OUT(this->verb() > 1,
00206                        "read nElems = " << nElems);
00207 
00208 
00209           /* read the global ID and the owner PID for each element */
00210 
00211           cellGID.resize(nElems);
00212           cellOwner.resize(nElems);
00213           for (int i=0; i<nElems; i++)
00214             {
00215               getNextLine(*parStream, line, tokens, '#');
00216 
00217               TEST_FOR_EXCEPTION(tokens.length() != 3, RuntimeError,
00218                                  "TriangleMeshReader::getMesh() requires 3 "
00219                                  "entries on each line of the element section in "
00220                                  "the .par file. Found line \n[" << line
00221                                  << "]\n in file " << parFilename_);
00222 
00223               cellGID[i] = StrUtils::atoi(tokens[1]);
00224               cellOwner[i] = StrUtils::atoi(tokens[2]);
00225             }
00226         }
00227 
00228 
00229       nPoints = ptGID.length();
00230       nElems = cellGID.length();
00231     }
00232   catch(std::exception& e)
00233     {
00234       SUNDANCE_TRACE(e);
00235     }
00236 }
00237 
00238 
00239 //Mesh TriangleMeshReader::readNodes(Array<int>& ptGID, 
00240 //                                   Array<int>& ptOwner) const 
00241 Mesh BamgMeshReader::readMesh(Array<int>& ptGID, 
00242                               Array<int>& ptOwner) const 
00243 {
00244   Mesh mesh;
00245   std::string line;
00246   Array<string> tokens;
00247   int nPoints=0;
00248 
00249   /* Open the mesh file so we can read in the nodes and elements */
00250   
00251   ///////////////////////////////////////////////////////////////////
00252     // skip this part and plug in the corresponding Bamg reader code //
00253     ///////////////////////////////////////////////////////////////////
00254 
00255     /*
00256 
00257     RCP<std::ifstream> nodeStream = openFile(nodeFilename_, "node info");
00258     // read the header line //
00259     getNextLine(*nodeStream, line, tokens, '#');
00260     TEST_FOR_EXCEPTION(tokens.length() != 4, RuntimeError,
00261     "TriangleMeshReader::getMesh() requires 4 "
00262     "entries on the header line in "
00263     "the .node file. Found line \n[" << line
00264     << "]\n in file " << nodeFilename_);
00265     std::string headerLine = line;
00266     SUNDANCE_OUT(this->verb() > 2,
00267     "read point header " << line);
00268   
00269   
00270     if (nProc()==1)
00271     {
00272     nPoints = atoi(tokens[0]);
00273     ptGID.resize(nPoints);
00274     ptOwner.resize(nPoints);
00275     for (int i=0; i<nPoints; i++)
00276     {
00277     ptGID[i] = i;
00278     ptOwner[i] = 0;
00279     }
00280     }
00281     else
00282     {
00283     // If we're running in parallel, we'd better have consistent numbers
00284     // of points in the .node and .par file. //
00285     TEST_FOR_EXCEPTION(atoi(tokens[0]) != nPoints, RuntimeError,
00286     "TriangleMeshReader::getMesh() found inconsistent "
00287     "numbers of points in .node file and par file. Node "
00288     "file " << nodeFilename_ << " had nPoints=" 
00289     << atoi(tokens[0]) << " but .par file " 
00290     << parFilename_ << " had nPoints=" << nPoints);
00291     }
00292 
00293     SUNDANCE_OUT(this->verb() > 3,
00294     "expecting to read " << nPoints << " points");
00295   
00296     int dimension = atoi(tokens[1]);
00297     int nAttributes = atoi(tokens[2]);
00298     int nBdryMarkers = atoi(tokens[3]);
00299 
00300     // now that we know the dimension, we can build the mesh object //
00301     mesh = createMesh(dimension);
00302 
00303     // size point-related arrays //
00304     Array<int> ptIndices(nPoints);
00305     Array<bool> usedPoint(nPoints);
00306     nodeAttributes()->resize(nPoints);
00307 
00308     int offset=0;
00309     bool first = true;
00310 
00311     // read all the points //
00312     for (int count=0; count<nPoints; count++)
00313     {
00314     getNextLine(*nodeStream, line, tokens, '#');
00315       
00316     TEST_FOR_EXCEPTION(tokens.length() 
00317     != (1 + dimension + nAttributes + nBdryMarkers),
00318     RuntimeError,
00319     "TriangleMeshReader::getMesh() found bad node input "
00320     "line. Expected " 
00321     << (1 + dimension + nAttributes + nBdryMarkers)
00322     << " entries but found line \n[" << 
00323     line << "]\n in file " << nodeFilename_);
00324     // Triangle files can use either 0-offset or 1-offset numbering. We'll
00325     // inspect the first node line to decide which numbering to use. //
00326     if (first)
00327     {
00328     offset = atoi(tokens[0]);
00329     TEST_FOR_EXCEPTION(offset < 0 || offset > 1, RuntimeError,
00330     "TriangleMeshReader::getMesh() expected "
00331     "either 0-offset or 1-offset numbering. Found an "
00332     "initial offset of " << offset << " in line \n["
00333     << line << "]\n of file " << nodeFilename_);
00334     first = false;
00335     }
00336     } //added this '}' because the for loop continued in TriangleMeshReader
00337   
00338     */
00339 
00340     /////////// here's the Bamg reader for reading nodes /////////////
00341     std::cerr << "starting to read meshFile" << std::endl;
00342 
00343     RCP<std::ifstream> meshStream = openFile(meshFilename_, 
00344                                                 "node & elem info");
00345     //Array<string> liners = StrUtils::readFile(meshStream, '#');
00346     Array<string> liners = StrUtils::readFile(*meshStream, '#');
00347     
00348     std::cerr << "defined liners" << std::endl;
00349     //nodeStream.close(); //old
00350 
00351     SUNDANCE_OUT(this->verb() > 3, 
00352                  "reading nodes from " + meshFilename_);
00353 
00354     // extract dimension, nodes, elements (triangles) from lines
00355     int dimension=0;
00356     int dimensionIndex = 0;
00357     int lineIndex = 0;
00358     int verticesIndex = 0;
00359     int edgesIndex = 0;
00360     int triangleIndex = 0;
00361     int nCells=0;
00362     std::cerr << "DimensionIndex = " << dimensionIndex << std::endl;
00363 
00364     //int linerssize = liners.size();
00365     int linerssize = liners.length();
00366     std::cerr << "number of lines in liners = " << linerssize << std::endl;
00367 
00368     for (int i = lineIndex; i < linerssize; i++)
00369       {
00370         tokens = StrUtils::stringTokenizer(liners[i]);
00371         std::cerr << "test: i = " << i << "tokens[0] = " << tokens[0] << std::endl;
00372         if (i < 20)
00373           {
00374             std::cerr << "i = " << i << ": number of tokens = " << tokens.length() 
00375                  << std::endl;
00376             for(int j = 0; j < tokens.length();j++)
00377               {
00378                 std::cerr << "     token " << j << "  = " << tokens[j] << std::endl;
00379                 std::cerr << "     length of token[" << j << "] = " 
00380                      << tokens[j].length() << std::endl;
00381               }
00382           }
00383         if (tokens[0] == "Dimension") 
00384           {
00385             dimensionIndex = i;
00386             std::cerr << "token[0] = Dimension" << std::endl;
00387             break;
00388           }
00389       }
00390     std::cerr << "DimensionIndex = " << dimensionIndex << std::endl;
00391     if (dimensionIndex > 0)
00392       {
00393         tokens = StrUtils::stringTokenizer(liners[dimensionIndex + 1]);
00394         dimension = atoi(tokens[0]);
00395         std::cerr << "dimension = " << dimension << std::endl;
00396         lineIndex = dimensionIndex + 2;
00397       }
00398 
00399     for (int i = lineIndex; i < liners.size(); i++)
00400       {
00401         tokens = StrUtils::stringTokenizer(liners[i]);
00402         if (tokens[0] == "Vertices") verticesIndex = i;
00403         if (tokens[0] == "Vertices") break;
00404       }
00405     if (verticesIndex > 0)
00406       {
00407         tokens = StrUtils::stringTokenizer(liners[verticesIndex + 1]);
00408         nPoints = atoi(tokens[0]);
00409         std::cerr << "nPoints = " << nPoints << std::endl;
00410         ptGID.resize(nPoints);
00411         ptOwner.resize(nPoints);
00412         for (int i=0; i<nPoints; i++)
00413           {
00414             ptGID[i] = i;
00415             ptOwner[i] = 0;
00416           }
00417         lineIndex = verticesIndex + 2; 
00418         //assume node data starts 2 lines below "Vertices"
00419       }
00420   
00421     Array<int> ptIndices(nPoints);
00422     Array<int> rawIndices(nPoints);
00423 
00424     Array<double> velVector(2*nPoints);
00425     int numbbAttr = 0; //will reset if bbAttr_ = true
00426     
00427     
00428     ///// read the velocity data from bb file if bbAttr_ = true ////////////
00429       if (bbAttr_)
00430         {
00431           RCP<std::ifstream> bbStream = openFile(bbFilename_, 
00432                                                     "velocity info");
00433           Array<string> bbliners = StrUtils::readFile(*bbStream, '#');
00434 
00435           //extract dimension, # solutions, # vertices, solution type 
00436           //from first line
00437 
00438           int bbdimension;
00439           int bbnumSolns;
00440           int bbnumPoints=0;
00441           int bbsolnType;
00442           int bbdimensionIndex = 0;
00443           int bblineIndex = 0;
00444           //          int bbverticesIndex = 0;
00445           std::cerr << "bbDimensionIndex = " << bbdimensionIndex << std::endl;
00446 
00447           int bblinerssize = bbliners.size();
00448           std::cerr << "number of lines in bbliners = " << bblinerssize << std::endl;
00449 
00450           for (int i = bblineIndex; i < bblinerssize; i++)
00451             {
00452               Array<string> bbtokens = StrUtils::stringTokenizer(bbliners[i]);
00453               if(bbtokens.length() > 0) //read first nonblank line
00454                 {
00455                   if(bbtokens.length() != 4)
00456                     {
00457                       std::cerr << 
00458                         "warning: .bb header line should have 4 tokens, read " 
00459                            << bbtokens.length() << std::endl;
00460                     }          
00461                   std::cerr << "bbline " << i << ": read bbtokens " << bbtokens[0] 
00462                        << " " << bbtokens[1] << " " << bbtokens[2] << " " 
00463                        << bbtokens[3] << std::endl;
00464                   bbdimensionIndex = i;
00465                   break;
00466                 }
00467             }
00468           bblineIndex = bbdimensionIndex + 1;
00469           std::cerr << "bblineIndex = " << bblineIndex << std::endl;
00470           if (bblineIndex > 0)
00471             {
00472               Array<string> bbtokens = 
00473                 StrUtils::stringTokenizer(bbliners[bbdimensionIndex]);
00474               bbdimension = StrUtils::atoi(bbtokens[0]);
00475               std::cerr << "bbdimension = " << bbdimension << std::endl;
00476               if (bbdimension != 2) 
00477                 std::cerr << "Error! bbdimension should be 2" << std::endl;
00478               bbnumSolns = StrUtils::atoi(bbtokens[1]);
00479               numbbAttr = bbnumSolns; //sets the number of attributes
00480               std::cerr << "number of solutions per vertex = " << bbnumSolns << std::endl;
00481               //if (bbnumSolns != nAttributes) 
00482               //  std::cerr << "Error: bbnumSolns not equal to nAttributes!" << std::endl;
00483               bbnumPoints = StrUtils::atoi(bbtokens[2]);
00484               std::cerr << "number of vertices = " << bbnumPoints << std::endl;
00485               if (bbnumPoints != nPoints) 
00486                 std::cerr << "Error!! number of bb points != nPoints" << std::endl;
00487               bbsolnType = StrUtils::atoi(bbtokens[3]);
00488               std::cerr << "bbsolution type = " << bbsolnType  << std::endl;
00489             }
00490 
00491           //assume solution data starts immediately below header 
00492           //and has no blank lines
00493           for (int i = bblineIndex; i < bbnumPoints + bblineIndex; i++) 
00494             {
00495               Array<string> bbtokens = StrUtils::stringTokenizer(bbliners[i]);
00496               if (bbtokens.length() == 0) 
00497                 std::cerr << "warning: encountered a blank soln line" << std::endl;
00498               int ii = i - bblineIndex;
00499               //pointAttributes_[ii].resize(nAttributes);
00500               velVector[ii] = StrUtils::atof(bbtokens[0]);
00501               velVector[ii+bbnumPoints] = StrUtils::atof(bbtokens[1]);
00502               //pointAttributes_[ii][0] = StrUtils::atof(bbtokens[0]);
00503               //pointAttributes_[ii][1] = StrUtils::atof(bbtokens[1]);
00504       
00505               if( i < 5 || i > bbnumPoints - 5) //check velocities
00506                 {
00507                   //std::cerr << "vel0[" << ii << "] = " 
00508                   //     << pointAttributes_[ii][0] << std::endl;
00509                   //std::cerr << "vel1[" << ii << "] = " << pointAttributes_[ii][1] 
00510                   //     << std::endl;
00511                   std::cerr << "vel0[" << ii << "] = " << velVector[ii] << std::endl;
00512                   std::cerr << "vel1[" << ii << "] = " << velVector[ii+bbnumPoints] 
00513                        << std::endl;
00514                 }
00515       
00516             }
00517         }
00518       //////////// got velocity vector ///////////////////////
00519   
00520 
00521       int nAttributes = 0; // value from Triangle .node file
00522       if (bbAttr_) nAttributes = numbbAttr; // expect two velocities per node
00523       std::cerr << "nAttributes = " << nAttributes << std::endl;
00524       //      int nBdryMarkers = 1; // unused - commented out - KL
00525       //value from Triangle .node file; consistent with Bamg .mesh file
00526 
00527       //Mesh mesh(dimension); /old
00528       mesh = createMesh(dimension);
00529       int count=0;
00530       int offset=0; 
00531       //initialization--will later set = 1 since Bamg #'s count from 1, not 0
00532       Array<bool> usedPoint(nPoints);
00533 
00534       //pointAttributes_.resize(nPoints); //old
00535       nodeAttributes()->resize(nPoints);
00536 
00537       //bool first = true;// unused - commented out - KL
00538 
00539       /* now we can add the point to the mesh */
00540       for (int i = lineIndex; i < liners.size(); i++)  
00541         //proceed to read nodes, forget bdry markers
00542         {
00543           tokens = StrUtils::stringTokenizer(liners[i]);
00544           if (tokens.length() > 1)
00545             {
00546               double x = atof(tokens[0]); 
00547               double y = atof(tokens[1]);
00548               count = i - lineIndex;//assume no blank lines once node data begins
00549               rawIndices[count] = count;
00550               if ((i == lineIndex) || (i == lineIndex + 1) || 
00551                   (i > lineIndex + nPoints - 2))
00552                 {
00553                   std::cerr << "i = " << i << ";  node = (" << x << "," << y << ")" 
00554                        << std::endl;
00555                   std::cerr << "count = " << count << std::endl;
00556                 }
00557 
00558               double z = 0.0;
00559               Point pt;
00560               int ptLabel = 0;
00561       
00562               if (dimension==3)
00563                 {
00564                   z = atof(tokens[3]);
00565                   pt = Point(x,y,z);
00566                 }
00567               else 
00568                 {
00569                   pt = Point(x,y);
00570                 }
00571 
00572               ptIndices[count] 
00573                 = mesh.addVertex(ptGID[count], pt, ptOwner[count], ptLabel);
00574     
00575               (*nodeAttributes())[count].resize(nAttributes);
00576               for (int i=0; i<nAttributes; i++)
00577                 {
00578                   //(*nodeAttributes())[count][i] = atof(tokens[dimension+1+i]);
00579                   if(i == 0) (*nodeAttributes())[count][i] = velVector[count];
00580                   if(i == 1) (*nodeAttributes())[count][i] = 
00581                     velVector[count + nPoints];
00582                 }
00583             }
00584 
00585           if (tokens[0] == "Edges") 
00586             {
00587               edgesIndex = i;
00588               break;
00589             }
00590         }
00591       std::cerr << "edgesIndex = " << edgesIndex << std::endl;
00592       std::cerr << "count = " << count << "; npoints - 1 = " << nPoints - 1 << std::endl;
00593   
00594       if (count != nPoints - 1) std::cout << "error: # of nodes != # of vertices" 
00595                                      << std::endl;
00596       else std::cerr << "successfully read node data" << std::endl;
00597       lineIndex = edgesIndex + 1;
00598 
00599       // done reading nodes; now read connectivity data.
00600 
00601       std::cerr << "lineIndex = " << lineIndex << "; triangleIndex = " 
00602            << triangleIndex << std::endl;
00603       for (int i = lineIndex; i < liners.size(); i++)
00604         {
00605           tokens = StrUtils::stringTokenizer(liners[i]);
00606           if (tokens[0] == "Triangles") {triangleIndex = i; break;}
00607           if (tokens[0] == "CrackedEdges") {triangleIndex = i+2; break;} 
00608           //skip over CrackedEdges info 
00609         }
00610       std::cerr << "lineIndex = " << lineIndex << "; triangleIndex = " 
00611            << triangleIndex << std::endl;
00612       std::cerr << "tokens[0] = " << tokens[0] << std::endl;
00613     
00614       lineIndex = triangleIndex + 1;
00615 
00616       Array<int> elemGID;
00617       Array<int> elemOwner;
00618 
00619       if (triangleIndex > 0)
00620         {
00621           tokens = StrUtils::stringTokenizer(liners[lineIndex]);
00622           std::cerr << "lineIndex = " << lineIndex << "; tokens[0] = " << tokens[0] 
00623                << std::endl;
00624           nCells = atoi(tokens[0]);
00625           elemGID.resize(nCells);
00626           elemOwner.resize(nCells);
00627           std::cerr << "nCells = " << nCells << std::endl;
00628           for (int i=0; i<nCells; i++)
00629             {
00630               elemGID[i] = i;
00631               elemOwner[i] = 0;
00632             }
00633           lineIndex = lineIndex + 1;
00634         }
00635 
00636 
00637       // continue to read element data from mesh file//
00638       /*
00639         void TriangleMeshReader::readElems(Mesh& mesh,
00640         const Array<int>& ptGID,
00641         Array<int>& elemGID,
00642         Array<int>& elemOwner) const 
00643       */
00644 
00645       //string line; //already defined
00646       //Array<string> tokens; //already defined
00647 
00648       ///////////////////////////////////////////////////////////////////
00649         // skip this part and plug in the corresponding Bamg reader code //
00650         ///////////////////////////////////////////////////////////////////
00651 
00652         /*
00653    
00654         // Open the element file //
00655         RCP<std::ifstream> elemStream = openFile(elemFilename_, "element info");
00656 
00657         getNextLine(*elemStream, line, tokens, '#');
00658      
00659         TEST_FOR_EXCEPTION(tokens.length() != 3, RuntimeError,
00660         "TriangleMeshReader::getMesh() requires 3 "
00661         "entries on the header line in "
00662         "the .ele file. Found line \n[" << line
00663         << "]\n in file " << elemFilename_);
00664                    
00665         int nElems = 0;
00666         int offset = 1;
00667         if (nProc()==1)
00668         {
00669         nElems = atoi(tokens[0]);
00670         elemGID.resize(nElems);
00671         elemOwner.resize(nElems);
00672         for (int i=0; i<nElems; i++)
00673         {
00674         elemGID[i] = i;
00675         elemOwner[i] = 0;
00676         }
00677         }
00678         else
00679         {
00680         // If we're running in parallel, we'd better have consistent numbers
00681         // of points in the .node and .par file. //
00682         TEST_FOR_EXCEPTION(atoi(tokens[0]) != nElems, RuntimeError,
00683         "TriangleMeshReader::readElems() found inconsistent "
00684         "numbers of elements in .ele file and par file. Elem "
00685         "file " << elemFilename_ << " had nElems=" 
00686         << atoi(tokens[0]) << " but .par file " 
00687         << parFilename_ << " had nElems=" << nElems);
00688         }
00689 
00690         int ptsPerElem = atoi(tokens[1]);
00691 
00692         TEST_FOR_EXCEPTION(ptsPerElem != mesh.spatialDim()+1, RuntimeError,
00693         "TriangleMeshReader::readElems() found inconsistency "
00694         "between number of points per element=" << ptsPerElem 
00695         << " and dimension=" << mesh.spatialDim() << ". Number of pts "
00696         "per element should be dimension + 1");
00697 
00698         int nAttributes = atoi(tokens[2]);
00699         elemAttributes()->resize(nElems);
00700 
00701         int dim = mesh.spatialDim();
00702         Array<int> nodes(dim+1);
00703 
00704         for (int count=0; count<nElems; count++)
00705         {
00706         getNextLine(*elemStream, line, tokens, '#');
00707       
00708         TEST_FOR_EXCEPTION(tokens.length() 
00709         != (1 + ptsPerElem + nAttributes),
00710         RuntimeError,
00711         "TriangleMeshReader::readElems() found bad elem "
00712         "input line. Expected " 
00713         << (1 + ptsPerElem + nAttributes)
00714         << " entries but found line \n[" << 
00715         line << "]\n in file " << elemFilename_);
00716 
00717         for (int d=0; d<=dim; d++)
00718         {
00719         nodes[d] = ptGID[atoi(tokens[d+1])-offset];
00720         }
00721 
00722         int elemLabel = 0;
00723         mesh.addElement(elemGID[count], nodes, elemOwner[count], elemLabel);
00724        
00725         (*elemAttributes())[count].resize(nAttributes);
00726         for (int i=0; i<nAttributes; i++)
00727         {
00728         (*elemAttributes())[count][i] = atof(tokens[1+ptsPerElem+i]);
00729         }
00730         }
00731         */
00732 
00733         //////// here's the Bamg code for reading triangles (elements) ////////
00734         std::cerr << "# of triangles = " << nCells 
00735              << "; starting to read triangle data" << std::endl;
00736         SUNDANCE_OUT(this->verb() > 3, 
00737                      "done reading nodes, ready to read elements from " + meshFilename_);
00738 
00739         int nElems = nCells;
00740         int ptsPerElem = dimension + 1;
00741         elemGID.resize(nElems);
00742         elemOwner.resize(nElems);
00743         offset = 1; //assume Bamg node #'s start with 1, not 0
00744 
00745         for (int i=0; i<nElems; i++)
00746           {
00747             elemGID[i] = i;
00748             elemOwner[i] = 0;
00749           }
00750         nAttributes = 0;
00751         //cellAttributes_.resize(nCells); //old
00752         elemAttributes()->resize(nElems);
00753         count = 0;
00754 
00755         int dim = mesh.spatialDim(); //should equal dimension
00756         Array<int> nodes(dim+1); 
00757         if (dim != dimension) std::cerr << "ERROR: dim = " << dim << "!= dimension = "
00758                                    << dimension << std::endl;
00759       
00760         std::cerr << "lineIndex = " << lineIndex << std::endl;
00761         std::cerr << "size of liners = " << liners.size() << std::endl;
00762         std::cerr << "lineIndex+nCells-1 = " << lineIndex+nCells-1 << std::endl;
00763         for (int i = lineIndex; i < liners.size();i++) 
00764           //proceed to read elements, forget bdry markers
00765           {
00766             tokens = StrUtils::stringTokenizer(liners[i]);
00767             if (tokens.length() > 1)
00768               {
00769                 if (i < lineIndex + 5) std::cerr << "i = " << i << " first triangles: " 
00770                                             << tokens[0] << " " << tokens[1] 
00771                                             << " " << tokens[2] << std::endl;
00772                 if (i == lineIndex+nCells-1) std::cerr << "i = " << i 
00773                                                   << " last triangle: " << tokens[0] 
00774                                                   << " " << tokens[1] << " " 
00775                                                   << tokens[2] << std::endl;
00776 
00777                 for (int d=0; d<=dim; d++)
00778                   {
00779                     //nodes[d] = ptGID[atoi(tokens[d+1])-offset]; 
00780                     //a Triangle .ele file reads the element no. first, 
00781                     //so must offset d by 1
00782                     nodes[d] = ptGID[atoi(tokens[d])-offset]; 
00783                     //no need to offset d since a Bamg .mesh file doesn't list 
00784                     //node numbers; offset=1 since Bamg #'s start from 1, not 0
00785                   }
00786 
00787                 count = i - lineIndex; 
00788                 int elemLabel = 0;
00789                 mesh.addElement(elemGID[count], nodes, elemOwner[count], elemLabel);
00790        
00791                 (*elemAttributes())[count].resize(nAttributes);
00792                 for (int i=0; i<nAttributes; i++)
00793                   {
00794                     //(*elemAttributes())[count][i] = atof(tokens[1+ptsPerElem+i]);
00795                     //offset by 1 since a Triangle .ele file reads the 
00796                     //element no. first
00797                     (*elemAttributes())[count][i] = atof(tokens[ptsPerElem+i]);
00798                     //no need to offset by 1 since a Bamg .mesh file doesn't 
00799                     //list node numbers;
00800                   }
00801               }
00802             if (tokens[0] == "SubDomainFromMesh") break; //we're done
00803           }
00804   
00805         std::cerr << "# of cells read = " << count + 1 << std::endl;
00806         if (count != nCells - 1) std::cerr << "error: # of cells read != nCells" << std::endl;
00807 
00808         // done reading elements
00809 
00810         return mesh;
00811 }
00812 
00813 ///////////////////////////////////////////////////////////////////////////
00814 //ignore this -- we read velocities from bb file within readMesh method
00815 /*
00816 
00817 Array<Array<double> > BamgMeshReader::getVelocityField(const std::string& bbFilename) const
00818 // read .bb file for 2-D velocity field & return a ListExpr for the field //
00819 {
00820 RCP<std::ifstream> bbStream = openFile(bbFilename_, "velocity info");
00821 Array<string> liners = StrUtils::readFile(*bbStream, '#');
00822 
00823 //extract dimension, # solutions, # vertices, solution type from first line
00824 
00825 int dimension;
00826 int numSolns;
00827 int numPoints;
00828 int solnType;
00829 int dimensionIndex = 0;
00830 int lineIndex = 0;
00831 int verticesIndex = 0;
00832 std::cerr << "DimensionIndex = " << dimensionIndex << std::endl;
00833 
00834 int linerssize = liners.size();
00835 std::cerr << "number of lines in liners = " << linerssize << std::endl;
00836 
00837 for (int i = lineIndex; i < linerssize; i++)
00838 {
00839 Array<string> tokens = StrUtils::stringTokenizer(liners[i]);
00840 //replaced 'TSFArray' with 'Array'
00841 if(tokens.length() > 0) //read first nonblank line
00842 {
00843 if(tokens.length() != 4)
00844 {
00845 std::cerr << "warning: .bb header line should have 4 tokens, read " 
00846 << tokens.length() << std::endl;
00847 }          
00848 std::cerr << "line " << i << ": read tokens " << tokens[0] << " " 
00849 << tokens[1] << " " << tokens[2] << " " << tokens[3] << std::endl;
00850 dimensionIndex = i;
00851 break;
00852 }
00853 }
00854 lineIndex = dimensionIndex + 1;
00855 std::cerr << "lineIndex = " << lineIndex << std::endl;
00856 if (lineIndex > 0)
00857 {
00858 Array<string> tokens = StrUtils::stringTokenizer(liners[dimensionIndex]);
00859 //replaced 'TSFArray' with 'Array'
00860 dimension = StrUtils::atoi(tokens[0]);
00861 std::cerr << "dimension = " << dimension << std::endl;
00862 if (dimension != 2) std::cerr << "Error! dimension should be 2" << std::endl;
00863 numSolns = StrUtils::atoi(tokens[1]);
00864 std::cerr << "number of solutions per vertex = " << numSolns << std::endl;
00865 //if (numSolns != nAttributes) 
00866 //  std::cerr << "Error: numSolns not equal to nAttributes!" << std::endl;
00867 numPoints = StrUtils::atoi(tokens[2]);
00868 std::cerr << "number of vetices = " << numPoints << std::endl;
00869 solnType = StrUtils::atoi(tokens[3]);
00870 std::cerr << "solution type = " << solnType  << std::endl;
00871 }
00872 
00873 //BasisFamily lagr = new Lagrange(1);
00874 //VectorType<double> petra = new EpetraVectorType();
00875 //Array<BasisFamily> lagrVelBasis;
00876 //for (int n = 0; n < dimension; n++) lagrVelBasis.append(lagr);
00877 //DiscreteSpace dStateSpace(mesh, lagrVelBasis, petra);
00878 
00879 //Array<Expr> vel0(numPoints);
00880 //Array<Expr> vel1(numPoints);
00881 
00882 Array<double> vel(2*numPoints); //concatenated velocity vectors
00883 
00884 //assume solution data starts immediately below header and has no blank lines
00885 for (int i = lineIndex; i < numPoints + lineIndex; i++) 
00886 {
00887 Array<string> tokens = StrUtils::stringTokenizer(liners[i]);
00888 if (tokens.length() == 0) 
00889 std::cerr << "warning: encountered a blank soln line" << std::endl;
00890 int ii = i - lineIndex;
00891 //pointAttributes_[ii].resize(nAttributes);
00892 vel[ii] = StrUtils::atof(tokens[0]);
00893 vel[ii+numPoints] = StrUtils::atof(tokens[1]);
00894 //pointAttributes_[ii][0] = StrUtils::atof(tokens[0]);
00895 //pointAttributes_[ii][1] = StrUtils::atof(tokens[1]);
00896       
00897 if( i < 5 || i > numPoints - 5) //check to see if we got velocities
00898 {
00899 std::cerr << "vel0[" << ii << "] = " << pointAttributes_[ii][0] << std::endl;
00900 std::cerr << "vel1[" << ii << "] = " << pointAttributes_[ii][1] << std::endl;
00901 }
00902  
00903 }
00904 
00905 return vel;
00906 }
00907 
00908 */

Site Contact