Intrepid2
Intrepid2_DerivedBasis_HGRAD_WEDGE.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 
51 #ifndef Intrepid2_DerivedBasis_HGRAD_WEDGE_h
52 #define Intrepid2_DerivedBasis_HGRAD_WEDGE_h
53 
56 
57 namespace Intrepid2
58 {
59  template<class HGRAD_TRI, class HGRAD_LINE>
61  : public Basis_TensorBasis<typename HGRAD_LINE::BasisBase>
62  {
63  protected:
64  std::string name_;
65  ordinal_type order_xy_, order_z_;
66  EPointType pointType_;
67  public:
68  using ExecutionSpace = typename HGRAD_LINE::ExecutionSpace;
69  using OutputValueType = typename HGRAD_LINE::OutputValueType;
70  using PointValueType = typename HGRAD_LINE::PointValueType;
71 
72  using OutputViewType = typename HGRAD_LINE::OutputViewType;
73  using PointViewType = typename HGRAD_LINE::PointViewType ;
74  using ScalarViewType = typename HGRAD_LINE::ScalarViewType;
75 
76  using BasisBase = typename HGRAD_LINE::BasisBase;
77  using TriBasis = HGRAD_TRI;
78  using LineBasis = HGRAD_LINE;
80 
86  Basis_Derived_HGRAD_WEDGE(int polyOrder_xy, int polyOrder_z, const EPointType pointType=POINTTYPE_DEFAULT)
87  :
88  TensorBasis(Teuchos::rcp( new TriBasis(polyOrder_xy, pointType)),
89  Teuchos::rcp( new LineBasis(polyOrder_z, pointType)))
90  {
91  this->functionSpace_ = FUNCTION_SPACE_HGRAD;
92 
93  std::ostringstream basisName;
94  basisName << "HGRAD_WEDGE (" << this->TensorBasis::getName() << ")";
95  name_ = basisName.str();
96 
97  order_xy_= polyOrder_xy;
98  order_z_ = polyOrder_z;
99  pointType_ = pointType;
100 
101  this->setShardsTopologyAndTags();
102  }
103 
108  Basis_Derived_HGRAD_WEDGE(int polyOrder, const EPointType pointType=POINTTYPE_DEFAULT) : Basis_Derived_HGRAD_WEDGE(polyOrder,polyOrder,pointType) {}
109 
110 
113  virtual bool requireOrientation() const override {
114  return (this->getDofCount(1,0) > 1); //if it has more than 1 DOF per edge, than it needs orientations
115  }
116 
117  using BasisBase::getValues;
118 
123  virtual
124  const char*
125  getName() const override {
126  return name_.c_str();
127  }
128 
138  Teuchos::RCP<BasisBase>
139  getSubCellRefBasis(const ordinal_type subCellDim, const ordinal_type subCellOrd) const override
140  {
141  if(subCellDim == 1) {
142  if(subCellOrd < 6) //edges associated to basal and upper triagular faces
143  return Teuchos::rcp( new LineBasis(order_xy_, pointType_) );
144  else
145  return Teuchos::rcp( new LineBasis(order_z_, pointType_) );
146  }
147  else if(subCellDim == 2) {
148  switch(subCellOrd) {
149  case 0:
150  return Teuchos::rcp( new Intrepid2::Basis_Derived_HGRAD_QUAD<LineBasis>(order_xy_, order_z_, pointType_) );
151  case 1:
152  return Teuchos::rcp( new Intrepid2::Basis_Derived_HGRAD_QUAD<LineBasis>(order_xy_, order_z_, pointType_) );
153  case 2:
154  return Teuchos::rcp( new Intrepid2::Basis_Derived_HGRAD_QUAD<LineBasis>(order_z_, order_xy_, pointType_) );
155  case 3:
156  return Teuchos::rcp( new TriBasis(order_xy_, pointType_) );
157  case 4:
158  return Teuchos::rcp( new TriBasis(order_xy_, pointType_) );
159  default:
160  INTREPID2_TEST_FOR_EXCEPTION(true,std::invalid_argument,"subCellOrd is out of bounds");
161  }
162  }
163  INTREPID2_TEST_FOR_EXCEPTION(true,std::invalid_argument,"subCellDim is out of bounds");
164  }
165 
170  virtual HostBasisPtr<OutputValueType, PointValueType>
171  getHostBasis() const override {
173 
174  auto hostBasis = Teuchos::rcp(new HostBasis(order_xy_, order_z_, pointType_));
175 
176  return hostBasis;
177  }
178  };
179 } // end namespace Intrepid2
180 
181 #endif /* Intrepid2_DerivedBasis_HGRAD_WEDGE_h */
Basis_Derived_HGRAD_WEDGE(int polyOrder_xy, int polyOrder_z, const EPointType pointType=POINTTYPE_DEFAULT)
Constructor.
Implementation of bases that are tensor products of two or three component bases. ...
Basis_Derived_HGRAD_WEDGE(int polyOrder, const EPointType pointType=POINTTYPE_DEFAULT)
Constructor.
virtual const char * getName() const override
Returns basis name.
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.
Teuchos::RCP< BasisBase > getSubCellRefBasis(const ordinal_type subCellDim, const ordinal_type subCellOrd) const override
returns the basis associated to a subCell.
virtual HostBasisPtr< OutputValueType, PointValueType > getHostBasis() const override
Creates and returns a Basis object whose DeviceType template argument is Kokkos::HostSpace::device_ty...
Basis defined as the tensor product of two component bases.