00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "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)
00222 {
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)
00341 {
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)
00386 {
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 }