54 const shards::CellTopology & cellTopology,
55 const std::vector<int> & degree) {
58 Teuchos::RCP<Cubature<Scalar,ArrayPoint,ArrayWeight> > pickCubature;
60 switch (cellTopology.getBaseCellTopologyData()->key) {
62 case shards::Line<>::key:
63 TEUCHOS_TEST_FOR_EXCEPTION( (degree.size() < 1), std::invalid_argument,
64 ">>> ERROR (DefaultCubatureFactory): Provided degree array is of insufficient length.");
65 pickCubature = Teuchos::rcp(
new CubatureDirectLineGauss<Scalar,ArrayPoint,ArrayWeight>(degree[0]));
68 case shards::Triangle<>::key:
69 TEUCHOS_TEST_FOR_EXCEPTION( (degree.size() < 1), std::invalid_argument,
70 ">>> ERROR (DefaultCubatureFactory): Provided degree array is of insufficient length.");
71 pickCubature = Teuchos::rcp(
new CubatureDirectTriDefault<Scalar,ArrayPoint,ArrayWeight>(degree[0]));
74 case shards::Quadrilateral<>::key:
75 TEUCHOS_TEST_FOR_EXCEPTION( (degree.size() < 2), std::invalid_argument,
76 ">>> ERROR (DefaultCubatureFactory): Provided degree array is of insufficient length.");
78 std::vector< Teuchos::RCP< Cubature<Scalar,ArrayPoint,ArrayWeight> > > lineCubs(2);
79 lineCubs[0] = Teuchos::rcp(
new CubatureDirectLineGauss<Scalar,ArrayPoint,ArrayWeight>(degree[0]));
80 lineCubs[1] = Teuchos::rcp(
new CubatureDirectLineGauss<Scalar,ArrayPoint,ArrayWeight>(degree[1]));
81 pickCubature = Teuchos::rcp(
new CubatureTensor<Scalar,ArrayPoint,ArrayWeight>(lineCubs));
85 case shards::Tetrahedron<>::key:
86 if (cellTopology.getCellTopologyData()->key == shards::Tetrahedron<11>::key)
88 TEUCHOS_TEST_FOR_EXCEPTION( (degree.size() < 1), std::invalid_argument,
89 ">>> ERROR (DefaultCubatureFactory): Provided degree array is of insufficient length.");
91 pickCubature = Teuchos::rcp(
new CubatureDirectTetDefault<Scalar,ArrayPoint,ArrayWeight>(degree[0]));
95 TEUCHOS_TEST_FOR_EXCEPTION( (degree.size() < 1), std::invalid_argument,
96 ">>> ERROR (DefaultCubatureFactory): Provided degree array is of insufficient length.");
97 pickCubature = Teuchos::rcp(
new CubatureDirectTetDefault<Scalar,ArrayPoint,ArrayWeight>(degree[0]));
100 case shards::Hexahedron<>::key:
101 TEUCHOS_TEST_FOR_EXCEPTION( (degree.size() < 3), std::invalid_argument,
102 ">>> ERROR (DefaultCubatureFactory): Provided degree array is of insufficient length.");
104 std::vector< Teuchos::RCP< Cubature<Scalar,ArrayPoint,ArrayWeight> > > lineCubs(3);
105 lineCubs[0] = Teuchos::rcp(
new CubatureDirectLineGauss<Scalar,ArrayPoint,ArrayWeight>(degree[0]));
106 lineCubs[1] = Teuchos::rcp(
new CubatureDirectLineGauss<Scalar,ArrayPoint,ArrayWeight>(degree[1]));
107 lineCubs[2] = Teuchos::rcp(
new CubatureDirectLineGauss<Scalar,ArrayPoint,ArrayWeight>(degree[2]));
108 pickCubature = Teuchos::rcp(
new CubatureTensor<Scalar,ArrayPoint,ArrayWeight>(lineCubs));
112 case shards::Wedge<>::key:
113 TEUCHOS_TEST_FOR_EXCEPTION( (degree.size() < 2), std::invalid_argument,
114 ">>> ERROR (DefaultCubatureFactory): Provided degree array is of insufficient length.")
116 std::vector< Teuchos::RCP< Cubature<Scalar,ArrayPoint,ArrayWeight> > > miscCubs(2);
117 miscCubs[0] = Teuchos::rcp(
new CubatureDirectTriDefault<Scalar,ArrayPoint,ArrayWeight>(degree[0]));
118 miscCubs[1] = Teuchos::rcp(
new CubatureDirectLineGauss<Scalar,ArrayPoint,ArrayWeight>(degree[1]));
119 pickCubature = Teuchos::rcp(
new CubatureTensor<Scalar,ArrayPoint,ArrayWeight>(miscCubs));
123 case shards::Pyramid<>::key:
124 TEUCHOS_TEST_FOR_EXCEPTION( (degree.size() < 3), std::invalid_argument,
125 ">>> ERROR (DefaultCubatureFactory): Provided degree array is of insufficient length.");
127 std::vector< Teuchos::RCP< Cubature<Scalar,ArrayPoint,ArrayWeight> > > lineCubs(3);
128 lineCubs[0] = Teuchos::rcp(
new CubatureDirectLineGauss<Scalar,ArrayPoint,ArrayWeight>(degree[0]));
129 lineCubs[1] = Teuchos::rcp(
new CubatureDirectLineGauss<Scalar,ArrayPoint,ArrayWeight>(degree[1]));
130 lineCubs[2] = Teuchos::rcp(
new CubatureDirectLineGaussJacobi20<Scalar,ArrayPoint,ArrayWeight>(degree[2]));
131 pickCubature = Teuchos::rcp(
new CubatureTensorPyr<Scalar,ArrayPoint,ArrayWeight>(lineCubs));
136 TEUCHOS_TEST_FOR_EXCEPTION( ( (cellTopology.getBaseCellTopologyData()->key != shards::Line<>::key) &&
137 (cellTopology.getBaseCellTopologyData()->key != shards::Triangle<>::key) &&
138 (cellTopology.getBaseCellTopologyData()->key != shards::Quadrilateral<>::key) &&
139 (cellTopology.getBaseCellTopologyData()->key != shards::Tetrahedron<>::key) &&
140 (cellTopology.getBaseCellTopologyData()->key != shards::Hexahedron<>::key) &&
141 (cellTopology.getBaseCellTopologyData()->key != shards::Pyramid<>::key) &&
142 (cellTopology.getBaseCellTopologyData()->key != shards::Wedge<>::key) ),
143 std::invalid_argument,
144 ">>> ERROR (DefaultCubatureFactory): Invalid cell topology prevents cubature creation.");