49 #ifndef __INTREPID2_DEFAULT_CUBATURE_FACTORY_DEF_HPP__
50 #define __INTREPID2_DEFAULT_CUBATURE_FACTORY_DEF_HPP__
55 template<
typename DT,
typename PT,
typename WT>
56 Teuchos::RCP<Cubature<DT,PT,WT> >
58 create(
unsigned topologyKey,
59 const std::vector<ordinal_type> °ree,
60 const EPolyType polytype,
61 const bool symmetric ) {
64 Teuchos::RCP<Cubature<DT,PT,WT> > r_val;
66 switch (topologyKey) {
67 case shards::Line<>::key: {
68 INTREPID2_TEST_FOR_EXCEPTION( degree.size() < 1, std::invalid_argument,
69 ">>> ERROR (DefaultCubatureFactory): Provided degree array is of insufficient length.");
70 if (isValidPolyType(polytype))
71 r_val = Teuchos::rcp(
new CubaturePolylib<DT,PT,WT>(degree[0], polytype));
73 r_val = Teuchos::rcp(
new CubatureDirectLineGauss<DT,PT,WT>(degree[0]));
76 case shards::Triangle<>::key: {
77 INTREPID2_TEST_FOR_EXCEPTION( degree.size() < 1, std::invalid_argument,
78 ">>> ERROR (DefaultCubatureFactory): Provided degree array is of insufficient length.");
79 if(symmetric || (degree[0] > 20)) {
80 r_val = Teuchos::rcp(
new CubatureDirectTriSymmetric<DT,PT,WT>(degree[0])); }
82 r_val = Teuchos::rcp(
new CubatureDirectTriDefault<DT,PT,WT>(degree[0]));
85 case shards::Quadrilateral<>::key:
86 case shards::ShellQuadrilateral<>::key: {
87 INTREPID2_TEST_FOR_EXCEPTION( degree.size() < 2, std::invalid_argument,
88 ">>> ERROR (DefaultCubatureFactory): Provided degree array is of insufficient length.");
89 if (isValidPolyType(polytype)) {
90 const auto x_line = CubaturePolylib<DT,PT,WT>(degree[0], polytype);
91 const auto y_line = ( degree[1] == degree[0] ? x_line : CubaturePolylib<DT,PT,WT>(degree[1], polytype) );
92 r_val = Teuchos::rcp(
new CubatureTensor<DT,PT,WT>( x_line, y_line ));
94 const auto x_line = CubatureDirectLineGauss<DT,PT,WT>(degree[0]);
95 const auto y_line = ( degree[1] == degree[0] ? x_line : CubatureDirectLineGauss<DT,PT,WT>(degree[1]) );
96 r_val = Teuchos::rcp(
new CubatureTensor<DT,PT,WT>( x_line, y_line ));
100 case shards::Tetrahedron<>::key: {
101 INTREPID2_TEST_FOR_EXCEPTION( degree.size() < 1, std::invalid_argument,
102 ">>> ERROR (DefaultCubatureFactory): Provided degree array is of insufficient length.");
104 r_val = Teuchos::rcp(
new CubatureDirectTetSymmetric<DT,PT,WT>(degree[0]));
106 r_val = Teuchos::rcp(
new CubatureDirectTetDefault<DT,PT,WT>(degree[0]));
110 case shards::Hexahedron<>::key: {
111 INTREPID2_TEST_FOR_EXCEPTION( degree.size() < 3, std::invalid_argument,
112 ">>> ERROR (DefaultCubatureFactory): Provided degree array is of insufficient length.");
113 if (isValidPolyType(polytype)) {
114 const auto x_line = CubaturePolylib<DT,PT,WT>(degree[0], polytype);
115 const auto y_line = ( degree[1] == degree[0] ? x_line : CubaturePolylib<DT,PT,WT>(degree[1], polytype) );
116 const auto z_line = ( degree[2] == degree[0] ? x_line :
117 degree[2] == degree[1] ? y_line : CubaturePolylib<DT,PT,WT>(degree[2], polytype) );
119 r_val = Teuchos::rcp(
new CubatureTensor<DT,PT,WT>( x_line, y_line, z_line ));
121 const auto x_line = CubatureDirectLineGauss<DT,PT,WT>(degree[0]);
122 const auto y_line = ( degree[1] == degree[0] ? x_line : CubatureDirectLineGauss<DT,PT,WT>(degree[1]) );
123 const auto z_line = ( degree[2] == degree[0] ? x_line :
124 degree[2] == degree[1] ? y_line : CubatureDirectLineGauss<DT,PT,WT>(degree[2]) );
126 r_val = Teuchos::rcp(
new CubatureTensor<DT,PT,WT>( x_line, y_line, z_line ));
130 case shards::Wedge<>::key: {
131 INTREPID2_TEST_FOR_EXCEPTION( degree.size() < 2, std::invalid_argument,
132 ">>> ERROR (DefaultCubatureFactory): Provided degree array is of insufficient length.")
134 if(symmetric || (degree[0] > 20)) {
135 const auto xy_tri = CubatureDirectTriSymmetric<DT,PT,WT>(degree[0]);
136 const auto z_line = CubatureDirectLineGauss<DT,PT,WT>(degree[1]);
137 r_val = Teuchos::rcp(
new CubatureTensor<DT,PT,WT>( xy_tri, z_line ));
140 const auto xy_tri = CubatureDirectTriDefault<DT,PT,WT>(degree[0]);
141 const auto z_line = CubatureDirectLineGauss<DT,PT,WT>(degree[1]);
142 r_val = Teuchos::rcp(
new CubatureTensor<DT,PT,WT>( xy_tri, z_line ));
147 case shards::Pyramid<>::key: {
148 INTREPID2_TEST_FOR_EXCEPTION( degree.size() < 1, std::invalid_argument,
149 ">>> ERROR (DefaultCubatureFactory): Provided degree array is of insufficient length.");
153 const auto xy_line = CubatureDirectLineGauss<DT,PT,WT>(degree[0]);
154 const auto z_line = CubatureDirectLineGaussJacobi20<DT,PT,WT>(degree[0]);
155 r_val = Teuchos::rcp(
new CubatureTensorPyr<DT,PT,WT>( xy_line, xy_line, z_line ));
160 INTREPID2_TEST_FOR_EXCEPTION( ( (topologyKey != shards::Line<>::key) &&
161 (topologyKey != shards::Triangle<>::key) &&
162 (topologyKey != shards::Quadrilateral<>::key) &&
163 (topologyKey != shards::ShellQuadrilateral<>::key) &&
164 (topologyKey != shards::Tetrahedron<>::key) &&
165 (topologyKey != shards::Hexahedron<>::key) &&
166 (topologyKey != shards::Pyramid<>::key) &&
167 (topologyKey != shards::Wedge<>::key) ),
168 std::invalid_argument,
169 ">>> ERROR (DefaultCubatureFactory): Invalid cell topology prevents cubature creation.");
175 template<
typename DT,
typename PT,
typename WT>
176 Teuchos::RCP<Cubature<DT,PT,WT> >
178 create(
const shards::CellTopology cellTopology,
179 const std::vector<ordinal_type> °ree,
180 const EPolyType polytype,
181 const bool symmetric ) {
182 return create<DT,PT,WT>(cellTopology.getBaseKey(), degree, polytype, symmetric);
186 template<
typename DT,
typename PT,
typename WT>
187 Teuchos::RCP<Cubature<DT,PT,WT> >
189 create(
unsigned topologyKey,
190 const ordinal_type degree,
191 const EPolyType polytype,
192 const bool symmetric ) {
194 const std::vector<ordinal_type> degreeArray(3, degree);
195 return create<DT,PT,WT>(topologyKey, degreeArray, polytype, symmetric);
198 template<
typename DT,
typename PT,
typename WT>
199 Teuchos::RCP<Cubature<DT,PT,WT> >
201 create(
const shards::CellTopology cellTopology,
202 const ordinal_type degree,
203 const EPolyType polytype,
204 const bool symmetric ) {
206 const std::vector<ordinal_type> degreeArray(3, degree);
207 return create<DT,PT,WT>(cellTopology.getBaseKey(), degreeArray, polytype, symmetric);
static Teuchos::RCP< Cubature< DeviceType, pointValueType, weightValueType > > create(unsigned topologyKey, const std::vector< ordinal_type > °ree, const EPolyType polytype=POLYTYPE_MAX, const bool symmetric=false)
Factory method.