48 #ifndef __INTREPID2_ORIENTATIONTOOLS_DEF_MATRIX_DATA_HPP__ 
   49 #define __INTREPID2_ORIENTATIONTOOLS_DEF_MATRIX_DATA_HPP__ 
   52 #if defined (__clang__) && !defined (__INTEL_COMPILER) 
   53 #pragma clang system_header 
   58   template<
typename SpT>
 
   59   template<
typename BasisPtrType>
 
   60   typename OrientationTools<SpT>::CoeffMatrixDataViewType
 
   61   OrientationTools<SpT>::createCoeffMatrixInternal(BasisPtrType basis) {
 
   62     const ordinal_type order(basis->getDegree());
 
   63     const std::string name(basis->getName());
 
   64     CoeffMatrixDataViewType matData;
 
   66     auto ordinalToTag = basis->getAllDofTags();
 
   67     auto tagToOrdinal = basis->getAllDofOrdinal();
 
   73     if (name == 
"Intrepid2_HGRAD_QUAD_Cn_FEM") {
 
   75         const ordinal_type matDim = ordinalToTag(tagToOrdinal(1, 0, 0), 3), numEdges = 4, numOrts = 2;
 
   76         matData = CoeffMatrixDataViewType(
"Orientation::CoeffMatrix::Intrepid2_HGRAD_QUAD_Cn_FEM",
 
   82         init_HGRAD_QUAD_Cn_FEM(matData, order);
 
   85         matData = CoeffMatrixDataViewType();
 
   88     else if (name == 
"Intrepid2_HGRAD_HEX_Cn_FEM") {
 
   90         const ordinal_type matDim = ordinalToTag(tagToOrdinal(2, 0, 0), 3), numSubcells = 18, numOrts = 8;
 
   91         matData = CoeffMatrixDataViewType(
"Orientation::CoeffMatrix::Intrepid2_HGRAD_HEX_Cn_FEM",
 
   97         init_HGRAD_HEX_Cn_FEM(matData, order);
 
  100         matData = CoeffMatrixDataViewType();
 
  103     else if (name == 
"Intrepid2_HGRAD_TRI_Cn_FEM") {
 
  105         const ordinal_type matDim = ordinalToTag(tagToOrdinal(1, 0, 0), 3), numEdges = 3, numOrts = 2;      
 
  106         matData = CoeffMatrixDataViewType(
"Orientation::CoeffMatrix::Intrepid2_HGRAD_TRI_Cn_FEM",
 
  112         init_HGRAD_TRI_Cn_FEM(matData, order);
 
  115         matData = CoeffMatrixDataViewType();
 
  118     else if (name == 
"Intrepid2_HGRAD_TET_Cn_FEM") {
 
  120         matDim = max(ordinalToTag(tagToOrdinal(1, 0, 0), 3),
 
  121                      ordinalToTag(tagToOrdinal(2, 0, 0), 3)),
 
  122         numSubcells = 10, numOrts = 6;
 
  123       matData = CoeffMatrixDataViewType(
"Orientation::CoeffMatrix::Intrepid2_HGRAD_TET_Cn_FEM",
 
  129       init_HGRAD_TET_Cn_FEM(matData, order);
 
  136     else if (name == 
"Intrepid2_HCURL_QUAD_In_FEM") {
 
  137       const ordinal_type matDim = ordinalToTag(tagToOrdinal(1, 0, 0), 3), numEdges = 4, numOrts = 2;
 
  138       matData = CoeffMatrixDataViewType(
"Orientation::CoeffMatrix::Intrepid2_HCURL_QUAD_In_FEM",
 
  144       init_HCURL_QUAD_In_FEM(matData, order);
 
  146     else if (name == 
"Intrepid2_HCURL_HEX_In_FEM") {
 
  148       const ordinal_type matDim = ordinalToTag(tagToOrdinal((order < 2 ? 1 : 2), 0, 0), 3), numSubcells = 18, numOrts = 8;
 
  149       matData = CoeffMatrixDataViewType(
"Orientation::CoeffMatrix::Intrepid2_HCURL_HEX_In_FEM",
 
  155       init_HCURL_HEX_In_FEM(matData, order);
 
  157     else if (name == 
"Intrepid2_HCURL_TRI_In_FEM") {
 
  158       const ordinal_type matDim = ordinalToTag(tagToOrdinal(1, 0, 0), 3), numEdges = 3, numOrts = 2;
 
  159       matData = CoeffMatrixDataViewType(
"Orientation::CoeffMatrix::Intrepid2_HCURL_TRI_In_FEM",
 
  165       init_HCURL_TRI_In_FEM(matData, order);
 
  167     else if (name == 
"Intrepid2_HCURL_TET_In_FEM") {
 
  168       const ordinal_type matDim = ordinalToTag(tagToOrdinal((order < 2 ? 1 : 2), 0, 0), 3), numSubcells = 10, numOrts = 6;
 
  169       matData = CoeffMatrixDataViewType(
"Orientation::CoeffMatrix::Intrepid2_HCURL_TET_In_FEM",
 
  175       init_HCURL_TET_In_FEM(matData, order);
 
  182     else if (name == 
"Intrepid2_HDIV_QUAD_In_FEM") {
 
  183       const ordinal_type matDim = ordinalToTag(tagToOrdinal(1, 0, 0), 3), numEdges = 4, numOrts = 2;
 
  184       matData = CoeffMatrixDataViewType(
"Orientation::CoeffMatrix::Intrepid2_HDIV_QUAD_In_FEM",
 
  190       init_HDIV_QUAD_In_FEM(matData, order);
 
  192     else if (name == 
"Intrepid2_HDIV_HEX_In_FEM") {
 
  193       const ordinal_type matDim = ordinalToTag(tagToOrdinal(2, 0, 0), 3), numSubcells = 6, numOrts = 8;
 
  194       matData = CoeffMatrixDataViewType(
"Orientation::CoeffMatrix::Intrepid2_HDIV_HEX_In_FEM",
 
  200       init_HDIV_HEX_In_FEM(matData, order);
 
  202     else if (name == 
"Intrepid2_HDIV_TRI_In_FEM") {
 
  203       const ordinal_type matDim = ordinalToTag(tagToOrdinal(1, 0, 0), 3), numEdges = 3, numOrts = 2;
 
  204       matData = CoeffMatrixDataViewType(
"Orientation::CoeffMatrix::Intrepid2_HDIV_TRI_In_FEM",
 
  210       init_HDIV_TRI_In_FEM(matData, order);
 
  212     else if (name == 
"Intrepid2_HDIV_TET_In_FEM") {
 
  213       const ordinal_type matDim = ordinalToTag(tagToOrdinal(2, 0, 0), 3), numSubcells = 4, numOrts = 6;
 
  214       matData = CoeffMatrixDataViewType(
"Orientation::CoeffMatrix::Intrepid2_HDIV_TET_In_FEM",
 
  220       init_HDIV_TET_In_FEM(matData, order);
 
  227     else if (name == 
"Intrepid2_HCURL_QUAD_I1_FEM" || 
 
  228              name == 
"Intrepid2_HDIV_QUAD_I1_FEM") {
 
  229       const ordinal_type matDim = 1, numEdges = 4, numOrts = 2;
 
  230       matData = CoeffMatrixDataViewType(
"Orientation::CoeffMatrix::Intrepid2_HCURL_QUAD_I1_FEM",
 
  235       for (ordinal_type edgeId=0;edgeId<numEdges;++edgeId)
 
  236         init_EDGE_ELEMENT_I1_FEM(matData, edgeId);
 
  238     else if (name == 
"Intrepid2_HCURL_TRI_I1_FEM" || 
 
  239              name == 
"Intrepid2_HDIV_TRI_I1_FEM") {
 
  240       const ordinal_type matDim = 1, numEdges = 3, numOrts = 2;
 
  241       matData = CoeffMatrixDataViewType(
"Orientation::CoeffMatrix::Intrepid2_HCURL_TRI_I1_FEM",
 
  246       for (ordinal_type edgeId=0;edgeId<numEdges;++edgeId)
 
  247         init_EDGE_ELEMENT_I1_FEM(matData, edgeId);
 
  254     else if (name == 
"Intrepid2_HCURL_HEX_I1_FEM") {
 
  255       const ordinal_type matDim = 1, numEdges = 12, numOrts = 2;
 
  256       matData = CoeffMatrixDataViewType(
"Orientation::CoeffMatrix::Intrepid2_HCURL_HEX_I1_FEM",
 
  261       for (ordinal_type edgeId=0;edgeId<numEdges;++edgeId)
 
  262         init_EDGE_ELEMENT_I1_FEM(matData, edgeId);
 
  264     else if (name == 
"Intrepid2_HCURL_TET_I1_FEM") {
 
  265       const ordinal_type matDim = 1, numEdges = 6, numOrts = 2;
 
  266       matData = CoeffMatrixDataViewType(
"Orientation::CoeffMatrix::Intrepid2_HCURL_TET_I1_FEM",
 
  271       for (ordinal_type edgeId=0;edgeId<numEdges;++edgeId)
 
  272         init_EDGE_ELEMENT_I1_FEM(matData, edgeId);
 
  274     else if (name == 
"Intrepid2_HCURL_WEDGE_I1_FEM") {
 
  275       const ordinal_type matDim = 1, numEdges = 9, numOrts = 2;
 
  276       matData = CoeffMatrixDataViewType(
"Orientation::CoeffMatrix::Intrepid2_HCURL_WEDGE_I1_FEM",
 
  281       for (ordinal_type edgeId=0;edgeId<numEdges;++edgeId)
 
  282         init_EDGE_ELEMENT_I1_FEM(matData, edgeId);
 
  289     else if (name == 
"Intrepid2_HDIV_HEX_I1_FEM") {
 
  290       const ordinal_type matDim = 1, numFaces = 6, numOrts = 8;
 
  291       matData = CoeffMatrixDataViewType(
"Orientation::CoeffMatrix::Intrepid2_HDIV_HEX_I1_FEM",
 
  296       for (ordinal_type faceId=0;faceId<numFaces;++faceId) 
 
  297         init_QUAD_FACE_ELEMENT_I1_FEM(matData, faceId);
 
  299     else if (name == 
"Intrepid2_HDIV_TET_I1_FEM") {
 
  300       const ordinal_type matDim = 1, numFaces = 4, numOrts = 6;
 
  301       matData = CoeffMatrixDataViewType(
"Orientation::CoeffMatrix::Intrepid2_HDIV_TET_I1_FEM",
 
  306       for (ordinal_type faceId=0;faceId<numFaces;++faceId) 
 
  307         init_TRI_FACE_ELEMENT_I1_FEM(matData, faceId);
 
  309     else if (name == 
"Intrepid2_HDIV_WEDGE_I1_FEM") {
 
  310       const ordinal_type matDim = 1, numFaces = 5, numOrts = 8;
 
  311       matData = CoeffMatrixDataViewType(
"Orientation::CoeffMatrix::Intrepid2_HDIV_WEDGE_I1_FEM",
 
  316       ordinal_type faceId = 0;
 
  317       for ( ;faceId<3;++faceId) 
 
  318         init_QUAD_FACE_ELEMENT_I1_FEM(matData, faceId);
 
  319       for ( ;faceId<numFaces;++faceId) 
 
  320         init_TRI_FACE_ELEMENT_I1_FEM(matData, faceId);
 
  329   template<
typename SpT>
 
  331   OrientationTools<SpT>::
 
  332   init_HGRAD_QUAD_Cn_FEM(
typename OrientationTools<SpT>::CoeffMatrixDataViewType matData,
 
  333                          const ordinal_type order) {
 
  335       Basis_HGRAD_LINE_Cn_FEM<Kokkos::DefaultHostExecutionSpace> lineBasis(order);
 
  336       Basis_HGRAD_QUAD_Cn_FEM<Kokkos::DefaultHostExecutionSpace> cellBasis(order);
 
  338       const ordinal_type numEdge = 4, numOrt = 2;
 
  339       for (ordinal_type edgeId=0;edgeId<numEdge;++edgeId)
 
  340         for (ordinal_type edgeOrt=0;edgeOrt<numOrt;++edgeOrt) {
 
  341           auto mat = Kokkos::subview(matData, 
 
  343                                      Kokkos::ALL(), Kokkos::ALL());
 
  345                                                        lineBasis, cellBasis, 
 
  351   template<
typename SpT>
 
  353   OrientationTools<SpT>::
 
  354   init_HCURL_QUAD_In_FEM(
typename OrientationTools<SpT>::CoeffMatrixDataViewType matData,
 
  355                          const ordinal_type order) {
 
  356     Basis_HGRAD_LINE_Cn_FEM<Kokkos::DefaultHostExecutionSpace> bubbleBasis(order-1, POINTTYPE_GAUSS);
 
  357     Basis_HCURL_QUAD_In_FEM<Kokkos::DefaultHostExecutionSpace> cellBasis(order);
 
  359     const ordinal_type numEdge = 4, numOrt = 2;
 
  360     for (ordinal_type edgeId=0;edgeId<numEdge;++edgeId)
 
  361       for (ordinal_type edgeOrt=0;edgeOrt<numOrt;++edgeOrt) {
 
  362         auto mat = Kokkos::subview(matData, 
 
  364                                    Kokkos::ALL(), Kokkos::ALL());
 
  366                                                      bubbleBasis, cellBasis, 
 
  371   template<
typename SpT>
 
  373   OrientationTools<SpT>::
 
  374   init_HDIV_QUAD_In_FEM(
typename OrientationTools<SpT>::CoeffMatrixDataViewType matData,
 
  375                          const ordinal_type order) {
 
  376     Basis_HGRAD_LINE_Cn_FEM<Kokkos::DefaultHostExecutionSpace> bubbleBasis(order-1, POINTTYPE_GAUSS);
 
  377     Basis_HDIV_QUAD_In_FEM<Kokkos::DefaultHostExecutionSpace> cellBasis(order);
 
  379     const ordinal_type numEdge = 4, numOrt = 2;
 
  380     for (ordinal_type edgeId=0;edgeId<numEdge;++edgeId)
 
  381       for (ordinal_type edgeOrt=0;edgeOrt<numOrt;++edgeOrt) {
 
  382         auto mat = Kokkos::subview(matData, 
 
  384                                    Kokkos::ALL(), Kokkos::ALL());
 
  386                                                     bubbleBasis, cellBasis, 
 
  395   template<
typename SpT>
 
  397   OrientationTools<SpT>::
 
  398   init_HGRAD_HEX_Cn_FEM(
typename OrientationTools<SpT>::CoeffMatrixDataViewType matData,
 
  399                         const ordinal_type order) {
 
  401       Basis_HGRAD_LINE_Cn_FEM<Kokkos::DefaultHostExecutionSpace> lineBasis(order);
 
  402       Basis_HGRAD_QUAD_Cn_FEM<Kokkos::DefaultHostExecutionSpace> quadBasis(order);
 
  403       Basis_HGRAD_HEX_Cn_FEM<Kokkos::DefaultHostExecutionSpace> cellBasis(order);
 
  405       const ordinal_type numEdge = 12, numFace = 6;    
 
  407         const ordinal_type numOrt = 2;
 
  408         for (ordinal_type edgeId=0;edgeId<numEdge;++edgeId)
 
  409           for (ordinal_type edgeOrt=0;edgeOrt<numOrt;++edgeOrt) {
 
  410             auto mat = Kokkos::subview(matData, 
 
  412                                        Kokkos::ALL(), Kokkos::ALL());
 
  414                                                          lineBasis, cellBasis, 
 
  419         const ordinal_type numOrt = 8;
 
  420         for (ordinal_type faceId=0;faceId<numFace;++faceId)
 
  421           for (ordinal_type faceOrt=0;faceOrt<numOrt;++faceOrt) {
 
  422             auto mat = Kokkos::subview(matData, 
 
  423                                        numEdge+faceId, faceOrt,
 
  424                                        Kokkos::ALL(), Kokkos::ALL());
 
  426                                                          quadBasis, cellBasis, 
 
  433   template<
typename SpT>
 
  435   OrientationTools<SpT>::
 
  436   init_HCURL_HEX_In_FEM(
typename OrientationTools<SpT>::CoeffMatrixDataViewType matData,
 
  437                         const ordinal_type order) {
 
  438     Basis_HGRAD_LINE_Cn_FEM<Kokkos::DefaultHostExecutionSpace> bubbleBasis(order-1, POINTTYPE_GAUSS);
 
  439     Basis_HCURL_QUAD_In_FEM<Kokkos::DefaultHostExecutionSpace> quadBasis(order);
 
  440     Basis_HCURL_HEX_In_FEM<Kokkos::DefaultHostExecutionSpace> cellBasis(order);
 
  442     const ordinal_type numEdge = 12, numFace = 6;    
 
  444       const ordinal_type numOrt = 2;
 
  445       for (ordinal_type edgeId=0;edgeId<numEdge;++edgeId)
 
  446         for (ordinal_type edgeOrt=0;edgeOrt<numOrt;++edgeOrt) {
 
  447           auto mat = Kokkos::subview(matData, 
 
  449                                      Kokkos::ALL(), Kokkos::ALL());
 
  451                                                        bubbleBasis, cellBasis, 
 
  456       const ordinal_type numOrt = 8;
 
  457       for (ordinal_type faceId=0;faceId<numFace;++faceId)
 
  458         for (ordinal_type faceOrt=0;faceOrt<numOrt;++faceOrt) {
 
  459           auto mat = Kokkos::subview(matData, 
 
  460                                      numEdge+faceId, faceOrt,
 
  461                                      Kokkos::ALL(), Kokkos::ALL());
 
  463                                                        quadBasis, cellBasis, 
 
  469   template<
typename SpT>
 
  471   OrientationTools<SpT>::
 
  472   init_HDIV_HEX_In_FEM(
typename OrientationTools<SpT>::CoeffMatrixDataViewType matData,
 
  473                        const ordinal_type order) {
 
  474     Basis_HGRAD_QUAD_Cn_FEM<Kokkos::DefaultHostExecutionSpace> quadBasis(order-1, POINTTYPE_GAUSS);
 
  475     Basis_HDIV_HEX_In_FEM<Kokkos::DefaultHostExecutionSpace> cellBasis(order);
 
  477     const ordinal_type numFace = 6;    
 
  479       const ordinal_type numOrt = 8;
 
  480       for (ordinal_type faceId=0;faceId<numFace;++faceId)
 
  481         for (ordinal_type faceOrt=0;faceOrt<numOrt;++faceOrt) {
 
  482           auto mat = Kokkos::subview(matData, 
 
  484                                      Kokkos::ALL(), Kokkos::ALL());
 
  486                                                       quadBasis, cellBasis, 
 
  496   template<
typename SpT>
 
  498   OrientationTools<SpT>::
 
  499   init_HGRAD_TRI_Cn_FEM(
typename OrientationTools<SpT>::CoeffMatrixDataViewType matData,
 
  500                         const ordinal_type order) {
 
  502       Basis_HGRAD_LINE_Cn_FEM<Kokkos::DefaultHostExecutionSpace> lineBasis(order);
 
  503       Basis_HGRAD_TRI_Cn_FEM<Kokkos::DefaultHostExecutionSpace> cellBasis(order);
 
  505       const ordinal_type numEdge = 3, numOrt = 2;
 
  506       for (ordinal_type edgeId=0;edgeId<numEdge;++edgeId)
 
  507         for (ordinal_type edgeOrt=0;edgeOrt<numOrt;++edgeOrt) {
 
  508           auto mat = Kokkos::subview(matData, 
 
  510                                      Kokkos::ALL(), Kokkos::ALL());
 
  512                                                        lineBasis, cellBasis, 
 
  519   template<
typename SpT>
 
  521   OrientationTools<SpT>::
 
  522   init_HCURL_TRI_In_FEM(
typename OrientationTools<SpT>::CoeffMatrixDataViewType matData,
 
  523                         const ordinal_type order) {
 
  524     Basis_HVOL_LINE_Cn_FEM<Kokkos::DefaultHostExecutionSpace> bubbleBasis(order-1);
 
  525     Basis_HCURL_TRI_In_FEM<Kokkos::DefaultHostExecutionSpace> cellBasis(order);
 
  527     const ordinal_type numEdge = 3, numOrt = 2;
 
  528     for (ordinal_type edgeId=0;edgeId<numEdge;++edgeId)
 
  529       for (ordinal_type edgeOrt=0;edgeOrt<numOrt;++edgeOrt) {
 
  530         auto mat = Kokkos::subview(matData, 
 
  532                                    Kokkos::ALL(), Kokkos::ALL());
 
  534                                                      bubbleBasis, cellBasis, 
 
  539   template<
typename SpT>
 
  541   OrientationTools<SpT>::
 
  542   init_HDIV_TRI_In_FEM(
typename OrientationTools<SpT>::CoeffMatrixDataViewType matData,
 
  543                        const ordinal_type order) {
 
  544     Basis_HVOL_LINE_Cn_FEM<Kokkos::DefaultHostExecutionSpace> bubbleBasis(order-1);
 
  545     Basis_HDIV_TRI_In_FEM<Kokkos::DefaultHostExecutionSpace> cellBasis(order);
 
  547     const ordinal_type numEdge = 3, numOrt = 2;
 
  548     for (ordinal_type edgeId=0;edgeId<numEdge;++edgeId)
 
  549       for (ordinal_type edgeOrt=0;edgeOrt<numOrt;++edgeOrt) {
 
  550         auto mat = Kokkos::subview(matData, 
 
  552                                    Kokkos::ALL(), Kokkos::ALL());
 
  554                                                     bubbleBasis, cellBasis, 
 
  563   template<
typename SpT>
 
  565   OrientationTools<SpT>::
 
  566   init_HGRAD_TET_Cn_FEM(
typename OrientationTools<SpT>::CoeffMatrixDataViewType matData,
 
  567                         const ordinal_type order) {
 
  569       Basis_HGRAD_LINE_Cn_FEM<Kokkos::DefaultHostExecutionSpace> lineBasis(order);
 
  570       Basis_HGRAD_TRI_Cn_FEM<Kokkos::DefaultHostExecutionSpace>  triBasis(order);
 
  571       Basis_HGRAD_TET_Cn_FEM<Kokkos::DefaultHostExecutionSpace>  cellBasis(order);
 
  573       const ordinal_type numEdge = 6, numFace = 4;    
 
  575         const ordinal_type numOrt = 2;
 
  576         for (ordinal_type edgeId=0;edgeId<numEdge;++edgeId)
 
  577           for (ordinal_type edgeOrt=0;edgeOrt<numOrt;++edgeOrt) {
 
  578             auto mat = Kokkos::subview(matData, 
 
  580                                        Kokkos::ALL(), Kokkos::ALL());
 
  582                                                          lineBasis, cellBasis, 
 
  587         const ordinal_type numOrt = 6;
 
  588         for (ordinal_type faceId=0;faceId<numFace;++faceId)
 
  589           for (ordinal_type faceOrt=0;faceOrt<numOrt;++faceOrt) {
 
  590             auto mat = Kokkos::subview(matData, 
 
  591                                        numEdge+faceId, faceOrt,
 
  592                                        Kokkos::ALL(), Kokkos::ALL());
 
  601   template<
typename SpT>
 
  603   OrientationTools<SpT>::
 
  604   init_HCURL_TET_In_FEM(
typename OrientationTools<SpT>::CoeffMatrixDataViewType matData,
 
  605                         const ordinal_type order) {
 
  606     Basis_HVOL_LINE_Cn_FEM<Kokkos::DefaultHostExecutionSpace> bubbleBasis(order-1);
 
  607     Basis_HCURL_TRI_In_FEM<Kokkos::DefaultHostExecutionSpace> triBasis(order);
 
  608     Basis_HCURL_TET_In_FEM<Kokkos::DefaultHostExecutionSpace>  cellBasis(order);
 
  610     const ordinal_type numEdge = 6, numFace = 4;    
 
  612       const ordinal_type numOrt = 2;
 
  613       for (ordinal_type edgeId=0;edgeId<numEdge;++edgeId)
 
  614         for (ordinal_type edgeOrt=0;edgeOrt<numOrt;++edgeOrt) {
 
  615           auto mat = Kokkos::subview(matData, 
 
  617                                      Kokkos::ALL(), Kokkos::ALL());
 
  619                                                        bubbleBasis, cellBasis, 
 
  624       const ordinal_type numOrt = 6;
 
  625       for (ordinal_type faceId=0;faceId<numFace;++faceId)
 
  626         for (ordinal_type faceOrt=0;faceOrt<numOrt;++faceOrt) {
 
  627           auto mat = Kokkos::subview(matData, 
 
  628                                      numEdge+faceId, faceOrt,
 
  629                                      Kokkos::ALL(), Kokkos::ALL());
 
  637   template<
typename SpT>
 
  639   OrientationTools<SpT>::
 
  640   init_HDIV_TET_In_FEM(
typename OrientationTools<SpT>::CoeffMatrixDataViewType matData,
 
  641                        const ordinal_type order) {
 
  642     Basis_HVOL_TRI_Cn_FEM<Kokkos::DefaultHostExecutionSpace> triBasis(order-1);
 
  643     Basis_HDIV_TET_In_FEM<Kokkos::DefaultHostExecutionSpace>  cellBasis(order);
 
  645     const ordinal_type numFace = 4, numOrt = 6;
 
  646     for (ordinal_type faceId=0;faceId<numFace;++faceId)
 
  647       for (ordinal_type faceOrt=0;faceOrt<numOrt;++faceOrt) {
 
  648         auto mat = Kokkos::subview(matData, 
 
  650                                    Kokkos::ALL(), Kokkos::ALL());
 
  661   template<
typename SpT>
 
  663   OrientationTools<SpT>::
 
  664   init_EDGE_ELEMENT_I1_FEM(
typename OrientationTools<SpT>::CoeffMatrixDataViewType matData,
 
  665                            const ordinal_type edgeId) {
 
  666     const ordinal_type numOrt = 2;
 
  667     const double edgeOrtCoeff[2] = { 1.0, -1.0 };
 
  668     for (ordinal_type edgeOrt=0;edgeOrt<numOrt;++edgeOrt) {
 
  669       auto mat = Kokkos::subview(matData, 
 
  671                                  Kokkos::ALL(), Kokkos::ALL());
 
  672       mat(0,0) = edgeOrtCoeff[edgeOrt];
 
  676   template<
typename SpT>
 
  678   OrientationTools<SpT>::
 
  679   init_TRI_FACE_ELEMENT_I1_FEM(
typename OrientationTools<SpT>::CoeffMatrixDataViewType matData,
 
  680                                const ordinal_type faceId) {
 
  681     const ordinal_type numOrt = 6;
 
  682     const double faceOrtCoeff[6] = {   1.0,  1.0,  1.0, 
 
  685     for (ordinal_type faceOrt=0;faceOrt<numOrt;++faceOrt) {
 
  686       auto mat = Kokkos::subview(matData, 
 
  688                                  Kokkos::ALL(), Kokkos::ALL());
 
  689       mat(0,0) = faceOrtCoeff[faceOrt];
 
  693   template<
typename SpT>
 
  695   OrientationTools<SpT>::
 
  696   init_QUAD_FACE_ELEMENT_I1_FEM(
typename OrientationTools<SpT>::CoeffMatrixDataViewType matData,
 
  697                                 const ordinal_type faceId) {
 
  698     const ordinal_type numOrt = 8;
 
  699     const double faceOrtCoeff[8] = {   1.0,  1.0,  1.0,  1.0, 
 
  700                                       -1.0, -1.0, -1.0, -1.0 };
 
  702     for (ordinal_type faceOrt=0;faceOrt<numOrt;++faceOrt) {
 
  703       auto mat = Kokkos::subview(matData, 
 
  705                                  Kokkos::ALL(), Kokkos::ALL());
 
  706       mat(0,0) = faceOrtCoeff[faceOrt];
 
  710   template<
typename SpT>
 
  711   template<
typename BasisPtrType>
 
  712   typename OrientationTools<SpT>::CoeffMatrixDataViewType
 
  714 #ifdef HAVE_INTREPID2_DEBUG 
  715     INTREPID2_TEST_FOR_EXCEPTION( !basis->requireOrientation(), std::invalid_argument,
 
  716                                   ">>> ERROR (OrientationTools::createCoeffMatrix): basis does not require orientations." );
 
  718     Kokkos::push_finalize_hook( [=] {
 
  719       ortCoeffData=std::map<std::pair<std::string,ordinal_type>, 
typename OrientationTools<SpT>::CoeffMatrixDataViewType>();
 
  722     const std::pair<std::string,ordinal_type> key(basis->getName(), basis->getDegree());
 
  723     const auto found = ortCoeffData.find(key);
 
  725     CoeffMatrixDataViewType matData;
 
  726     if (found == ortCoeffData.end()) {
 
  727       matData = createCoeffMatrixInternal(basis);
 
  728       ortCoeffData.insert(std::make_pair(key, matData));
 
  730       matData = found->second;
 
  736   template<
typename SpT>
 
  738     ortCoeffData.clear();