SundanceQuadratureFamily.cpp
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 #include "SundanceQuadratureFamily.hpp"
00032 #include "SundanceTabs.hpp"
00033 
00034 using namespace Sundance;
00035 using namespace Sundance;
00036 using namespace Sundance;
00037 using namespace Sundance;
00038 using namespace Teuchos;
00039 using std::ios_base;
00040 using std::setw;
00041 using std::endl;
00042 using std::setprecision;
00043 
00044 int QuadratureFamily::getNumPoints( const CellType & cellType ) const
00045 {
00046   const QuadratureFamilyBase* q 
00047     = dynamic_cast<const QuadratureFamilyBase*>(ptr().get());
00048   return q->getNumPoints( cellType );
00049 }
00050 
00051 void QuadratureFamily::getPoints(const CellType& cellType, 
00052                                  Array<Point>& quadPoints,
00053                                  Array<double>& quadWeights) const 
00054 {
00055   const QuadratureFamilyBase* q 
00056     = dynamic_cast<const QuadratureFamilyBase*>(ptr().get());
00057   
00058   TEST_FOR_EXCEPTION(q==0, InternalError, 
00059                      "QuadratureFamilyStub pointer" << toXML().toString() 
00060                      << " could not be cast to a QuadratureFamilyBase ptr");
00061                      
00062   q->getPoints(cellType, quadPoints, quadWeights);
00063 }
00064 
00065 void QuadratureFamily::getAdaptedWeights(const CellType& cellType ,
00066                              int cellDim,
00067                                int celLID ,
00068                              int facetIndex ,
00069                                  const Mesh& mesh ,
00070                                  const ParametrizedCurve& globalCurve ,
00071                                  Array<Point>& quadPoints ,
00072                                  Array<double>& quadWeights ,
00073                                  bool& isCut) const
00074 {
00075 
00076   const QuadratureFamilyBase* q
00077    = dynamic_cast<const QuadratureFamilyBase*>(ptr().get());
00078 
00079   TEST_FOR_EXCEPTION(q==0, InternalError,
00080                      "QuadratureFamilyStub pointer" << toXML().toString()
00081                       << " could not be cast to a QuadratureFamilyBase ptr");
00082 
00083   q->getAdaptedWeights(cellType, cellDim , celLID , facetIndex ,
00084       mesh , globalCurve , quadPoints, quadWeights , isCut);
00085 
00086 }
00087 
00088 XMLObject QuadratureFamily::toXML() const 
00089 {
00090   return ptr()->toXML();
00091 }
00092 
00093 int QuadratureFamily::order() const 
00094 {
00095   return ptr()->order();
00096 }
00097 
00098 
00099 
00100 void QuadratureFamily::getFacetPoints(const CellType& cellType, 
00101                                       int facetDim,
00102                                       int facetIndex,
00103                                       Array<Point>& quadPoints,
00104                                       Array<double>& quadWeights) const
00105 {
00106   switch(cellType)
00107     {
00108     case LineCell:
00109       getLineFacetQuad(facetDim, facetIndex, quadPoints, quadWeights);
00110       break;
00111     case TriangleCell:
00112       getTriangleFacetQuad(facetDim, facetIndex, quadPoints, quadWeights);
00113       break;
00114     case QuadCell:
00115       getQuadFacetQuad(facetDim, facetIndex, quadPoints, quadWeights);
00116       break;
00117     case TetCell:
00118       getTetFacetQuad(facetDim, facetIndex, quadPoints, quadWeights);
00119       break;
00120     case BrickCell:
00121       getBrickFacetQuad(facetDim, facetIndex, quadPoints, quadWeights);
00122       break;
00123     default:
00124       TEST_FOR_EXCEPTION(true, RuntimeError,
00125                          "getFacetPoints() not implemented for cell type "
00126                          << cellType);
00127     }
00128 }
00129 
00130 
00131 void QuadratureFamily::getLineFacetQuad(int facetDim,
00132                                         int facetIndex,
00133                                         Array<Point>& quadPoints,
00134                                         Array<double>& quadWeights) const
00135 {
00136   TEST_FOR_EXCEPTION(facetDim > 0, RuntimeError,
00137                      "Invalid facet dimension " << facetDim 
00138                      << " in getLineFacetQuad()");
00139   TEST_FOR_EXCEPTION(facetIndex < 0 || facetIndex > 1, RuntimeError,
00140                      "Invalid facet index " << facetIndex  
00141                      << " in getLineFacetQuad()");
00142 
00143   quadPoints.resize(1);
00144   quadWeights.resize(1);
00145   quadWeights[0] = 1.0;  
00146   quadPoints[0] = Point((double) facetIndex);
00147 }
00148 
00149 
00150 
00151 
00152 void QuadratureFamily::getTriangleFacetQuad(int facetDim,
00153                                             int facetIndex,
00154                                             Array<Point>& quadPoints,
00155                                             Array<double>& quadWeights) const
00156 {
00157   TEST_FOR_EXCEPTION(facetDim > 1, RuntimeError,
00158                      "Invalid facet dimension " << facetDim 
00159                      << " in getTriangleFacetQuad()");
00160   TEST_FOR_EXCEPTION(facetIndex < 0 || facetIndex > 2, RuntimeError,
00161                      "Invalid facet index " << facetIndex  
00162                      << " in getTriangleFacetQuad()");
00163   if (facetDim==1)
00164     {
00165       Array<Point> facetPts;
00166       Array<double> facetWts;
00167       getPoints(LineCell, facetPts, facetWts);
00168       quadPoints.resize(facetPts.size());
00169       quadWeights.resize(facetWts.size());
00170       for (int i=0; i<facetPts.size(); i++)
00171         {
00172           if (facetIndex==0)
00173             {
00174               quadPoints[i] = Point(facetPts[i][0], 0.0);
00175               quadWeights[i] = facetWts[i];
00176             }
00177           else if (facetIndex==1)
00178             {
00179               quadPoints[i] = Point(1.0-facetPts[i][0], facetPts[i][0]);
00180               quadWeights[i] = facetWts[i];
00181             }
00182           else
00183             {
00184               quadPoints[i] = Point(0.0, 1.0-facetPts[i][0]);
00185               quadWeights[i] = facetWts[i];
00186             }
00187         }
00188     }
00189   else
00190     {
00191       quadPoints.resize(1);
00192       quadWeights.resize(1);
00193       quadWeights[0] = 1.0;  
00194       if (facetIndex==0) quadPoints[0] = Point(0.0, 0.0);
00195       else if (facetIndex==1) quadPoints[0] = Point(1.0, 0.0);
00196       else quadPoints[0] = Point(0.0, 1.0);
00197     }
00198 }
00199 
00200 void QuadratureFamily::getQuadFacetQuad(int facetDim,
00201                            int facetIndex,
00202                            Array<Point>& quadPoints,
00203                            Array<double>& quadWeights) const {
00204 
00205     TEST_FOR_EXCEPTION(facetDim > 1, RuntimeError,
00206                        "Invalid facet dimension " << facetDim
00207                        << " in getQuadFacetQuad()");
00208 
00209     TEST_FOR_EXCEPTION(facetIndex < 0 || facetIndex > 3, RuntimeError,
00210                        "Invalid facet index " << facetIndex
00211                        << " in getQuadFacetQuad()");
00212     if (facetDim==1)
00213       {
00214         Array<Point> facetPts;
00215         Array<double> facetWts;
00216         getPoints(LineCell, facetPts, facetWts);
00217         quadPoints.resize(facetPts.size());
00218         quadWeights.resize(facetWts.size());
00219         for (int i=0; i<facetPts.size(); i++)
00220           {
00221             if (facetIndex==0) // the 4 edges of the Quad
00222               {               // Numbering is important, if Edge Numbering in QuadCell changes, change this as well
00223                 quadPoints[i] = Point(facetPts[i][0], 0.0);
00224                 quadWeights[i] = facetWts[i];
00225               }
00226             else if (facetIndex==1)
00227               {
00228                 quadPoints[i] = Point(0.0 , facetPts[i][0]);
00229                 quadWeights[i] = facetWts[i];
00230               }
00231             else if (facetIndex==2)
00232               {
00233                 quadPoints[i] = Point(1.0, facetPts[i][0]);
00234                 quadWeights[i] = facetWts[i];
00235               }
00236             else
00237               {
00238                 quadPoints[i] = Point(facetPts[i][0], 1.0);
00239                 quadWeights[i] = facetWts[i];
00240               }
00241           }
00242       }
00243     else
00244       {
00245         quadPoints.resize(1);
00246         quadWeights.resize(1);
00247         quadWeights[0] = 1.0;
00248         if (facetIndex==0) quadPoints[0] = Point(0.0, 0.0);
00249         else if (facetIndex==1) quadPoints[0] = Point(1.0, 0.0);
00250         else if (facetIndex==2) quadPoints[0] = Point(0.0, 1.0);
00251         else quadPoints[0] = Point(1.0, 1.0);
00252       }
00253 }
00254 
00255 void QuadratureFamily::getTetFacetQuad(int facetDim,
00256                                        int facetIndex,
00257                                        Array<Point>& quadPoints,
00258                                        Array<double>& quadWeights) const
00259 {
00260   TEST_FOR_EXCEPTION(facetDim > 2, RuntimeError,
00261                      "Invalid facet dimension " << facetDim 
00262                      << " in getTetFacetQuad()");
00263   TEST_FOR_EXCEPTION(facetIndex < 0 || facetIndex > 4, RuntimeError,
00264                      "Invalid facet index " << facetIndex  
00265                      << " in getTetFacetQuad()");
00266   if (facetDim==2)
00267     {
00268       Array<Point> facetPts;
00269       Array<double> facetWts;
00270       getPoints(TriangleCell, facetPts, facetWts);
00271       quadPoints.resize(facetPts.size());
00272       quadWeights.resize(facetWts.size());
00273       for (int i=0; i<facetPts.size(); i++)
00274         {
00275           double s = facetPts[i][0];
00276           double t = facetPts[i][1];
00277           double x,y,z;
00278           if (facetIndex==0)
00279             {
00280               x = 1.0-s;
00281               y = 1.0-s-t;
00282               z = t;
00283             }
00284           else if (facetIndex==1)
00285             {
00286               x = 1.0-s;
00287               y = 0.0;
00288               z = t;
00289             }
00290           else if (facetIndex==2) 
00291             {
00292               x = 0.0;
00293               y = 1.0-s;
00294               z = t;
00295             }
00296           else
00297             {
00298               x = s;
00299               y = t;
00300               z = 0.0;
00301             }
00302           quadPoints[i] = Point(x, y, z);
00303           quadWeights[i] = facetWts[i];
00304 
00305         }
00306     }
00307   else if (facetDim==0)
00308     {
00309       quadPoints.resize(1);
00310       quadWeights.resize(1);
00311       quadWeights[0] = 1.0;  
00312       if (facetIndex==0) quadPoints[0] = Point(0.0, 0.0);
00313       else if (facetIndex==1) quadPoints[0] = Point(1.0, 0.0);
00314       else if (facetIndex==2) quadPoints[0] = Point(1.0, 0.0);
00315       else quadPoints[0] = Point(0.0, 1.0);
00316     }
00317 }
00318 
00319 
00320 void QuadratureFamily::getBrickFacetQuad(int facetDim,
00321                                        int facetIndex,
00322                                        Array<Point>& quadPoints,
00323                                        Array<double>& quadWeights) const
00324 {
00325   TEST_FOR_EXCEPTION(facetDim > 2, RuntimeError,
00326                      "Invalid facet dimension " << facetDim
00327                      << " in getBrickFacetQuad()");
00328   if (facetDim==2)
00329     {
00330     TEST_FOR_EXCEPTION(facetIndex < 0 || facetIndex > 5, RuntimeError,
00331                         "Invalid facet index " << facetIndex
00332                         << " in getBrickFacetQuad()");
00333       Array<Point> facetPts;
00334       Array<double> facetWts;
00335       getPoints(QuadCell, facetPts, facetWts);
00336       quadPoints.resize(facetPts.size());
00337       quadWeights.resize(facetWts.size());
00338       for (int i=0; i<facetPts.size(); i++)
00339         {
00340           if (facetIndex==0) // the 6 faces of the Brick
00341             {// Numbering is important, if Edge Numbering in BrickCell changes, change this as well
00342               quadPoints[i] = Point(facetPts[i][0], facetPts[i][1] , 0.0);
00343               quadWeights[i] = facetWts[i];
00344             }
00345           else if (facetIndex==1)
00346             {
00347               quadPoints[i] = Point(facetPts[i][0], 0.0 , facetPts[i][1] );
00348               quadWeights[i] = facetWts[i];
00349             }
00350           else if (facetIndex==2)
00351             {
00352               quadPoints[i] = Point( 0.0 , facetPts[i][0] , facetPts[i][1] );
00353               quadWeights[i] = facetWts[i];
00354             }
00355           else if (facetIndex==3)
00356             {
00357               quadPoints[i] = Point( 1.0 , facetPts[i][0] , facetPts[i][1] );
00358               quadWeights[i] = facetWts[i];
00359             }
00360           else if (facetIndex==4)
00361             {
00362               quadPoints[i] = Point( facetPts[i][0] , 1.0 , facetPts[i][1] );
00363               quadWeights[i] = facetWts[i];
00364             }
00365           else
00366             {
00367               quadPoints[i] = Point( facetPts[i][0] , facetPts[i][1] , 1.0 );
00368               quadWeights[i] = facetWts[i];
00369             }
00370 
00371         }
00372     }
00373   else if (facetDim==1)
00374      {
00375     TEST_FOR_EXCEPTION(facetIndex < 0 || facetIndex > 11, RuntimeError,
00376                         "Invalid facet index " << facetIndex
00377                         << " in getBrickFacetQuad()");
00378       Array<Point> facetPts;
00379       Array<double> facetWts;
00380       getPoints(LineCell, facetPts, facetWts);
00381       quadPoints.resize(facetPts.size());
00382       quadWeights.resize(facetWts.size());
00383       for (int i=0; i<facetPts.size(); i++)
00384         {
00385           if (facetIndex==0) // the 6 faces of the Brick
00386             {// Numbering is important, if Edge Numbering in BrickCell changes, change this as well
00387               quadPoints[i] = Point(facetPts[i][0], 0.0 , 0.0);  quadWeights[i] = facetWts[i];
00388             }
00389           else if (facetIndex==1)
00390           { quadPoints[i] = Point( 0.0 , facetPts[i][0], 0.0 ); quadWeights[i] = facetWts[i]; }
00391           else if (facetIndex==2)
00392           { quadPoints[i] = Point( 0.0 , 0.0 , facetPts[i][0]); quadWeights[i] = facetWts[i]; }
00393           else if (facetIndex==3)
00394           { quadPoints[i] = Point( 1.0 , facetPts[i][0] , 0.0 ); quadWeights[i] = facetWts[i]; }
00395           else if (facetIndex==4)
00396           { quadPoints[i] = Point( 1.0 , 0.0 , facetPts[i][0] ); quadWeights[i] = facetWts[i]; }
00397           else if (facetIndex==5)
00398           { quadPoints[i] = Point( facetPts[i][0] , 1.0 , 0.0 ); quadWeights[i] = facetWts[i]; }
00399           else if (facetIndex==6)
00400           { quadPoints[i] = Point( 0.0 , 1.0 , facetPts[i][0]); quadWeights[i] = facetWts[i]; }
00401           else if (facetIndex==7)
00402           { quadPoints[i] = Point( 1.0 , 1.0 , facetPts[i][0]); quadWeights[i] = facetWts[i]; }
00403           else if (facetIndex==8)
00404           { quadPoints[i] = Point( facetPts[i][0] , 0.0 , 1.0); quadWeights[i] = facetWts[i]; }
00405           else if (facetIndex==9)
00406           { quadPoints[i] = Point( 0.0 , facetPts[i][0] , 1.0); quadWeights[i] = facetWts[i]; }
00407           else if (facetIndex==10)
00408           { quadPoints[i] = Point( 1.0 , facetPts[i][0] , 1.0); quadWeights[i] = facetWts[i]; }
00409           else
00410           { quadPoints[i] = Point( facetPts[i][0] , 1.0 , 1.0); quadWeights[i] = facetWts[i]; }
00411         }
00412      }
00413   else if (facetDim==0)
00414     {
00415       quadPoints.resize(1);
00416       quadWeights.resize(1);
00417       quadWeights[0] = 1.0;
00418       if (facetIndex==0) quadPoints[0] = Point(0.0, 0.0 , 0.0);
00419       else if (facetIndex==1) quadPoints[0] = Point(1.0, 0.0, 0.0);
00420       else if (facetIndex==2) quadPoints[0] = Point(0.0, 1.0, 0.0);
00421       else if (facetIndex==3) quadPoints[0] = Point(1.0, 1.0, 0.0);
00422       else if (facetIndex==4) quadPoints[0] = Point(0.0, 0.0, 1.0);
00423       else if (facetIndex==5) quadPoints[0] = Point(1.0, 0.0, 1.0);
00424       else if (facetIndex==6) quadPoints[0] = Point(0.0, 1.0, 1.0);
00425       else quadPoints[0] = Point(1.0, 1.0, 1.0);
00426     }
00427 }
00428 
00429 
00430 namespace Sundance
00431 {
00432 void printQuad(std::ostream& os, 
00433   const Array<Point>& pts, const Array<double>& wgts)
00434 {
00435   Tabs tab(0);
00436   static Array<string> names = tuple<string>("x", "y", "z");
00437   TEST_FOR_EXCEPT(pts.size() != wgts.size());
00438   
00439   TEST_FOR_EXCEPT(pts.size() < 1);
00440 
00441   int dim = pts[0].dim();
00442 
00443   int prec=10;
00444   int w = prec+5;
00445   ios_base::fmtflags oldFlags = os.flags();
00446   os.setf(ios_base::internal);    
00447   os.setf(ios_base::showpoint);
00448 
00449   os << tab << setw(5) << "i" << setw(w) << "w";;
00450   
00451   for (int i=0; i<pts[0].dim(); i++)
00452   {
00453     os << setw(w) << names[i] ;
00454   }
00455   os << std::endl;
00456   os.setf(ios_base::right);    
00457   for (int i=0; i<pts.size(); i++)
00458   {
00459     os << tab << setw(5) << i << setw(w) << setprecision(prec) << wgts[i];
00460     for (int d=0; d<dim; d++)
00461     {
00462       os << setw(w) << setprecision(prec) << pts[i][d];
00463     }
00464     os << std::endl;
00465   }
00466   os.flags(oldFlags);
00467 }
00468 }

Site Contact