Intrepid2
Intrepid2_DerivedBasis_HGRAD_HEX.hpp
Go to the documentation of this file.
1 // @HEADER
2 // ************************************************************************
3 //
4 // Intrepid2 Package
5 // Copyright (2007) Sandia Corporation
6 //
7 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8 // license for use of this work by or on behalf of the U.S. Government.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact Kyungjoo Kim (kyukim@sandia.gov),
38 // Mauro Perego (mperego@sandia.gov), or
39 // Nate Roberts (nvrober@sandia.gov)
40 //
41 // ************************************************************************
42 // @HEADER
43 
57 #ifndef Intrepid2_DerivedBasis_HGRAD_HEX_h
58 #define Intrepid2_DerivedBasis_HGRAD_HEX_h
59 
61 
63 
64 namespace Intrepid2
65 {
66  // TODO: make this a subclass of TensorBasis3 instead, following what we've done for H(curl) and H(div)
67  template<class HGRAD_LINE>
69  : public Basis_TensorBasis<typename HGRAD_LINE::BasisBase>
70  {
71  public:
72  using ExecutionSpace = typename HGRAD_LINE::ExecutionSpace;
73  using OutputValueType = typename HGRAD_LINE::OutputValueType;
74  using PointValueType = typename HGRAD_LINE::PointValueType;
75 
76  using OutputViewType = typename HGRAD_LINE::OutputViewType;
77  using PointViewType = typename HGRAD_LINE::PointViewType ;
78  using ScalarViewType = typename HGRAD_LINE::ScalarViewType;
79 
80  using LineBasis = HGRAD_LINE;
82  using BasisBase = typename HGRAD_LINE::BasisBase;
84 
85  std::string name_;
86  ordinal_type order_x_;
87  ordinal_type order_y_;
88  ordinal_type order_z_;
89  EPointType pointType_;
90 
97  Basis_Derived_HGRAD_HEX(int polyOrder_x, int polyOrder_y, int polyOrder_z, const EPointType pointType=POINTTYPE_DEFAULT)
98  :
99  TensorBasis(Teuchos::rcp( new QuadBasis(polyOrder_x,polyOrder_y, pointType)),
100  Teuchos::rcp( new LineBasis(polyOrder_z, pointType)))
101  {
102  this->functionSpace_ = FUNCTION_SPACE_HGRAD;
103 
104  std::ostringstream basisName;
105  basisName << "HGRAD_HEX (" << this->TensorBasis::getName() << ")";
106  name_ = basisName.str();
107 
108  order_x_ = polyOrder_x;
109  order_y_ = polyOrder_y;
110  order_z_ = polyOrder_z;
111  pointType_ = pointType;
112 
113  this->setShardsTopologyAndTags();
114  }
115 
116 
121  Basis_Derived_HGRAD_HEX(int polyOrder, const EPointType pointType=POINTTYPE_DEFAULT) :
122  Basis_Derived_HGRAD_HEX(polyOrder, polyOrder, polyOrder, pointType) {}
123 
124 
127  virtual bool requireOrientation() const override {
128  return (this->getDofCount(1,0) > 1); //if it has more than 1 DOF per edge, then it needs orientations
129  }
130 
131  using BasisBase::getValues;
132 
137  virtual
138  const char*
139  getName() const override {
140  return name_.c_str();
141  }
142 
152  Teuchos::RCP<BasisBase>
153  getSubCellRefBasis(const ordinal_type subCellDim, const ordinal_type subCellOrd) const override{
154  if(subCellDim == 1) {
155  switch(subCellOrd) {
156  case 0:
157  case 2:
158  case 4:
159  case 6:
160  return Teuchos::rcp( new LineBasis(order_x_, pointType_) );
161  case 1:
162  case 3:
163  case 5:
164  case 7:
165  return Teuchos::rcp( new LineBasis(order_y_, pointType_) );
166  case 8:
167  case 9:
168  case 10:
169  case 11:
170  return Teuchos::rcp( new LineBasis(order_z_, pointType_) );
171  }
172  } else if(subCellDim == 2) {
173  switch(subCellOrd) {
174  case 0:
175  return Teuchos::rcp( new QuadBasis(order_x_, order_z_, pointType_) );
176  case 1:
177  return Teuchos::rcp( new QuadBasis(order_y_,order_z_, pointType_) );
178  case 2:
179  return Teuchos::rcp( new QuadBasis(order_x_, order_z_, pointType_) );
180  case 3:
181  return Teuchos::rcp( new QuadBasis(order_z_, order_y_, pointType_) );
182  case 4:
183  return Teuchos::rcp( new QuadBasis(order_y_, order_x_, pointType_) );
184  case 5:
185  return Teuchos::rcp( new QuadBasis(order_x_, order_y_, pointType_) );
186  }
187  }
188 
189  INTREPID2_TEST_FOR_EXCEPTION(true,std::invalid_argument,"Input parameters out of bounds");
190  }
191 
197  getHostBasis() const override {
199 
200  auto hostBasis = Teuchos::rcp(new HostBasis(order_x_, order_y_, order_z_, pointType_));
201 
202  return hostBasis;
203  }
204  };
205 } // end namespace Intrepid2
206 
207 #endif /* Intrepid2_DerivedBasis_HGRAD_HEX_h */
Implementation of bases that are tensor products of two or three component bases. ...
Teuchos::RCP< BasisBase > getSubCellRefBasis(const ordinal_type subCellDim, const ordinal_type subCellOrd) const override
returns the basis associated to a subCell.
BasisPtr< typename Kokkos::HostSpace::device_type, OutputType, PointType > HostBasisPtr
Pointer to a Basis whose device type is on the host (Kokkos::HostSpace::device_type), allowing host access to input and output views, and ensuring host execution of basis evaluation.
Implementation of H(grad) basis on the quadrilateral that is templated on H(grad) on the line...
virtual bool requireOrientation() const override
True if orientation is required.
virtual const char * getName() const override
Returns basis name.
EPointType
Enumeration of types of point distributions in Intrepid.
virtual const char * getName() const override
Returns basis name.
Basis_Derived_HGRAD_HEX(int polyOrder, const EPointType pointType=POINTTYPE_DEFAULT)
Constructor.
Basis defined as the tensor product of two component bases.
virtual HostBasisPtr< OutputValueType, PointValueType > getHostBasis() const override
Creates and returns a Basis object whose DeviceType template argument is Kokkos::HostSpace::device_ty...
Basis_Derived_HGRAD_HEX(int polyOrder_x, int polyOrder_y, int polyOrder_z, const EPointType pointType=POINTTYPE_DEFAULT)
Constructor.