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

Site Contact