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
00035 namespace Intrepid {
00036
00037
00038 template<class Scalar, class ArrayType>
00039 Teuchos::RCP<Cubature<Scalar,ArrayType> > DefaultCubatureFactory<Scalar,ArrayType>::create(
00040 const shards::CellTopology & cellTopology,
00041 const std::vector<int> & degree) {
00042
00043
00044 Teuchos::RCP<Cubature<Scalar,ArrayType> > pickCubature;
00045
00046 switch (cellTopology.getBaseTopology()->key) {
00047
00048 case shards::Line<>::key:
00049 TEST_FOR_EXCEPTION( (degree.size() < 1), std::invalid_argument,
00050 ">>> ERROR (DefaultCubatureFactory): Provided degree array is of insufficient length.");
00051 pickCubature = Teuchos::rcp(new CubatureDirectLineGauss<Scalar,ArrayType>(degree[0]));
00052 break;
00053
00054 case shards::Triangle<>::key:
00055 TEST_FOR_EXCEPTION( (degree.size() < 1), std::invalid_argument,
00056 ">>> ERROR (DefaultCubatureFactory): Provided degree array is of insufficient length.");
00057 pickCubature = Teuchos::rcp(new CubatureDirectTriDefault<Scalar,ArrayType>(degree[0]));
00058 break;
00059
00060 case shards::Quadrilateral<>::key:
00061 TEST_FOR_EXCEPTION( (degree.size() < 2), std::invalid_argument,
00062 ">>> ERROR (DefaultCubatureFactory): Provided degree array is of insufficient length.");
00063 {
00064 std::vector< Teuchos::RCP< Cubature<Scalar,ArrayType> > > lineCubs(2);
00065 lineCubs[0] = Teuchos::rcp(new CubatureDirectLineGauss<Scalar,ArrayType>(degree[0]));
00066 lineCubs[1] = Teuchos::rcp(new CubatureDirectLineGauss<Scalar,ArrayType>(degree[1]));
00067 pickCubature = Teuchos::rcp(new CubatureTensor<Scalar,ArrayType>(lineCubs));
00068 }
00069 break;
00070
00071 case shards::Tetrahedron<>::key:
00072 TEST_FOR_EXCEPTION( (degree.size() < 1), std::invalid_argument,
00073 ">>> ERROR (DefaultCubatureFactory): Provided degree array is of insufficient length.");
00074 pickCubature = Teuchos::rcp(new CubatureDirectTetDefault<Scalar,ArrayType>(degree[0]));
00075 break;
00076
00077 case shards::Hexahedron<>::key:
00078 TEST_FOR_EXCEPTION( (degree.size() < 3), std::invalid_argument,
00079 ">>> ERROR (DefaultCubatureFactory): Provided degree array is of insufficient length.");
00080 {
00081 std::vector< Teuchos::RCP< Cubature<Scalar,ArrayType> > > lineCubs(3);
00082 lineCubs[0] = Teuchos::rcp(new CubatureDirectLineGauss<Scalar,ArrayType>(degree[0]));
00083 lineCubs[1] = Teuchos::rcp(new CubatureDirectLineGauss<Scalar,ArrayType>(degree[1]));
00084 lineCubs[2] = Teuchos::rcp(new CubatureDirectLineGauss<Scalar,ArrayType>(degree[2]));
00085 pickCubature = Teuchos::rcp(new CubatureTensor<Scalar,ArrayType>(lineCubs));
00086 }
00087 break;
00088
00089 case shards::Wedge<>::key:
00090 TEST_FOR_EXCEPTION( (degree.size() < 2), std::invalid_argument,
00091 ">>> ERROR (DefaultCubatureFactory): Provided degree array is of insufficient length.")
00092 {
00093 std::vector< Teuchos::RCP< Cubature<Scalar,ArrayType> > > miscCubs(2);
00094 miscCubs[0] = Teuchos::rcp(new CubatureDirectTriDefault<Scalar,ArrayType>(degree[0]));
00095 miscCubs[1] = Teuchos::rcp(new CubatureDirectLineGauss<Scalar,ArrayType>(degree[1]));
00096 pickCubature = Teuchos::rcp(new CubatureTensor<Scalar,ArrayType>(miscCubs));
00097 }
00098 break;
00099
00100 default:
00101 TEST_FOR_EXCEPTION( ( (cellTopology.getBaseTopology()->key != shards::Line<>::key) &&
00102 (cellTopology.getBaseTopology()->key != shards::Triangle<>::key) &&
00103 (cellTopology.getBaseTopology()->key != shards::Quadrilateral<>::key) &&
00104 (cellTopology.getBaseTopology()->key != shards::Tetrahedron<>::key) &&
00105 (cellTopology.getBaseTopology()->key != shards::Hexahedron<>::key) &&
00106 (cellTopology.getBaseTopology()->key != shards::Wedge<>::key) ),
00107 std::invalid_argument,
00108 ">>> ERROR (DefaultCubatureFactory): Invalid cell topology prevents cubature creation.");
00109 }
00110
00111 return pickCubature;
00112 }
00113
00114
00115
00116
00117 template<class Scalar, class ArrayType>
00118 Teuchos::RCP<Cubature<Scalar,ArrayType> > DefaultCubatureFactory<Scalar,ArrayType>::create(
00119 const shards::CellTopology & cellTopology, int degree) {
00120 std::vector<int> d(3);
00121 d[0] = degree; d[1] = degree; d[2] = degree;
00122 return create(cellTopology, d);
00123 }
00124
00125
00126 }