Intrepid2
Intrepid2_LagrangianInterpolationDef.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), or
38 // Mauro Perego (mperego@sandia.gov)
39 //
40 // ************************************************************************
41 // @HEADER
42 
48 #ifndef __INTREPID2_LAGRANGIANINTERPOLATIONDEF_HPP__
49 #define __INTREPID2_LAGRANGIANINTERPOLATIONDEF_HPP__
50 
52 #include "Intrepid2_ArrayTools.hpp"
54 
55 
56 namespace Intrepid2 {
57 namespace Experimental {
58 
59 template<typename SpT>
60 template<typename BasisType,
61 class ...coordsProperties, class ...coeffsProperties,
62 typename ortValueType, class ...ortProperties>
63 void
65  Kokkos::DynRankView<typename BasisType::scalarType, coordsProperties...> dofCoords,
66  Kokkos::DynRankView<typename BasisType::scalarType, coeffsProperties...> dofCoeffs,
67  const BasisType* basis,
68  EPointType pointType,
69  const Kokkos::DynRankView<ortValueType, ortProperties...> orts) {
70 
71  typedef typename BasisType::scalarType scalarType;
72  typedef Kokkos::DynRankView<scalarType, SpT> scalarViewType;
73  typedef Kokkos::DynRankView<ordinal_type, SpT> intViewType;
74 
75  const auto topo = basis->getBaseCellTopology();
76  const std::string name(basis->getName());
77  const ordinal_type degree(basis->getDegree());
78 
79  bool isBasisHCURL = name.find("HCURL") != std::string::npos;
80  bool isBasisHDIV = name.find("HDIV") != std::string::npos;
81  bool isBasisTriOrTet = (name.find("TRI") != std::string::npos) || (name.find("TET") != std::string::npos);
82  bool isBasisHEXI1 = (name.find("HEX_I1") != std::string::npos);
83  bool isBasisTETI1 = (name.find("TET_I1") != std::string::npos);
84  bool isBasisI1 = (name.find("I1") != std::string::npos);
85 
86  ordinal_type numEdges = (basis->getDofCount(1, 0) > 0) ? topo.getEdgeCount() : 0;
87  ordinal_type numFaces = (basis->getDofCount(2, 0) > 0) ? topo.getFaceCount() : 0;
88 
89  Teuchos::RCP<Basis<SpT,scalarType,scalarType> > faceBases[6];
90  Teuchos::RCP<Basis<SpT,scalarType,scalarType> > edgeBasis;
91 
92 
93  if ((name == "Intrepid2_HGRAD_QUAD_Cn_FEM") || (name == "Intrepid2_HGRAD_QUAD_C1_FEM")) {
94  edgeBasis = Teuchos::rcp(new Basis_HGRAD_LINE_Cn_FEM<SpT,scalarType,scalarType>(degree, pointType) );
95  } else if ((name == "Intrepid2_HGRAD_HEX_Cn_FEM") || (name == "Intrepid2_HGRAD_HEX_C1_FEM")){
96  edgeBasis = Teuchos::rcp(new Basis_HGRAD_LINE_Cn_FEM<SpT,scalarType,scalarType>(degree, pointType) );
97  faceBases[0] = Teuchos::rcp(new Basis_HGRAD_QUAD_Cn_FEM<SpT,scalarType,scalarType>(degree, pointType) );
98  for(ordinal_type i=1; i<6; ++i) faceBases[i]=faceBases[0];
99  } else if ((name == "Intrepid2_HGRAD_TRI_Cn_FEM") || (name == "Intrepid2_HGRAD_TRI_C1_FEM")) {
100  edgeBasis = Teuchos::rcp(new Basis_HGRAD_LINE_Cn_FEM<SpT,scalarType,scalarType>(degree, pointType) );
101  } else if ((name == "Intrepid2_HGRAD_TET_Cn_FEM") || (name == "Intrepid2_HGRAD_TET_C1_FEM")) {
102  edgeBasis = Teuchos::rcp(new Basis_HGRAD_LINE_Cn_FEM<SpT,scalarType,scalarType>(degree, pointType) );
103  faceBases[0] = Teuchos::rcp(new Basis_HGRAD_TRI_Cn_FEM<SpT,scalarType,scalarType>(degree, pointType) );
104  for(ordinal_type i=1; i<4; ++i) faceBases[i]=faceBases[0];
105  } else if ((name == "Intrepid2_HCURL_QUAD_In_FEM") || (name == "Intrepid2_HCURL_QUAD_I1_FEM")) {
106  edgeBasis = Teuchos::rcp(new Basis_HGRAD_LINE_Cn_FEM<SpT,scalarType,scalarType>(degree-1, POINTTYPE_GAUSS) );
107  } else if ((name == "Intrepid2_HCURL_HEX_In_FEM") || (name == "Intrepid2_HCURL_HEX_I1_FEM")) {
108  edgeBasis = Teuchos::rcp(new Basis_HGRAD_LINE_Cn_FEM<SpT,scalarType,scalarType>(degree-1, POINTTYPE_GAUSS) );
109  faceBases[0] = Teuchos::rcp(new Basis_HCURL_QUAD_In_FEM<SpT,scalarType,scalarType>(degree, pointType) );
110  for(ordinal_type i=1; i<6; ++i) faceBases[i]=faceBases[0];
111  } else if ((name == "Intrepid2_HCURL_TRI_In_FEM") || (name == "Intrepid2_HCURL_TRI_I1_FEM")) {
112  edgeBasis = Teuchos::rcp(new Basis_HVOL_LINE_Cn_FEM<SpT,scalarType,scalarType>(degree-1, pointType) );
113  } else if ((name == "Intrepid2_HCURL_TET_In_FEM") || (name == "Intrepid2_HCURL_TET_I1_FEM")) {
114  edgeBasis = Teuchos::rcp(new Basis_HVOL_LINE_Cn_FEM<SpT,scalarType,scalarType>(degree-1, pointType) );
115  faceBases[0] = Teuchos::rcp(new Basis_HCURL_TRI_In_FEM<SpT,scalarType,scalarType>(degree, pointType) );
116  for(ordinal_type i=1; i<4; ++i) faceBases[i]=faceBases[0];
117  } else if ((name == "Intrepid2_HDIV_QUAD_In_FEM") || (name == "Intrepid2_HDIV_QUAD_I1_FEM")) {
118  edgeBasis = Teuchos::rcp(new Basis_HGRAD_LINE_Cn_FEM<SpT,scalarType,scalarType>(degree-1, POINTTYPE_GAUSS) );
119  } else if ((name == "Intrepid2_HDIV_HEX_In_FEM") || (name == "Intrepid2_HDIV_HEX_I1_FEM")) {
120  edgeBasis = Teuchos::null;
121  faceBases[0] = Teuchos::rcp(new Basis_HGRAD_QUAD_Cn_FEM<SpT,scalarType,scalarType>(degree-1, POINTTYPE_GAUSS) );
122  for(ordinal_type i=1; i<6; ++i) faceBases[i]=faceBases[0];
123  } else if ((name == "Intrepid2_HDIV_TRI_In_FEM") || (name == "Intrepid2_HDIV_TRI_I1_FEM")) {
124  edgeBasis = Teuchos::rcp(new Basis_HVOL_LINE_Cn_FEM<SpT,scalarType,scalarType>(degree-1, pointType) );
125  } else if ((name == "Intrepid2_HDIV_TET_In_FEM") || (name == "Intrepid2_HDIV_TET_I1_FEM")) {
126  edgeBasis = Teuchos::null;
127  faceBases[0] = Teuchos::rcp(new Basis_HVOL_TRI_Cn_FEM<SpT,scalarType,scalarType>(degree-1, pointType) );
128  for(ordinal_type i=1; i<4; ++i) faceBases[i]=faceBases[0];
129  } else { //HVOL element does not have any face or edge DOFs
130  //Throw error when basis is not HVOL.
131  INTREPID2_TEST_FOR_ABORT(name.find("HVOL") == std::string::npos,
132  ">>> ERROR (Intrepid2::Experimental::LagrangianInterpolation<SpT>::getDofCoordsAndCoeffs): " \
133  "method not implemented for this basis function");
134  }
135 
136 
137  auto ordinalToTag = basis->getAllDofTags();
138  auto tagToOrdinal = basis->getAllDofOrdinal();
139 
140  const ordinal_type dim = basis->getBaseCellTopology().getDimension();
141 
142  const ordinal_type numCells = dofCoeffs.extent(0);
143 
144  intViewType eOrt("eOrt", numEdges);
145  intViewType fOrt("fOrt", numFaces);
146  scalarViewType refEdgeTan("refEdgeTan", dim);
147  scalarViewType refFaceTangents("refFaceTangents", dim, 2);
148  auto refFaceTanU = Kokkos::subview(refFaceTangents, Kokkos::ALL, 0);
149  auto refFaceTanV = Kokkos::subview(refFaceTangents, Kokkos::ALL, 1);
150  scalarViewType refNormal("refNormal", dim);
151 
152 
153  scalarViewType refDofCoords("refDofCoords", dofCoords.extent(1), dofCoords.extent(2)), refDofCoeffs;
154  basis->getDofCoords(refDofCoords);
155  RealSpaceTools<SpT>::clone(dofCoords,refDofCoords);
156 
157  if(dofCoeffs.rank() == 3) //vector basis
158  refDofCoeffs = scalarViewType("refDofCoeffs", dofCoeffs.extent(1), dofCoeffs.extent(2));
159  else //scalar basis
160  refDofCoeffs = scalarViewType("refDofCoeffs",dofCoeffs.extent(1));
161  basis->getDofCoeffs(refDofCoeffs);
162  RealSpaceTools<SpT>::clone(dofCoeffs,refDofCoeffs);
163 
164 
165  //compute DofCoords Oriented
166  for (ordinal_type iedge=0; iedge < numEdges; ++iedge) {
167  scalarViewType ortJacobian("ortJacobian", 1, 1);
168  ordinal_type edgeBasisCardinality = edgeBasis->getCardinality();
169  ordinal_type numInternalDofs = edgeBasis->getDofCount(1,0);
170  scalarViewType edgeDofCoords("edgeDofCoords", edgeBasisCardinality, 1);
171  scalarViewType edgeInternalDofCoords("edgeInternalDofCoords", numInternalDofs, 1);
172  edgeBasis->getDofCoords(edgeDofCoords);
173  for(ordinal_type i=0; i<numInternalDofs; ++i)
174  edgeInternalDofCoords(i,0) = edgeDofCoords(edgeBasis->getDofOrdinal(1, 0, i),0);
175 
176  scalarViewType edgeInternalDofCoordsOriented("edgeInternalDofCoordsOriented", numInternalDofs, 1);
177  scalarViewType edgeDofCoordsOriented3d("edgeDofCoordsOriented3d", numInternalDofs, dim);
178  // auto numEdgeDOFs = basis->getDofCount(1,iedge);
179  for(ordinal_type i=0; i<numCells; ++i) {
180  orts(i).getEdgeOrientation(eOrt.data(), numEdges);
181  Impl::OrientationTools::mapToModifiedReference(edgeInternalDofCoordsOriented,edgeInternalDofCoords,edgeBasis->getBaseCellTopology(),eOrt(iedge));
182  CellTools<SpT>::mapToReferenceSubcell(edgeDofCoordsOriented3d, edgeInternalDofCoordsOriented, 1, iedge, topo);
183 
184  for(ordinal_type j=0; j<numInternalDofs; ++j) {
185  auto idof = basis->getDofOrdinal(1, iedge, j);
186  for(ordinal_type d=0; d <dim; ++d)
187  dofCoords(i,idof,d) = edgeDofCoordsOriented3d(j,d);
188  }
189  }
190 
191  //depending on how the reference basis is defined, the edges are scaled differently
192  auto edgeScale = (isBasisTriOrTet||isBasisI1) ? 2.0 :1.0;
193  if(isBasisHCURL) {
194 
195  scalarViewType edgeDofCoeffs("edgeDofCoeffs", edgeBasisCardinality);
196  edgeBasis->getDofCoeffs(edgeDofCoeffs);
197  CellTools<SpT>::getReferenceEdgeTangent(refEdgeTan, iedge, topo);
198  for(ordinal_type i=0; i<numCells; ++i) {
199  orts(i).getEdgeOrientation(eOrt.data(), numEdges);
200  Impl::OrientationTools::getJacobianOfOrientationMap(ortJacobian, edgeBasis->getBaseCellTopology(), eOrt(iedge));
201  for(ordinal_type j=0; j<numInternalDofs; ++j) {
202  auto idof = basis->getDofOrdinal(1, iedge, j);
203  auto jdof = edgeBasis->getDofOrdinal(1, 0, j);
204  for(ordinal_type d=0; d <dim; ++d) {
205  dofCoeffs(i,idof,d) = 0;
206  for(ordinal_type k=0; k <1; ++k)
207  for(ordinal_type l=0; l <1; ++l)
208  dofCoeffs(i,idof,d) += refEdgeTan(d)*ortJacobian(0,0)*edgeDofCoeffs(jdof)*edgeScale;
209  }
210  }
211  }
212  } else if(isBasisHDIV) {
213  CellTools<SpT>::getReferenceSideNormal(refNormal, iedge, topo);
214  scalarViewType edgeDofCoeffs("edgeDofCoeffs", edgeBasisCardinality);
215  edgeBasis->getDofCoeffs(edgeDofCoeffs);
216  for(ordinal_type i=0; i<numCells; ++i) {
217  orts(i).getEdgeOrientation(eOrt.data(), numEdges);
218  Impl::OrientationTools::getJacobianOfOrientationMap(ortJacobian, edgeBasis->getBaseCellTopology(), eOrt(iedge));
219  auto ortJacobianDet = ortJacobian(0,0);
220  for(ordinal_type j=0; j<numInternalDofs; ++j) {
221  auto idof = basis->getDofOrdinal(1, iedge, j);
222  auto jdof = edgeBasis->getDofOrdinal(1, 0, j);
223  for(ordinal_type d=0; d <dim; ++d)
224  dofCoeffs(i,idof,d) = refNormal(d)*ortJacobianDet*edgeDofCoeffs(jdof)*edgeScale;
225  }
226  }
227  } else {
228  scalarViewType edgeDofCoeffs("edgeDofCoeffs", edgeBasisCardinality);
229  edgeBasis->getDofCoeffs(edgeDofCoeffs);
230  for(ordinal_type i=0; i<numCells; ++i) {
231  for(ordinal_type j=0; j<numInternalDofs; ++j) {
232  auto idof = basis->getDofOrdinal(1, iedge, j);
233  auto jdof = edgeBasis->getDofOrdinal(1, 0, j);
234  dofCoeffs(i,idof,0) = edgeDofCoeffs(jdof);
235  }
236  }
237  }
238  }
239 
240  for (ordinal_type iface=0; iface < numFaces; ++iface) {
241  scalarViewType ortJacobian("ortJacobian", 2, 2);
242  auto faceBasis = faceBases[iface];
243  ordinal_type faceBasisCardinality = faceBasis->getCardinality();
244  ordinal_type numInternalDofs = faceBasis->getDofCount(2,0);
245  scalarViewType faceDofCoords("faceDofCoords", faceBasisCardinality, 2);
246  scalarViewType faceInternalDofCoords("faceInternalDofCoords", numInternalDofs, 2);
247  faceBasis->getDofCoords(faceDofCoords);
248  for(ordinal_type i=0; i<numInternalDofs; ++i)
249  for(ordinal_type d=0; d <2; ++d)
250  faceInternalDofCoords(i,d) = faceDofCoords(faceBasis->getDofOrdinal(2, 0, i),d);
251 
252  scalarViewType faceInternalDofCoordsOriented("faceInternalDofCoordsOriented", numInternalDofs, 2);
253  scalarViewType faceDofCoordsOriented3d("faceDofCoordsOriented3d", numInternalDofs, dim);
254  for(ordinal_type i=0; i<numCells; ++i) {
255  orts(i).getFaceOrientation(fOrt.data(), numFaces);
256  ordinal_type ort = fOrt(iface);
257  Impl::OrientationTools::mapToModifiedReference(faceInternalDofCoordsOriented,faceInternalDofCoords,faceBasis->getBaseCellTopology(),ort);
258  CellTools<SpT>::mapToReferenceSubcell(faceDofCoordsOriented3d, faceInternalDofCoordsOriented, 2, iface, topo);
259 
260  for(ordinal_type j=0; j<numInternalDofs; ++j) {
261  auto idof = basis->getDofOrdinal(2, iface, j);
262  for(ordinal_type d=0; d <dim; ++d)
263  dofCoords(i,idof,d) = faceDofCoordsOriented3d(j,d);
264  }
265  }
266 
267  if(isBasisHCURL) {
268  scalarViewType faceDofCoeffs("faceDofCoeffs", faceBasisCardinality, 2);
269  faceBasis->getDofCoeffs(faceDofCoeffs);
270  CellTools<SpT>::getReferenceFaceTangents(refFaceTanU, refFaceTanV, iface, topo);
271  for(ordinal_type i=0; i<numCells; ++i) {
272  orts(i).getFaceOrientation(fOrt.data(), numFaces);
273  Impl::OrientationTools::getJacobianOfOrientationMap(ortJacobian, faceBasis->getBaseCellTopology(), fOrt(iface));
274  for(ordinal_type j=0; j<numInternalDofs; ++j) {
275  auto idof = basis->getDofOrdinal(2, iface, j);
276  auto jdof = faceBasis->getDofOrdinal(2, 0, j);
277  for(ordinal_type d=0; d <dim; ++d) {
278  dofCoeffs(i,idof,d) = 0;
279  for(ordinal_type k=0; k <2; ++k)
280  for(ordinal_type l=0; l <2; ++l)
281  dofCoeffs(i,idof,d) += refFaceTangents(d,l)*ortJacobian(l,k)*faceDofCoeffs(jdof,k);
282  }
283  }
284  }
285  } else if(isBasisHDIV) {
286  //depending on how the reference basis is defined, the faces are scaled differently
287  auto faceScale = (isBasisHEXI1) ? 4.0 :
288  (isBasisTETI1) ? 0.5 : 1.0;
289  CellTools<SpT>::getReferenceFaceNormal(refNormal, iface, topo);
290  scalarViewType faceDofCoeffs("faceDofCoeffs", faceBasisCardinality);
291  faceBasis->getDofCoeffs(faceDofCoeffs);
292  for(ordinal_type i=0; i<numCells; ++i) {
293  orts(i).getFaceOrientation(fOrt.data(), numFaces);
294  Impl::OrientationTools::getJacobianOfOrientationMap(ortJacobian, faceBasis->getBaseCellTopology(), fOrt(iface));
295  auto ortJacobianDet = ortJacobian(0,0)*ortJacobian(1,1)-ortJacobian(1,0)*ortJacobian(0,1);
296  for(ordinal_type j=0; j<numInternalDofs; ++j) {
297  auto idof = basis->getDofOrdinal(2, iface, j);
298  auto jdof = faceBasis->getDofOrdinal(2, 0, j);
299  for(ordinal_type d=0; d <dim; ++d)
300  dofCoeffs(i,idof,d) = refNormal(d)*ortJacobianDet*faceDofCoeffs(jdof)*faceScale;
301  }
302  }
303  } else {
304  scalarViewType faceDofCoeffs("faceDofCoeffs", faceBasisCardinality);
305  faceBasis->getDofCoeffs(faceDofCoeffs);
306  for(ordinal_type i=0; i<numCells; ++i) {
307  for(ordinal_type j=0; j<numInternalDofs; ++j) {
308  auto idof = basis->getDofOrdinal(2, iface, j);
309  auto jdof = faceBasis->getDofOrdinal(2, 0, j);
310  dofCoeffs(i,idof,0) = faceDofCoeffs(jdof);
311  }
312  }
313  }
314  }
315 
316  auto numElemDOFs = basis->getDofCount(dim,0);
317  for(ordinal_type j=0; j<numElemDOFs; ++j) {
318  auto idof = basis->getDofOrdinal(dim, 0, j);
319  for(ordinal_type d=0; d <dim; ++d)
320  for(ordinal_type i=1; i <numCells; ++i)
321  dofCoords(i,idof,d) = refDofCoords(idof,d);
322  for(ordinal_type d=0; d <(ordinal_type)dofCoeffs.extent(2); ++d)
323  for(ordinal_type i=1; i <numCells; ++i)
324  dofCoeffs(i,idof,d) = refDofCoeffs(idof,d);
325  }
326 
327 }
328 
329 
330 template<typename SpT>
331 template<typename basisCoeffsViewType,
332 typename funcViewType,
333 typename dofCoeffViewType>
334 void
335 LagrangianInterpolation<SpT>::getBasisCoeffs(basisCoeffsViewType basisCoeffs,
336  const funcViewType functionValsAtDofCoords,
337  const dofCoeffViewType dofCoeffs){
338  ArrayTools<SpT>::dotMultiplyDataData(basisCoeffs,functionValsAtDofCoords,dofCoeffs);
339 }
340 }
341 }
342 
343 #endif
344 
Implementation of the default HVOL-compatible Lagrange basis of arbitrary degree on Triangle cell...
static void getReferenceEdgeTangent(Kokkos::DynRankView< refEdgeTangentValueType, refEdgeTangentProperties...> refEdgeTangent, const ordinal_type edgeOrd, const shards::CellTopology parentCell)
Computes constant tangent vectors to edges of 2D or 3D reference cells.
Header file for the abstract base class Intrepid2::DefaultCubatureFactory.
Implementation of the default H(curl)-compatible FEM basis on Quadrilateral cell. ...
static void getReferenceSideNormal(Kokkos::DynRankView< refSideNormalValueType, refSideNormalProperties...> refSideNormal, const ordinal_type sideOrd, const shards::CellTopology parentCell)
Computes constant normal vectors to sides of 2D or 3D reference cells.
static void getDofCoordsAndCoeffs(Kokkos::DynRankView< typename BasisType::scalarType, coordsProperties...> dofCoords, Kokkos::DynRankView< typename BasisType::scalarType, coeffsProperties...> dofCoeffs, const BasisType *cellBasis, EPointType basisPointType, const Kokkos::DynRankView< ortValueType, ortProperties...> cellOrientations)
Computes the points and coefficients associated with the basis DOFs for the reference oriented elemen...
static void getJacobianOfOrientationMap(JacobianViewType jacobian, const shards::CellTopology cellTopo, const ordinal_type cellOrt)
Computes jacobian of the parameterization maps of 1- and 2-subcells with orientation.
static void mapToReferenceSubcell(Kokkos::DynRankView< refSubcellPointValueType, refSubcellPointProperties...> refSubcellPoints, const Kokkos::DynRankView< paramPointValueType, paramPointProperties...> paramPoints, const ordinal_type subcellDim, const ordinal_type subcellOrd, const shards::CellTopology parentCell)
Computes parameterization maps of 1- and 2-subcells of reference cells.
static void dotMultiplyDataData(Kokkos::DynRankView< outputDataValueType, outputDataProperties...> outputData, const Kokkos::DynRankView< inputDataLeftValueType, inputDataLeftProperties...> inputDataLeft, const Kokkos::DynRankView< inputDataRightValueType, inputDataRightProperties...> inputDataRight)
There are two use cases: (1) dot product of a rank-2, 3 or 4 container inputDataRight with dimensions...
Header file for the Intrepid2::FunctionSpaceTools class.
static void clone(Kokkos::DynRankView< outputValueType, outputProperties...> output, const Kokkos::DynRankView< inputValueType, inputProperties...> input)
Clone input array.
Implementation of the locally H(grad)-compatible FEM basis of variable order on the [-1...
Header file for Intrepid2::ArrayTools class providing utilities for array operations.
Implementation of the locally HVOL-compatible FEM basis of variable order on the [-1,1] reference line cell, using Lagrange polynomials.
Implementation of the default H(curl)-compatible Nedelec (first kind) basis of arbitrary degree on Tr...
Implementation of the default H(grad)-compatible Lagrange basis of arbitrary degree on Triangle cell...
static void getReferenceFaceTangents(Kokkos::DynRankView< refFaceTanUValueType, refFaceTanUProperties...> refFaceTanU, Kokkos::DynRankView< refFaceTanVValueType, refFaceTanVProperties...> refFaceTanV, const ordinal_type faceOrd, const shards::CellTopology parentCell)
Computes pairs of constant tangent vectors to faces of a 3D reference cells.
static void mapToModifiedReference(outPointViewType outPoints, const refPointViewType refPoints, const shards::CellTopology cellTopo, const ordinal_type cellOrt=0)
Computes modified parameterization maps of 1- and 2-subcells with orientation.
static void getBasisCoeffs(basisCoeffsViewType basisCoeffs, const funcViewType functionAtDofCoords, const dofCoeffViewType dofCoeffs)
Computes the basis weights of the function interpolation.
static void getReferenceFaceNormal(Kokkos::DynRankView< refFaceNormalValueType, refFaceNormalProperties...> refFaceNormal, const ordinal_type faceOrd, const shards::CellTopology parentCell)
Computes constant normal vectors to faces of 3D reference cell.
Implementation of the default H(grad)-compatible FEM basis of degree n on Quadrilateral cell Implemen...