Panzer Version of the Day
Loading...
Searching...
No Matches
Panzer_PureBasis.cpp
Go to the documentation of this file.
1// @HEADER
2// ***********************************************************************
3//
4// Panzer: A partial differential equation assembly
5// engine for strongly coupled complex multiphysics systems
6// Copyright (2011) Sandia Corporation
7//
8// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9// the U.S. Government retains certain rights in this software.
10//
11// Redistribution and use in source and binary forms, with or without
12// modification, are permitted provided that the following conditions are
13// met:
14//
15// 1. Redistributions of source code must retain the above copyright
16// notice, this list of conditions and the following disclaimer.
17//
18// 2. Redistributions in binary form must reproduce the above copyright
19// notice, this list of conditions and the following disclaimer in the
20// documentation and/or other materials provided with the distribution.
21//
22// 3. Neither the name of the Corporation nor the names of the
23// contributors may be used to endorse or promote products derived from
24// this software without specific prior written permission.
25//
26// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37//
38// Questions? Contact Roger P. Pawlowski (rppawlo@sandia.gov) and
39// Eric C. Cyr (eccyr@sandia.gov)
40// ***********************************************************************
41// @HEADER
42
43#include "Panzer_PureBasis.hpp"
44#include "Panzer_Dimension.hpp"
45#include "Panzer_CellData.hpp"
48#include "Teuchos_Assert.hpp"
49#include "Phalanx_DataLayout_MDALayout.hpp"
50#include <sstream>
51
53PureBasis(const std::string & basis_type,
54 const int basis_order,
55 const int num_cells,
56 const Teuchos::RCP<const shards::CellTopology> & cell_topology) :
57 topology_(cell_topology),
58 num_cells_(num_cells)
59{
60 initialize(basis_type,basis_order);
61}
62
64PureBasis(const std::string & in_basis_type,
65 const int in_basis_order,
66 const CellData & in_cell_data) :
67 topology_(in_cell_data.getCellTopology()),
68 num_cells_(in_cell_data.numCells())
69{
70 initialize(in_basis_type,in_basis_order);
71}
72
74PureBasis(const panzer::BasisDescriptor & description,
75 const Teuchos::RCP<const shards::CellTopology> & cell_topology,
76 const int num_cells):
77 topology_(cell_topology),
78 num_cells_(num_cells)
79{
80 initialize(description.getType(), description.getOrder());
81}
82
83void panzer::PureBasis::initialize(const std::string & in_basis_type,const int in_basis_order)
84{
85 // Support for deprecated basis descriptions
86 std::string basis_type = in_basis_type;
87 int basis_order = in_basis_order;
88
89 if (basis_type=="Q1" || basis_type=="T1") {
90 basis_type = "HGrad";
91 basis_order = 1;
92 }
93 else if (basis_type == "Q2" || basis_type=="T2") {
94 basis_type = "HGrad";
95 basis_order = 2;
96 }
97 else if (basis_type == "TEdge1" || basis_type=="QEdge1") {
98 basis_type = "HCurl";
99 basis_order = 1;
100 }
101 else if(basis_type == "Const") {
102 basis_type = "Const";
103 basis_order = 0;
104 }
105 // End deprecated basis support
106
107 intrepid_basis_ = panzer::createIntrepid2Basis<PHX::Device::execution_space,double,double>(basis_type, basis_order, *topology_);
108
109 basis_type_ = basis_type;
110
111 std::ostringstream os;
112 os << basis_type_ << ":" << basis_order;
113 basis_name_ = os.str();
114
115 field_basis_name_ = "Basis: " + basis_name_;
116 field_basis_name_D1_ = "Grad Basis: " + basis_name_;
117 field_basis_name_D2_ = "D2 Basis: " + basis_name_;
118
119 if( basis_type_ == "HGrad")
120 element_space_ = HGRAD;
121 else if(basis_type_=="HCurl")
122 element_space_ = HCURL;
123 else if(basis_type_=="HDiv")
124 element_space_ = HDIV;
125 else if(basis_type_=="Const")
126 element_space_ = CONST;
127 else if(basis_type_=="HVol")
128 element_space_ = HVOL;
129 else { TEUCHOS_TEST_FOR_EXCEPTION(true,std::invalid_argument,
130 "PureBasis::initializeIntrospection - Invalid basis name \""
131 << basis_type_ << "\""); }
132
133 switch(getElementSpace()) {
134 case CONST:
135 basis_rank_ = 0;
136 break;
137 case HVOL:
138 basis_rank_ = 0;
139 break;
140 case HGRAD:
141 basis_rank_ = 0;
142 break;
143 case HCURL:
144 basis_rank_ = 1;
145 break;
146 case HDIV:
147 basis_rank_ = 1;
148 break;
149 default:
150 TEUCHOS_ASSERT(false);
151 break;
152 };
153
154 using Teuchos::rcp;
155 using PHX::MDALayout;
156
157 cell_data = rcp(new MDALayout<Cell>(numCells()));
158
159 functional = rcp(new MDALayout<Cell,BASIS>(numCells(), cardinality()));
160
161 functional_grad = rcp(new MDALayout<Cell,BASIS,Dim>(numCells(),
162 cardinality(),
163 dimension()));
164
165 coordinates = rcp(new MDALayout<Cell,BASIS,Dim>(numCells(),
166 cardinality(),
167 dimension()));
168
169 functional_D2 = rcp(new MDALayout<Cell,BASIS,Dim,Dim>(numCells(),
170 cardinality(),
171 dimension(),
172 dimension()));
173
174 local_mat_layout = Teuchos::rcp(new PHX::MDALayout<panzer::Cell, panzer::BASIS, panzer::BASIS>(
175 this->numCells(), this->cardinality(), this->cardinality()));
176
177}
178
180{
181 return intrepid_basis_->getCardinality();
182}
183
185{
186 return num_cells_;
187}
188
190{
191 return topology_->getDimension();
192}
193
194std::string panzer::PureBasis::type() const
195{
196 return basis_type_;
197}
198
200{
201 return intrepid_basis_->getDegree();
202}
203
204std::string panzer::PureBasis::name() const
205{
206 return basis_name_;
207}
208
210{
211 return field_basis_name_;
212}
213
215{
216 return field_basis_name_D1_;
217}
218
220{
221 return field_basis_name_D2_;
222}
223
224Teuchos::RCP< Intrepid2::Basis<PHX::Device::execution_space,double,double> >
226{
227 return intrepid_basis_;
228}
229
230bool
232{
233 // typedef Kokkos::DynRankView<double,PHX::Device> Array;
234 // Teuchos::RCP<const Intrepid2::DofCoordsInterface<Array> > coord_interface
235 // = Teuchos::rcp_dynamic_cast<const Intrepid2::DofCoordsInterface<Array> >(getIntrepid2Basis());
236
237 // return !Teuchos::is_null(coord_interface);
238
239 return true;
240}
int getOrder() const
Get order of basis.
const std::string & getType() const
Get type of basis.
Data for determining cell topology and dimensionality.
std::string fieldName() const
void initialize(const std::string &basis_type, const int basis_order)
Initialize the basis object.
int numCells() const
Returns the number of cells in the data layouts.
bool supportsBasisCoordinates() const
Teuchos::RCP< Intrepid2::Basis< PHX::Device::execution_space, double, double > > getIntrepid2Basis() const
std::string type() const
Returns the basis type.
std::string fieldNameD1() const
PureBasis(const std::string &basis_type, const int basis_order, const CellData &cell_data)
int cardinality() const
Returns the number of basis coefficients.
std::string name() const
A unique key that is the combination of the basis type and basis order.
int order() const
Returns the polynomial order of the basis.
int dimension() const
Returns the dimension of the basis from the topology.
std::string fieldNameD2() const