Intrepid2
Intrepid2_HGRAD_HEX_C2_FEMDef.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 
49 #ifndef __INTREPID2_HGRAD_HEX_C2_FEM_DEF_HPP__
50 #define __INTREPID2_HGRAD_HEX_C2_FEM_DEF_HPP__
51 
52 namespace Intrepid2 {
53 
54  // -------------------------------------------------------------------------------------
55  namespace Impl {
56 
57  template<EOperator opType>
58  template<typename OutputViewType,
59  typename inputViewType>
60  KOKKOS_INLINE_FUNCTION
61  void
62  Basis_HGRAD_HEX_C2_FEM::Serial<opType>::
63  getValues( OutputViewType output,
64  const inputViewType input ) {
65  switch (opType) {
66  case OPERATOR_VALUE : {
67  const auto x = input(0);
68  const auto y = input(1);
69  const auto z = input(2);
70 
71  // output is a rank-2 array with dimensions (basisCardinality_, dim0)
72  output.access( 0) = 0.125*(-1. + x)*x*(-1. + y)*y*(-1. + z)*z;
73  output.access( 1) = 0.125*x*(1.+ x)*(-1. + y)*y*(-1. + z)*z;
74  output.access( 2) = 0.125*x*(1.+ x)*y*(1.+ y)*(-1. + z)*z;
75  output.access( 3) = 0.125*(-1. + x)*x*y*(1.+ y)*(-1. + z)*z;
76  output.access( 4) = 0.125*(-1. + x)*x*(-1. + y)*y*z*(1.+ z);
77  output.access( 5) = 0.125*x*(1.+ x)*(-1. + y)*y*z*(1.+ z);
78  output.access( 6) = 0.125*x*(1.+ x)*y*(1.+ y)*z*(1.+ z);
79  output.access( 7) = 0.125*(-1. + x)*x*y*(1.+ y)*z*(1.+ z);
80  output.access( 8) = 0.25*(1. - x)*(1. + x)*(-1. + y)*y*(-1. + z)*z;
81  output.access( 9) = 0.25*x*(1.+ x)*(1. - y)*(1. + y)*(-1. + z)*z;
82  output.access(10) = 0.25*(1. - x)*(1. + x)*y*(1.+ y)*(-1. + z)*z;
83  output.access(11) = 0.25*(-1. + x)*x*(1. - y)*(1. + y)*(-1. + z)*z;
84  output.access(12) = 0.25*(-1. + x)*x*(-1. + y)*y*(1. - z)*(1. + z);
85  output.access(13) = 0.25*x*(1.+ x)*(-1. + y)*y*(1. - z)*(1. + z);
86  output.access(14) = 0.25*x*(1.+ x)*y*(1.+ y)*(1. - z)*(1. + z);
87  output.access(15) = 0.25*(-1. + x)*x*y*(1.+ y)*(1. - z)*(1. + z);
88  output.access(16) = 0.25*(1. - x)*(1. + x)*(-1. + y)*y*z*(1.+ z);
89  output.access(17) = 0.25*x*(1.+ x)*(1. - y)*(1. + y)*z*(1.+ z);
90  output.access(18) = 0.25*(1. - x)*(1. + x)*y*(1.+ y)*z*(1.+ z);
91  output.access(19) = 0.25*(-1. + x)*x*(1. - y)*(1. + y)*z*(1.+ z);
92  output.access(20) = (1. - x)*(1. + x)*(1. - y)*(1. + y)*(1. - z)*(1. + z);
93  output.access(21) = 0.5*(1. - x)*(1. + x)*(1. - y)*(1. + y)*(-1. + z)*z;
94  output.access(22) = 0.5*(1. - x)*(1. + x)*(1. - y)*(1. + y)*z*(1.+ z);
95  output.access(23) = 0.5*(-1. + x)*x*(1. - y)*(1. + y)*(1. - z)*(1. + z);
96  output.access(24) = 0.5*x*(1.+ x)*(1. - y)*(1. + y)*(1. - z)*(1. + z);
97  output.access(25) = 0.5*(1. - x)*(1. + x)*(-1. + y)*y*(1. - z)*(1. + z);
98  output.access(26) = 0.5*(1. - x)*(1. + x)*y*(1.+ y)*(1. - z)*(1. + z);
99  break;
100  }
101  case OPERATOR_GRAD :
102  case OPERATOR_D1 : {
103  const auto x = input(0);
104  const auto y = input(1);
105  const auto z = input(2);
106 
107  // output.access is a rank-3 array with dimensions (basisCardinality_, dim0, spaceDim)
108  output.access(0, 0) = (-0.125 + 0.25*x)*(-1. + y)*y*(-1. + z)*z;
109  output.access(0, 1) = (-1. + x)*x*(-0.125 + 0.25*y)*(-1. + z)*z;
110  output.access(0, 2) = (-1. + x)*x*(-1. + y)*y*(-0.125 + 0.25*z);
111 
112  output.access(1, 0) = (0.125 + 0.25*x)*(-1. + y)*y*(-1. + z)*z;
113  output.access(1, 1) = x*(1. + x)*(-0.125 + 0.25*y)*(-1. + z)*z;
114  output.access(1, 2) = x*(1. + x)*(-1. + y)*y*(-0.125 + 0.25*z);
115 
116  output.access(2, 0) = (0.125 + 0.25*x)*y*(1. + y)*(-1. + z)*z;
117  output.access(2, 1) = x*(1. + x)*(0.125 + 0.25*y)*(-1. + z)*z;
118  output.access(2, 2) = x*(1. + x)*y*(1. + y)*(-0.125 + 0.25*z);
119 
120  output.access(3, 0) = (-0.125 + 0.25*x)*y*(1. + y)*(-1. + z)*z;
121  output.access(3, 1) = (-1. + x)*x*(0.125 + 0.25*y)*(-1. + z)*z;
122  output.access(3, 2) = (-1. + x)*x*y*(1. + y)*(-0.125 + 0.25*z);
123 
124  output.access(4, 0) = (-0.125 + 0.25*x)*(-1. + y)*y*z*(1. + z);
125  output.access(4, 1) = (-1. + x)*x*(-0.125 + 0.25*y)*z*(1. + z);
126  output.access(4, 2) = (-1. + x)*x*(-1. + y)*y*(0.125 + 0.25*z);
127 
128  output.access(5, 0) = (0.125 + 0.25*x)*(-1. + y)*y*z*(1. + z);
129  output.access(5, 1) = x*(1. + x)*(-0.125 + 0.25*y)*z*(1. + z);
130  output.access(5, 2) = x*(1. + x)*(-1. + y)*y*(0.125 + 0.25*z);
131 
132  output.access(6, 0) = (0.125 + 0.25*x)*y*(1. + y)*z*(1. + z);
133  output.access(6, 1) = x*(1. + x)*(0.125 + 0.25*y)*z*(1. + z);
134  output.access(6, 2) = x*(1. + x)*y*(1. + y)*(0.125 + 0.25*z);
135 
136  output.access(7, 0) = (-0.125 + 0.25*x)*y*(1. + y)*z*(1. + z);
137  output.access(7, 1) = (-1. + x)*x*(0.125 + 0.25*y)*z*(1. + z);
138  output.access(7, 2) = (-1. + x)*x*y*(1. + y)*(0.125 + 0.25*z);
139 
140  output.access(8, 0) = -0.5*x*(-1. + y)*y*(-1. + z)*z;
141  output.access(8, 1) = (1. - x)*(1. + x)*(-0.25 + 0.5*y)*(-1. + z)*z;
142  output.access(8, 2) = (1. - x)*(1. + x)*(-1. + y)*y*(-0.25 + 0.5*z);
143 
144  output.access(9, 0) = (0.25 + 0.5*x)*(1. - y)*(1. + y)*(-1. + z)*z;
145  output.access(9, 1) = x*(1. + x)*(-0.5*y)*(-1. + z)*z;
146  output.access(9, 2) = x*(1. + x)*(1. - y)*(1. + y)*(-0.25 + 0.5*z);
147 
148  output.access(10, 0) = -0.5*x*y*(1. + y)*(-1. + z)*z;
149  output.access(10, 1) = (1. - x)*(1. + x)*(0.25 + 0.5*y)*(-1. + z)*z;
150  output.access(10, 2) = (1. - x)*(1. + x)*y*(1. + y)*(-0.25 + 0.5*z);
151 
152  output.access(11, 0) = (-0.25 + 0.5*x)*(1. - y)*(1. + y)*(-1. + z)*z;
153  output.access(11, 1) = (-1. + x)*x*(-0.5*y)*(-1. + z)*z;
154  output.access(11, 2) = (-1. + x)*x*(1. - y)*(1. + y)*(-0.25 + 0.5*z);
155 
156  output.access(12, 0) = (-0.25 + 0.5*x)*(-1. + y)*y*(1. - z)*(1. + z);
157  output.access(12, 1) = (-1. + x)*x*(-0.25 + 0.5*y)*(1. - z)*(1. + z);
158  output.access(12, 2) = (-1. + x)*x*(-1. + y)*y*(-0.5*z);
159 
160  output.access(13, 0) = (0.25 + 0.5*x)*(-1. + y)*y*(1. - z)*(1. + z);
161  output.access(13, 1) = x*(1. + x)*(-0.25 + 0.5*y)*(1. - z)*(1. + z);
162  output.access(13, 2) = x*(1. + x)*(-1. + y)*y*(-0.5*z);
163 
164  output.access(14, 0) = (0.25 + 0.5*x)*y*(1. + y)*(1. - z)*(1. + z);
165  output.access(14, 1) = x*(1. + x)*(0.25 + 0.5*y)*(1. - z)*(1. + z);
166  output.access(14, 2) = x*(1. + x)*y*(1. + y)*(-0.5*z);
167 
168  output.access(15, 0) = (-0.25 + 0.5*x)*y*(1. + y)*(1. - z)*(1. + z);
169  output.access(15, 1) = (-1. + x)*x*(0.25 + 0.5*y)*(1. - z)*(1. + z);
170  output.access(15, 2) = (-1. + x)*x*y*(1. + y)*(-0.5*z);
171 
172  output.access(16, 0) = -0.5*x*(-1. + y)*y*z*(1. + z);
173  output.access(16, 1) = (1. - x)*(1. + x)*(-0.25 + 0.5*y)*z*(1. + z);
174  output.access(16, 2) = (1. - x)*(1. + x)*(-1. + y)*y*(0.25 + 0.5*z);
175 
176  output.access(17, 0) = (0.25 + 0.5*x)*(1. - y)*(1. + y)*z*(1. + z);
177  output.access(17, 1) = x*(1. + x)*(-0.5*y)*z*(1. + z);
178  output.access(17, 2) = x*(1. + x)*(1. - y)*(1. + y)*(0.25 + 0.5*z);
179 
180  output.access(18, 0) = -0.5*x*y*(1. + y)*z*(1. + z);
181  output.access(18, 1) = (1. - x)*(1. + x)*(0.25 + 0.5*y)*z*(1. + z);
182  output.access(18, 2) = (1. - x)*(1. + x)*y*(1. + y)*(0.25 + 0.5*z);
183 
184  output.access(19, 0) = (-0.25 + 0.5*x)*(1. - y)*(1. + y)*z*(1. + z);
185  output.access(19, 1) = (-1. + x)*x*(-0.5*y)*z*(1. + z);
186  output.access(19, 2) = (-1. + x)*x*(1. - y)*(1. + y)*(0.25 + 0.5*z);
187 
188  output.access(20, 0) = -2.*x*(1. - y)*(1. + y)*(1. - z)*(1. + z);
189  output.access(20, 1) = (1. - x)*(1. + x)*(-2.*y)*(1. - z)*(1. + z);
190  output.access(20, 2) = (1. - x)*(1. + x)*(1. - y)*(1. + y)*(-2.*z);
191 
192  output.access(21, 0) = -x*(1. - y)*(1. + y)*(-1. + z)*z;
193  output.access(21, 1) = (1. - x)*(1. + x)*(-y)*(-1. + z)*z;
194  output.access(21, 2) = (1. - x)*(1. + x)*(1. - y)*(1. + y)*(-0.5 + z);
195 
196  output.access(22, 0) = -x*(1. - y)*(1. + y)*z*(1. + z);
197  output.access(22, 1) = (1. - x)*(1. + x)*(-y)*z*(1. + z);
198  output.access(22, 2) = (1. - x)*(1. + x)*(1. - y)*(1. + y)*(0.5 + z);
199 
200  output.access(23, 0) = (-0.5 + x)*(1. - y)*(1. + y)*(1. - z)*(1. + z);
201  output.access(23, 1) = (-1. + x)*x*(-y)*(1. - z)*(1. + z);
202  output.access(23, 2) = (-1. + x)*x*(1. - y)*(1. + y)*(-z);
203 
204  output.access(24, 0) = (0.5 + x)*(1. - y)*(1. + y)*(1. - z)*(1. + z);
205  output.access(24, 1) = x*(1. + x)*(-y)*(1. - z)*(1. + z);
206  output.access(24, 2) = x*(1. + x)*(1. - y)*(1. + y)*(-z);
207 
208  output.access(25, 0) = -x*(-1. + y)*y*(1. - z)*(1. + z);
209  output.access(25, 1) = (1. - x)*(1. + x)*(-0.5 + y)*(1. - z)*(1. + z);
210  output.access(25, 2) = (1. - x)*(1. + x)*(-1. + y)*y*(-z);
211 
212  output.access(26, 0) = -x*y*(1. + y)*(1. - z)*(1. + z);
213  output.access(26, 1) = (1. - x)*(1. + x)*(0.5 + y)*(1. - z)*(1. + z);
214  output.access(26, 2) = (1. - x)*(1. + x)*y*(1. + y)*(-z);
215  break;
216  }
217  case OPERATOR_D2 : {
218  const auto x = input(0);
219  const auto y = input(1);
220  const auto z = input(2);
221 
222  // output.access is a rank-3 array with dimensions (basisCardinality_, dim0, D2Cardinality = 6)
223  output.access(0, 0) = 0.25*(-1. + y)*y*(-1. + z)*z;
224  output.access(0, 1) = (-0.125 + y*(0.25 - 0.25*z) + x*(0.25 + y*(-0.5 + 0.5*z) - 0.25*z) + 0.125*z)*z;
225  output.access(0, 2) = y*(-0.125 + x*(0.25 + y*(-0.25 + 0.5*z) - 0.5*z) + y*(0.125 - 0.25*z) + 0.25*z);
226  output.access(0, 3) = 0.25*(-1. + x)*x*(-1. + z)*z;
227  output.access(0, 4) = x*(-0.125 + y*(0.25 - 0.5*z) + x*(0.125 + y*(-0.25 + 0.5*z) - 0.25*z) + 0.25*z);
228  output.access(0, 5) = 0.25*(-1. + x)*x*(-1. + y)*y;
229 
230  output.access(1, 0) = 0.25*(-1. + y)*y*(-1. + z)*z;
231  output.access(1, 1) = (0.125 + x*(0.25 + y*(-0.5 + 0.5*z) - 0.25*z) + y*(-0.25 + 0.25*z) - 0.125*z)*z;
232  output.access(1, 2) = y*(0.125 + x*(0.25 + y*(-0.25 + 0.5*z) - 0.5*z) + y*(-0.125 + 0.25*z) - 0.25*z);
233  output.access(1, 3) = 0.25*x*(1 + x)*(-1. + z)*z;
234  output.access(1, 4) = x*(1. + x)*(0.125 + y*(-0.25 + 0.5*z) - 0.25*z);
235  output.access(1, 5) = 0.25*x*(1 + x)*(-1. + y)*y;
236 
237  output.access(2, 0) = 0.25*y*(1 + y)*(-1. + z)*z;
238  output.access(2, 1) = (0.125 + x*(0.25 + 0.5*y) + 0.25*y)*(-1. + z)*z;
239  output.access(2, 2) = y*(1. + y)*(-0.125 + x*(-0.25 + 0.5*z) + 0.25*z);
240  output.access(2, 3) = 0.25*x*(1 + x)*(-1. + z)*z;
241  output.access(2, 4) = x*(1. + x)*(-0.125 + y*(-0.25 + 0.5*z) + 0.25*z);
242  output.access(2, 5) = 0.25*x*(1 + x)*y*(1 + y);
243 
244  output.access(3, 0) = 0.25*y*(1 + y)*(-1. + z)*z;
245  output.access(3, 1) = (0.125 + y*(0.25 - 0.25*z) + x*(-0.25 + y*(-0.5 + 0.5*z) + 0.25*z) - 0.125*z)*z;
246  output.access(3, 2) = y*(1. + y)*(0.125 + x*(-0.25 + 0.5*z) - 0.25*z);
247  output.access(3, 3) = 0.25*(-1. + x)*x*(-1. + z)*z;
248  output.access(3, 4) = x*(0.125 + y*(0.25 - 0.5*z) + x*(-0.125 + y*(-0.25 + 0.5*z) + 0.25*z) - 0.25*z);
249  output.access(3, 5) = 0.25*(-1. + x)*x*y*(1 + y);
250 
251  output.access(4, 0) = 0.25*(-1. + y)*y*z*(1 + z);
252  output.access(4, 1) = (0.125 + x*(-0.25 + 0.5*y) - 0.25*y)*z*(1. + z);
253  output.access(4, 2) = y*(0.125 + x*(-0.25 + y*(0.25 + 0.5*z) - 0.5*z) + y*(-0.125 - 0.25*z) + 0.25*z);
254  output.access(4, 3) = 0.25*(-1. + x)*x*z*(1 + z);
255  output.access(4, 4) = x*(0.125 + y*(-0.25 - 0.5*z) + x*(-0.125 + y*(0.25 + 0.5*z) - 0.25*z) + 0.25*z);
256  output.access(4, 5) = 0.25*(-1. + x)*x*(-1. + y)*y;
257 
258  output.access(5, 0) = 0.25*(-1. + y)*y*z*(1 + z);
259  output.access(5, 1) = (-0.125 + x*(-0.25 + 0.5*y) + 0.25*y)*z*(1. + z);
260  output.access(5, 2) = (-1. + y)*y*(0.125 + x*(0.25 + 0.5*z) + 0.25*z);
261  output.access(5, 3) = 0.25*x*(1 + x)*z*(1 + z);
262  output.access(5, 4) = x*(1. + x)*(-0.125 + y*(0.25 + 0.5*z) - 0.25*z);
263  output.access(5, 5) = 0.25*x*(1 + x)*(-1. + y)*y;
264 
265  output.access(6, 0) = 0.25*y*(1 + y)*z*(1 + z);
266  output.access(6, 1) = (0.125 + x*(0.25 + 0.5*y) + 0.25*y)*z*(1. + z);
267  output.access(6, 2) = y*(1. + y)*(0.125 + x*(0.25 + 0.5*z) + 0.25*z);
268  output.access(6, 3) = 0.25*x*(1 + x)*z*(1 + z);
269  output.access(6, 4) = x*(1. + x)*(0.125 + y*(0.25 + 0.5*z) + 0.25*z);
270  output.access(6, 5) = 0.25*x*(1 + x)*y*(1 + y);
271 
272  output.access(7, 0) = 0.25*y*(1 + y)*z*(1 + z);
273  output.access(7, 1) = (-0.125 + x*(0.25 + 0.5*y) - 0.25*y)*z*(1. + z);
274  output.access(7, 2) = y*(1. + y)*(-0.125 + x*(0.25 + 0.5*z) - 0.25*z);
275  output.access(7, 3) = 0.25*(-1. + x)*x*z*(1 + z);
276  output.access(7, 4) = (-1. + x)*x*(0.125 + y*(0.25 + 0.5*z) + 0.25*z);
277  output.access(7, 5) = 0.25*(-1. + x)*x*y*(1 + y);
278 
279  output.access(8, 0) = -0.5*(-1. + y)*y*(-1. + z)*z;
280  output.access(8, 1) = (0. + x*(-0.5 + y))*z + (x*(0.5 - y) )*(z*z);
281  output.access(8, 2) = (y*y)*(x*(0.5 - z) ) + y*(x*(-0.5 + z));
282  output.access(8, 3) = 0.5*(1. - x)*(1. + x)*(-1. + z)*z;
283  output.access(8, 4) = 0.25 + (x*x)*(-0.25 + y*(0.5 - z) + 0.5*z) - 0.5*z + y*(-0.5 + z);
284  output.access(8, 5) = 0.5*(1. - x)*(1. + x)*(-1. + y)*y;
285 
286  output.access(9, 0) = 0.5*(1. - y)*(1. + y)*(-1. + z)*z;
287  output.access(9, 1) = (0.5*y + x*(y))*z + (x*(-y) - 0.5*y)*(z*z);
288  output.access(9, 2) = -0.25 + (y*y)*(0.25 - 0.5*z) + 0.5*z + x*(-0.5 + (y*y)*(0.5 - z) + z);
289  output.access(9, 3) = -0.5*x*(1 + x)*(-1. + z)*z;
290  output.access(9, 4) = x*(y*(0.5 - z) ) + (x*x)*(y*(0.5 - z) );
291  output.access(9, 5) = 0.5*x*(1 + x)*(1. - y)*(1. + y);
292 
293  output.access(10, 0) = -0.5*y*(1 + y)*(-1. + z)*z;
294  output.access(10, 1) = (0. + x*(0.5 + y))*z + (x*(-0.5 - y) )*(z*z);
295  output.access(10, 2) = y*(x*(0.5 - z) ) + (y*y)*(x*(0.5 - z) );
296  output.access(10, 3) = 0.5*(1. - x)*(1. + x)*(-1. + z)*z;
297  output.access(10, 4) = -0.25 + (x*x)*(0.25 + y*(0.5 - z) - 0.5*z) + 0.5*z + y*(-0.5 + z);
298  output.access(10, 5) = 0.5*(1. - x)*(1. + x)*y*(1 + y);
299 
300  output.access(11, 0) = 0.5*(1. - y)*(1. + y)*(-1. + z)*z;
301  output.access(11, 1) = (-0.5*y + x*(y))*z + (x*(-y) + 0.5*y)*(z*z);
302  output.access(11, 2) = 0.25 + (y*y)*(-0.25 + 0.5*z) - 0.5*z + x*(-0.5 + (y*y)*(0.5 - z) + z);
303  output.access(11, 3) = -0.5*(-1. + x)*x*(-1. + z)*z;
304  output.access(11, 4) = (x*x)*(y*(0.5 - z) ) + x*(y*(-0.5 + z));
305  output.access(11, 5) = 0.5*(-1. + x)*x*(1. - y)*(1. + y);
306 
307  output.access(12, 0) = 0.5*(-1. + y)*y*(1. - z)*(1. + z);
308  output.access(12, 1) = 0.25 - 0.25*(z*z) + y*(-0.5 + 0.5*(z*z)) + x*(-0.5 + 0.5*(z*z) + y*(1. - (z*z)));
309  output.access(12, 2) = (y*y)*(x*(-z) + 0.5*z) + y*(-0.5*z + x*(z));
310  output.access(12, 3) = 0.5*(-1. + x)*x*(1. - z)*(1. + z);
311  output.access(12, 4) = (x*x)*(y*(-z) + 0.5*z) + x*(-0.5*z + y*(z));
312  output.access(12, 5) = -0.5*(-1. + x)*x*(-1. + y)*y;
313 
314  output.access(13, 0) = 0.5*(-1. + y)*y*(1. - z)*(1. + z);
315  output.access(13, 1) = -0.25 + 0.25*(z*z) + y*(0.5 - 0.5*(z*z)) + x*(-0.5 + 0.5*(z*z) + y*(1. - (z*z)));
316  output.access(13, 2) = (y*y)*(x*(-z) - 0.5*z) + y*(0.5*z + x*(z));
317  output.access(13, 3) = 0.5*x*(1 + x)*(1. - z)*(1. + z);
318  output.access(13, 4) = x*(y*(-z) + 0.5*z) + (x*x)*(y*(-z) + 0.5*z);
319  output.access(13, 5) = -0.5*x*(1 + x)*(-1. + y)*y;
320 
321  output.access(14, 0) = 0.5*y*(1 + y)*(1. - z)*(1. + z);
322  output.access(14, 1) = 0.25 - 0.25*(z*z) + y*(0.5 - 0.5*(z*z)) + x*(0.5 - 0.5*(z*z) + y*(1. - (z*z)));
323  output.access(14, 2) = y*(x*(-z) - 0.5*z) + (y*y)*(x*(-z) - 0.5*z);
324  output.access(14, 3) = 0.5*x*(1 + x)*(1. - z)*(1. + z);
325  output.access(14, 4) = x*(y*(-z) - 0.5*z) + (x*x)*(y*(-z) - 0.5*z);
326  output.access(14, 5) = -0.5*x*(1 + x)*y*(1 + y);
327 
328  output.access(15, 0) = 0.5*y*(1 + y)*(1. - z)*(1. + z);
329  output.access(15, 1) = -0.25 + 0.25*(z*z) + y*(-0.5 + 0.5*(z*z)) + x*(0.5 - 0.5*(z*z) + y*(1. - (z*z)));
330  output.access(15, 2) = y*(x*(-z) + 0.5*z) + (y*y)*(x*(-z) + 0.5*z);
331  output.access(15, 3) = 0.5*(-1. + x)*x*(1. - z)*(1. + z);
332  output.access(15, 4) = (x*x)*(y*(-z) - 0.5*z) + x*(0.5*z + y*(z));
333  output.access(15, 5) = -0.5*(-1. + x)*x*y*(1 + y);
334 
335  output.access(16, 0) = -0.5*(-1. + y)*y*z*(1 + z);
336  output.access(16, 1) = (x*(0.5 - y) )*z + (x*(0.5 - y) )*(z*z);
337  output.access(16, 2) = (y*y)*(x*(-0.5 - z) ) + y*(x*(0.5 + z));
338  output.access(16, 3) = 0.5*(1. - x)*(1. + x)*z*(1 + z);
339  output.access(16, 4) = -0.25 + (x*x)*(0.25 + y*(-0.5 - z) + 0.5*z) - 0.5*z + y*(0.5 + z);
340  output.access(16, 5) = 0.5*(1. - x)*(1. + x)*(-1. + y)*y;
341 
342  output.access(17, 0) = 0.5*(1. - y)*(1. + y)*z*(1 + z);
343  output.access(17, 1) = (x*(-y) - 0.5*y)*z + (x*(-y) - 0.5*y)*(z*z);
344  output.access(17, 2) = 0.25 + (y*y)*(-0.25 - 0.5*z) + 0.5*z + x*(0.5 + (y*y)*(-0.5 - z) + z);
345  output.access(17, 3) = -0.5*x*(1 + x)*z*(1 + z);
346  output.access(17, 4) = x*(y*(-0.5 - z) ) + (x*x)*(y*(-0.5 - z) );
347  output.access(17, 5) = 0.5*x*(1 + x)*(1. - y)*(1. + y);
348 
349  output.access(18, 0) = -0.5*y*(1 + y)*z*(1 + z);
350  output.access(18, 1) = (x*(-0.5 - y) )*z + (x*(-0.5 - y) )*(z*z);
351  output.access(18, 2) = y*(x*(-0.5 - z) ) + (y*y)*(x*(-0.5 - z) );
352  output.access(18, 3) = 0.5*(1. - x)*(1. + x)*z*(1 + z);
353  output.access(18, 4) = 0.25 + (x*x)*(-0.25 + y*(-0.5 - z) - 0.5*z) + 0.5*z + y*(0.5 + z);
354  output.access(18, 5) = 0.5*(1. - x)*(1. + x)*y*(1 + y);
355 
356  output.access(19, 0) = 0.5*(1. - y)*(1. + y)*z*(1 + z);
357  output.access(19, 1) = (x*(-y) + 0.5*y)*z + (x*(-y) + 0.5*y)*(z*z);
358  output.access(19, 2) = -0.25 + (y*y)*(0.25 + 0.5*z) - 0.5*z + x*(0.5 + (y*y)*(-0.5 - z) + z);
359  output.access(19, 3) = -0.5*(-1. + x)*x*z*(1 + z);
360  output.access(19, 4) = (x*x)*(y*(-0.5 - z) ) + x*(y*(0.5 + z));
361  output.access(19, 5) = 0.5*(-1. + x)*x*(1. - y)*(1. + y);
362 
363  output.access(20, 0) = -2.*(1. - y)*(1. + y)*(1. - z)*(1. + z);
364  output.access(20, 1) = -4.*x*y*(-1. + z*z);
365  output.access(20, 2) = x*((y*y)*(-4.*z) + 4.*z);
366  output.access(20, 3) = -2.*(1. - x)*(1. + x)*(1. - z)*(1. + z);
367  output.access(20, 4) = (x*x)*(y*(-4.*z) ) + y*(4.*z);
368  output.access(20, 5) = -2.*(1. - x)*(1. + x)*(1. - y)*(1. + y);
369 
370  output.access(21, 0) = -(1. - y)*(1. + y)*(-1. + z)*z;
371  output.access(21, 1) = (x*(-2.*y) )*z + (0. + x*(2.*y))*(z*z);
372  output.access(21, 2) = x*(1. - 2.*z + (y*y)*(-1. + 2.*z));
373  output.access(21, 3) = -(1. - x)*(1. + x)*(-1. + z)*z;
374  output.access(21, 4) = y*(1. - 2.*z) + (x*x)*(y*(-1. + 2.*z));
375  output.access(21, 5) = (1. - x)*(1. + x)*(1. - y)*(1. + y);
376 
377  output.access(22, 0) = -(1. - y)*(1. + y)*z*(1 + z);
378  output.access(22, 1) = (0. + x*(2.*y))*z + (0. + x*(2.*y))*(z*z);
379  output.access(22, 2) = x*(-1. - 2.*z + (y*y)*(1. + 2.*z));
380  output.access(22, 3) = -(1. - x)*(1. + x)*z*(1 + z);
381  output.access(22, 4) = y*(-1. - 2.*z) + (x*x)*(y*(1. + 2.*z));
382  output.access(22, 5) = (1. - x)*(1. + x)*(1. - y)*(1. + y);
383 
384  output.access(23, 0) = (1. - y)*(1. + y)*(1. - z)*(1. + z);
385  output.access(23, 1) = (-1. + 2.*x)*y*(-1. + z*z);
386  output.access(23, 2) = (-1. + 2.*x)*(-1. + y*y)*z;
387  output.access(23, 3) =-(-1. + x)*x*(1. - z)*(1. + z);
388  output.access(23, 4) = 2.*(-1. + x)*x*y*z;
389  output.access(23, 5) =-(-1. + x)*x*(1. - y)*(1. + y);
390 
391  output.access(24, 0) = (1. - y)*(1. + y)*(1. - z)*(1. + z);
392  output.access(24, 1) = (1. + 2.*x)*y*(-1. + z*z);
393  output.access(24, 2) = (1. + 2.*x)*(-1. + y*y)*z;
394  output.access(24, 3) = x*(1. + x)*(-1. + z)*(1. + z);
395  output.access(24, 4) = 2.*x*(1. + x)*y*z;
396  output.access(24, 5) = x*(1. + x)*(-1. + y)*(1. + y);
397 
398  output.access(25, 0) = -(-1. + y)*y*(1. - z)*(1. + z);
399  output.access(25, 1) = x*(-1. + 2.*y)*(-1. + z*z);
400  output.access(25, 2) = 2.*x*(-1. + y)*y*z;
401  output.access(25, 3) = (1. - x)*(1. + x)*(1. - z)*(1. + z);
402  output.access(25, 4) = (-1. + x*x)*(-1. + 2.*y)*z;
403  output.access(25, 5) =-(1. - x)*(1. + x)*(-1. + y)*y;
404 
405  output.access(26, 0) = y*(1. + y)*(-1. + z)*(1. + z);
406  output.access(26, 1) = x*(1. + 2.*y)*(-1. + z*z);
407  output.access(26, 2) = 2.*x*y*(1. + y)*z;
408  output.access(26, 3) = (-1. + x)*(1. + x)*(-1. + z)*(1. + z);
409  output.access(26, 4) = (-1. + x*x)*(1. + 2.*y)*z;
410  output.access(26, 5) = (-1. + x)*(1. + x)*y*(1. + y);
411  break;
412  }
413  case OPERATOR_D3 : {
414  const auto x = input(0);
415  const auto y = input(1);
416  const auto z = input(2);
417 
418  output.access(0, 0) = 0.;
419  output.access(0, 1) = ((-1.+ 2.*y)*(-1.+ z)*z)/4.;
420  output.access(0, 2) = ((-1.+ y)*y*(-1.+ 2.*z))/4.;
421  output.access(0, 3) = ((-1.+ 2.*x)*(-1.+ z)*z)/4.;
422  output.access(0, 4) = ((-1.+ 2.*x)*(-1.+ 2.*y)*(-1.+ 2.*z))/8.;
423  output.access(0, 5) = ((-1.+ 2.*x)*(-1.+ y)*y)/4.;
424  output.access(0, 6) = 0.;
425  output.access(0, 7) = ((-1.+ x)*x*(-1.+ 2.*z))/4.;
426  output.access(0, 8) = ((-1.+ x)*x*(-1.+ 2.*y))/4.;
427  output.access(0, 9) = 0.;
428 
429  output.access(1, 0) = 0.;
430  output.access(1, 1) = ((-1.+ 2.*y)*(-1.+ z)*z)/4.;
431  output.access(1, 2) = ((-1.+ y)*y*(-1.+ 2.*z))/4.;
432  output.access(1, 3) = ((1.+ 2.*x)*(-1.+ z)*z)/4.;
433  output.access(1, 4) = ((1.+ 2.*x)*(-1.+ 2.*y)*(-1.+ 2.*z))/8.;
434  output.access(1, 5) = ((1.+ 2.*x)*(-1.+ y)*y)/4.;
435  output.access(1, 6) = 0.;
436  output.access(1, 7) = (x*(1.+ x)*(-1.+ 2.*z))/4.;
437  output.access(1, 8) = (x*(1.+ x)*(-1.+ 2.*y))/4.;
438  output.access(1, 9) = 0.;
439 
440  output.access(2, 0) = 0.;
441  output.access(2, 1) = ((1.+ 2.*y)*(-1.+ z)*z)/4.;
442  output.access(2, 2) = (y*(1.+ y)*(-1.+ 2.*z))/4.;
443  output.access(2, 3) = ((1.+ 2.*x)*(-1.+ z)*z)/4.;
444  output.access(2, 4) = ((1.+ 2.*x)*(1.+ 2.*y)*(-1.+ 2.*z))/8.;
445  output.access(2, 5) = ((1.+ 2.*x)*y*(1.+ y))/4.;
446  output.access(2, 6) = 0.;
447  output.access(2, 7) = (x*(1.+ x)*(-1.+ 2.*z))/4.;
448  output.access(2, 8) = (x*(1.+ x)*(1.+ 2.*y))/4.;
449  output.access(2, 9) = 0.;
450 
451  output.access(3, 0) = 0.;
452  output.access(3, 1) = ((1.+ 2.*y)*(-1.+ z)*z)/4.;
453  output.access(3, 2) = (y*(1.+ y)*(-1.+ 2.*z))/4.;
454  output.access(3, 3) = ((-1.+ 2.*x)*(-1.+ z)*z)/4.;
455  output.access(3, 4) = ((-1.+ 2.*x)*(1.+ 2.*y)*(-1.+ 2.*z))/8.;
456  output.access(3, 5) = ((-1.+ 2.*x)*y*(1.+ y))/4.;
457  output.access(3, 6) = 0.;
458  output.access(3, 7) = ((-1.+ x)*x*(-1.+ 2.*z))/4.;
459  output.access(3, 8) = ((-1.+ x)*x*(1.+ 2.*y))/4.;
460  output.access(3, 9) = 0.;
461 
462  output.access(4, 0) = 0.;
463  output.access(4, 1) = ((-1.+ 2.*y)*z*(1.+ z))/4.;
464  output.access(4, 2) = ((-1.+ y)*y*(1.+ 2.*z))/4.;
465  output.access(4, 3) = ((-1.+ 2.*x)*z*(1.+ z))/4.;
466  output.access(4, 4) = ((-1.+ 2.*x)*(-1.+ 2.*y)*(1.+ 2.*z))/8.;
467  output.access(4, 5) = ((-1.+ 2.*x)*(-1.+ y)*y)/4.;
468  output.access(4, 6) = 0.;
469  output.access(4, 7) = ((-1.+ x)*x*(1.+ 2.*z))/4.;
470  output.access(4, 8) = ((-1.+ x)*x*(-1.+ 2.*y))/4.;
471  output.access(4, 9) = 0.;
472 
473  output.access(5, 0) = 0.;
474  output.access(5, 1) = ((-1.+ 2.*y)*z*(1.+ z))/4.;
475  output.access(5, 2) = ((-1.+ y)*y*(1.+ 2.*z))/4.;
476  output.access(5, 3) = ((1.+ 2.*x)*z*(1.+ z))/4.;
477  output.access(5, 4) = ((1.+ 2.*x)*(-1.+ 2.*y)*(1.+ 2.*z))/8.;
478  output.access(5, 5) = ((1.+ 2.*x)*(-1.+ y)*y)/4.;
479  output.access(5, 6) = 0.;
480  output.access(5, 7) = (x*(1.+ x)*(1.+ 2.*z))/4.;
481  output.access(5, 8) = (x*(1.+ x)*(-1.+ 2.*y))/4.;
482  output.access(5, 9) = 0.;
483 
484  output.access(6, 0) = 0.;
485  output.access(6, 1) = ((1.+ 2.*y)*z*(1.+ z))/4.;
486  output.access(6, 2) = (y*(1.+ y)*(1.+ 2.*z))/4.;
487  output.access(6, 3) = ((1.+ 2.*x)*z*(1.+ z))/4.;
488  output.access(6, 4) = ((1.+ 2.*x)*(1.+ 2.*y)*(1.+ 2.*z))/8.;
489  output.access(6, 5) = ((1.+ 2.*x)*y*(1.+ y))/4.;
490  output.access(6, 6) = 0.;
491  output.access(6, 7) = (x*(1.+ x)*(1.+ 2.*z))/4.;
492  output.access(6, 8) = (x*(1.+ x)*(1.+ 2.*y))/4.;
493  output.access(6, 9) = 0.;
494 
495  output.access(7, 0) = 0.;
496  output.access(7, 1) = ((1.+ 2.*y)*z*(1.+ z))/4.;
497  output.access(7, 2) = (y*(1.+ y)*(1.+ 2.*z))/4.;
498  output.access(7, 3) = ((-1.+ 2.*x)*z*(1.+ z))/4.;
499  output.access(7, 4) = ((-1.+ 2.*x)*(1.+ 2.*y)*(1.+ 2.*z))/8.;
500  output.access(7, 5) = ((-1.+ 2.*x)*y*(1.+ y))/4.;
501  output.access(7, 6) = 0.;
502  output.access(7, 7) = ((-1.+ x)*x*(1.+ 2.*z))/4.;
503  output.access(7, 8) = ((-1.+ x)*x*(1.+ 2.*y))/4.;
504  output.access(7, 9) = 0.;
505 
506  output.access(8, 0) = 0.;
507  output.access(8, 1) = -((-1.+ 2.*y)*(-1.+ z)*z)/2.;
508  output.access(8, 2) = -((-1.+ y)*y*(-1.+ 2.*z))/2.;
509  output.access(8, 3) = -(x*(-1.+ z)*z);
510  output.access(8, 4) = -(x*(-1.+ 2.*y)*(-1.+ 2.*z))/2.;
511  output.access(8, 5) = -(x*(-1.+ y)*y);
512  output.access(8, 6) = 0.;
513  output.access(8, 7) = -((-1.+ (x*x))*(-1.+ 2.*z))/2.;
514  output.access(8, 8) = -((-1.+ (x*x))*(-1.+ 2.*y))/2.;
515  output.access(8, 9) = 0.;
516 
517  output.access(9, 0) = 0.;
518  output.access(9, 1) = -(y*(-1.+ z)*z);
519  output.access(9, 2) = -((-1.+ (y*y))*(-1.+ 2.*z))/2.;
520  output.access(9, 3) = -((1.+ 2.*x)*(-1.+ z)*z)/2.;
521  output.access(9, 4) = -((1.+ 2.*x)*y*(-1.+ 2.*z))/2.;
522  output.access(9, 5) = -((1.+ 2.*x)*(-1.+ (y*y)))/2.;
523  output.access(9, 6) = 0.;
524  output.access(9, 7) = -(x*(1.+ x)*(-1.+ 2.*z))/2.;
525  output.access(9, 8) = -(x*(1.+ x)*y);
526  output.access(9, 9) = 0.;
527 
528  output.access(10, 0) = 0.;
529  output.access(10, 1) = -((1.+ 2.*y)*(-1.+ z)*z)/2.;
530  output.access(10, 2) = -(y*(1.+ y)*(-1.+ 2.*z))/2.;
531  output.access(10, 3) = -(x*(-1.+ z)*z);
532  output.access(10, 4) = -(x*(1.+ 2.*y)*(-1.+ 2.*z))/2.;
533  output.access(10, 5) = -(x*y*(1.+ y));
534  output.access(10, 6) = 0.;
535  output.access(10, 7) = -((-1.+ (x*x))*(-1.+ 2.*z))/2.;
536  output.access(10, 8) = -((-1.+ (x*x))*(1.+ 2.*y))/2.;
537  output.access(10, 9) = 0.;
538 
539  output.access(11, 0) = 0.;
540  output.access(11, 1) = -(y*(-1.+ z)*z);
541  output.access(11, 2) = -((-1.+ (y*y))*(-1.+ 2.*z))/2.;
542  output.access(11, 3) = -((-1.+ 2.*x)*(-1.+ z)*z)/2.;
543  output.access(11, 4) = -((-1.+ 2.*x)*y*(-1.+ 2.*z))/2.;
544  output.access(11, 5) = -((-1.+ 2.*x)*(-1.+ (y*y)))/2.;
545  output.access(11, 6) = 0.;
546  output.access(11, 7) = -((-1.+ x)*x*(-1.+ 2.*z))/2.;
547  output.access(11, 8) = -((-1.+ x)*x*y);
548  output.access(11, 9) = 0.;
549 
550  output.access(12, 0) = 0.;
551  output.access(12, 1) = -((-1.+ 2.*y)*(-1.+ (z*z)))/2.;
552  output.access(12, 2) = -((-1.+ y)*y*z);
553  output.access(12, 3) = -((-1.+ 2.*x)*(-1.+ (z*z)))/2.;
554  output.access(12, 4) = -((-1.+ 2.*x)*(-1.+ 2.*y)*z)/2.;
555  output.access(12, 5) = -((-1.+ 2.*x)*(-1.+ y)*y)/2.;
556  output.access(12, 6) = 0.;
557  output.access(12, 7) = -((-1.+ x)*x*z);
558  output.access(12, 8) = -((-1.+ x)*x*(-1.+ 2.*y))/2.;
559  output.access(12, 9) = 0.;
560 
561  output.access(13, 0) = 0.;
562  output.access(13, 1) = -((-1.+ 2.*y)*(-1.+ (z*z)))/2.;
563  output.access(13, 2) = -((-1.+ y)*y*z);
564  output.access(13, 3) = -((1.+ 2.*x)*(-1.+ (z*z)))/2.;
565  output.access(13, 4) = -((1.+ 2.*x)*(-1.+ 2.*y)*z)/2.;
566  output.access(13, 5) = -((1.+ 2.*x)*(-1.+ y)*y)/2.;
567  output.access(13, 6) = 0.;
568  output.access(13, 7) = -(x*(1.+ x)*z);
569  output.access(13, 8) = -(x*(1.+ x)*(-1.+ 2.*y))/2.;
570  output.access(13, 9) = 0.;
571 
572  output.access(14, 0) = 0.;
573  output.access(14, 1) = -((1.+ 2.*y)*(-1.+ (z*z)))/2.;
574  output.access(14, 2) = -(y*(1.+ y)*z);
575  output.access(14, 3) = -((1.+ 2.*x)*(-1.+ (z*z)))/2.;
576  output.access(14, 4) = -((1.+ 2.*x)*(1.+ 2.*y)*z)/2.;
577  output.access(14, 5) = -((1.+ 2.*x)*y*(1.+ y))/2.;
578  output.access(14, 6) = 0.;
579  output.access(14, 7) = -(x*(1.+ x)*z);
580  output.access(14, 8) = -(x*(1.+ x)*(1.+ 2.*y))/2.;
581  output.access(14, 9) = 0.;
582 
583  output.access(15, 0) = 0.;
584  output.access(15, 1) = -((1.+ 2.*y)*(-1.+ (z*z)))/2.;
585  output.access(15, 2) = -(y*(1.+ y)*z);
586  output.access(15, 3) = -((-1.+ 2.*x)*(-1.+ (z*z)))/2.;
587  output.access(15, 4) = -((-1.+ 2.*x)*(1.+ 2.*y)*z)/2.;
588  output.access(15, 5) = -((-1.+ 2.*x)*y*(1.+ y))/2.;
589  output.access(15, 6) = 0.;
590  output.access(15, 7) = -((-1.+ x)*x*z);
591  output.access(15, 8) = -((-1.+ x)*x*(1.+ 2.*y))/2.;
592  output.access(15, 9) = 0.;
593 
594  output.access(16, 0) = 0.;
595  output.access(16, 1) = -((-1.+ 2.*y)*z*(1.+ z))/2.;
596  output.access(16, 2) = -((-1.+ y)*y*(1.+ 2.*z))/2.;
597  output.access(16, 3) = -(x*z*(1.+ z));
598  output.access(16, 4) = -(x*(-1.+ 2.*y)*(1.+ 2.*z))/2.;
599  output.access(16, 5) = -(x*(-1.+ y)*y);
600  output.access(16, 6) = 0.;
601  output.access(16, 7) = -((-1.+ (x*x))*(1.+ 2.*z))/2.;
602  output.access(16, 8) = -((-1.+ (x*x))*(-1.+ 2.*y))/2.;
603  output.access(16, 9) = 0.;
604 
605  output.access(17, 0) = 0.;
606  output.access(17, 1) = -(y*z*(1.+ z));
607  output.access(17, 2) = -((-1.+ (y*y))*(1.+ 2.*z))/2.;
608  output.access(17, 3) = -((1.+ 2.*x)*z*(1.+ z))/2.;
609  output.access(17, 4) = -((1.+ 2.*x)*y*(1.+ 2.*z))/2.;
610  output.access(17, 5) = -((1.+ 2.*x)*(-1.+ (y*y)))/2.;
611  output.access(17, 6) = 0.;
612  output.access(17, 7) = -(x*(1.+ x)*(1.+ 2.*z))/2.;
613  output.access(17, 8) = -(x*(1.+ x)*y);
614  output.access(17, 9) = 0.;
615 
616  output.access(18, 0) = 0.;
617  output.access(18, 1) = -((1.+ 2.*y)*z*(1.+ z))/2.;
618  output.access(18, 2) = -(y*(1.+ y)*(1.+ 2.*z))/2.;
619  output.access(18, 3) = -(x*z*(1.+ z));
620  output.access(18, 4) = -(x*(1.+ 2.*y)*(1.+ 2.*z))/2.;
621  output.access(18, 5) = -(x*y*(1.+ y));
622  output.access(18, 6) = 0.;
623  output.access(18, 7) = -((-1.+ (x*x))*(1.+ 2.*z))/2.;
624  output.access(18, 8) = -((-1.+ (x*x))*(1.+ 2.*y))/2.;
625  output.access(18, 9) = 0.;
626 
627  output.access(19, 0) = 0.;
628  output.access(19, 1) = -(y*z*(1.+ z));
629  output.access(19, 2) = -((-1.+ (y*y))*(1.+ 2.*z))/2.;
630  output.access(19, 3) = -((-1.+ 2.*x)*z*(1.+ z))/2.;
631  output.access(19, 4) = -((-1.+ 2.*x)*y*(1.+ 2.*z))/2.;
632  output.access(19, 5) = -((-1.+ 2.*x)*(-1.+ (y*y)))/2.;
633  output.access(19, 6) = 0.;
634  output.access(19, 7) = -((-1.+ x)*x*(1.+ 2.*z))/2.;
635  output.access(19, 8) = -((-1.+ x)*x*y);
636  output.access(19, 9) = 0.;
637 
638  output.access(20, 0) = 0.;
639  output.access(20, 1) = -4*y*(-1.+ (z*z));
640  output.access(20, 2) = -4*(-1.+ (y*y))*z;
641  output.access(20, 3) = -4*x*(-1.+ (z*z));
642  output.access(20, 4) = -8*x*y*z;
643  output.access(20, 5) = -4*x*(-1.+ (y*y));
644  output.access(20, 6) = 0.;
645  output.access(20, 7) = -4*(-1.+ (x*x))*z;
646  output.access(20, 8) = -4*(-1.+ (x*x))*y;
647  output.access(20, 9) = 0.;
648 
649  output.access(21, 0) = 0.;
650  output.access(21, 1) = 2.*y*(-1.+ z)*z;
651  output.access(21, 2) = (-1.+ (y*y))*(-1.+ 2.*z);
652  output.access(21, 3) = 2.*x*(-1.+ z)*z;
653  output.access(21, 4) = 2.*x*y*(-1.+ 2.*z);
654  output.access(21, 5) = 2.*x*(-1.+ (y*y));
655  output.access(21, 6) = 0.;
656  output.access(21, 7) = (-1.+ (x*x))*(-1.+ 2.*z);
657  output.access(21, 8) = 2.*(-1.+ (x*x))*y;
658  output.access(21, 9) = 0.;
659 
660  output.access(22, 0) = 0.;
661  output.access(22, 1) = 2.*y*z*(1.+ z);
662  output.access(22, 2) = (-1.+ (y*y))*(1.+ 2.*z);
663  output.access(22, 3) = 2.*x*z*(1.+ z);
664  output.access(22, 4) = 2.*x*y*(1.+ 2.*z);
665  output.access(22, 5) = 2.*x*(-1.+ (y*y));
666  output.access(22, 6) = 0.;
667  output.access(22, 7) = (-1.+ (x*x))*(1.+ 2.*z);
668  output.access(22, 8) = 2.*(-1.+ (x*x))*y;
669  output.access(22, 9) = 0.;
670 
671  output.access(23, 0) = 0.;
672  output.access(23, 1) = 2.*y*(-1.+ (z*z));
673  output.access(23, 2) = 2.*(-1.+ (y*y))*z;
674  output.access(23, 3) = (-1.+ 2.*x)*(-1.+ (z*z));
675  output.access(23, 4) = 2.*(-1.+ 2.*x)*y*z;
676  output.access(23, 5) = (-1.+ 2.*x)*(-1.+ (y*y));
677  output.access(23, 6) = 0.;
678  output.access(23, 7) = 2.*(-1.+ x)*x*z;
679  output.access(23, 8) = 2.*(-1.+ x)*x*y;
680  output.access(23, 9) = 0.;
681 
682  output.access(24, 0) = 0.;
683  output.access(24, 1) = 2.*y*(-1.+ (z*z));
684  output.access(24, 2) = 2.*(-1.+ (y*y))*z;
685  output.access(24, 3) = (1.+ 2.*x)*(-1.+ (z*z));
686  output.access(24, 4) = 2.*(1.+ 2.*x)*y*z;
687  output.access(24, 5) = (1.+ 2.*x)*(-1.+ (y*y));
688  output.access(24, 6) = 0.;
689  output.access(24, 7) = 2.*x*(1.+ x)*z;
690  output.access(24, 8) = 2.*x*(1.+ x)*y;
691  output.access(24, 9) = 0.;
692 
693  output.access(25, 0) = 0.;
694  output.access(25, 1) = (-1.+ 2.*y)*(-1.+ (z*z));
695  output.access(25, 2) = 2.*(-1.+ y)*y*z;
696  output.access(25, 3) = 2.*x*(-1.+ (z*z));
697  output.access(25, 4) = 2.*x*(-1.+ 2.*y)*z;
698  output.access(25, 5) = 2.*x*(-1.+ y)*y;
699  output.access(25, 6) = 0.;
700  output.access(25, 7) = 2.*(-1.+ (x*x))*z;
701  output.access(25, 8) = (-1.+ (x*x))*(-1.+ 2.*y);
702  output.access(25, 9) = 0.;
703 
704  output.access(26, 0) = 0.;
705  output.access(26, 1) = (1.+ 2.*y)*(-1.+ (z*z));
706  output.access(26, 2) = 2.*y*(1.+ y)*z;
707  output.access(26, 3) = 2.*x*(-1.+ (z*z));
708  output.access(26, 4) = 2.*x*(1.+ 2.*y)*z;
709  output.access(26, 5) = 2.*x*y*(1.+ y);
710  output.access(26, 6) = 0.;
711  output.access(26, 7) = 2.*(-1.+ (x*x))*z;
712  output.access(26, 8) = (-1.+ (x*x))*(1.+ 2.*y);
713  output.access(26, 9) = 0.;
714  break;
715  }
716  case OPERATOR_D4 : {
717  // Non-zero entries have Dk (derivative cardinality) indices {3,4,5,7,8,12}, all other entries are 0.
718  // Intitialize array by zero and then fill only non-zero entries.
719  const ordinal_type jend = output.extent(1);
720  const ordinal_type iend = output.extent(0);
721 
722  for (ordinal_type j=0;j<jend;++j)
723  for (ordinal_type i=0;i<iend;++i)
724  output.access(i, j) = 0.0;
725 
726  const auto x = input(0);
727  const auto y = input(1);
728  const auto z = input(2);
729  output.access(0, 3) = ((-1.+ z)*z)/2.;
730  output.access(0, 4) = ((-1.+ 2.*y)*(-1.+ 2.*z))/4.;
731  output.access(0, 5) = ((-1.+ y)*y)/2.;
732  output.access(0, 7) = ((-1.+ 2.*x)*(-1.+ 2.*z))/4.;
733  output.access(0, 8) = ((-1.+ 2.*x)*(-1.+ 2.*y))/4.;
734  output.access(0, 12)= ((-1.+ x)*x)/2.;
735 
736  output.access(1, 3) = ((-1.+ z)*z)/2.;
737  output.access(1, 4) = ((-1.+ 2.*y)*(-1.+ 2.*z))/4.;
738  output.access(1, 5) = ((-1.+ y)*y)/2.;
739  output.access(1, 7) = ((1. + 2.*x)*(-1.+ 2.*z))/4.;
740  output.access(1, 8) = ((1. + 2.*x)*(-1.+ 2.*y))/4.;
741  output.access(1, 12)= (x*(1. + x))/2.;
742 
743  output.access(2, 3) = ((-1.+ z)*z)/2.;
744  output.access(2, 4) = ((1. + 2.*y)*(-1.+ 2.*z))/4.;
745  output.access(2, 5) = (y*(1. + y))/2.;
746  output.access(2, 7) = ((1. + 2.*x)*(-1.+ 2.*z))/4.;
747  output.access(2, 8) = ((1. + 2.*x)*(1. + 2.*y))/4.;
748  output.access(2, 12)= (x*(1. + x))/2.;
749 
750  output.access(3, 3) = ((-1.+ z)*z)/2.;
751  output.access(3, 4) = ((1. + 2.*y)*(-1.+ 2.*z))/4.;
752  output.access(3, 5) = (y*(1. + y))/2.;
753  output.access(3, 7) = ((-1.+ 2.*x)*(-1.+ 2.*z))/4.;
754  output.access(3, 8) = ((-1.+ 2.*x)*(1. + 2.*y))/4.;
755  output.access(3, 12)= ((-1.+ x)*x)/2.;
756 
757  output.access(4, 3) = (z*(1. + z))/2.;
758  output.access(4, 4) = ((-1.+ 2.*y)*(1. + 2.*z))/4.;
759  output.access(4, 5) = ((-1.+ y)*y)/2.;
760  output.access(4, 7) = ((-1.+ 2.*x)*(1. + 2.*z))/4.;
761  output.access(4, 8) = ((-1.+ 2.*x)*(-1.+ 2.*y))/4.;
762  output.access(4, 12)= ((-1.+ x)*x)/2.;
763 
764  output.access(5, 3) = (z*(1. + z))/2.;
765  output.access(5, 4) = ((-1.+ 2.*y)*(1. + 2.*z))/4.;
766  output.access(5, 5) = ((-1.+ y)*y)/2.;
767  output.access(5, 7) = ((1. + 2.*x)*(1. + 2.*z))/4.;
768  output.access(5, 8) = ((1. + 2.*x)*(-1.+ 2.*y))/4.;
769  output.access(5, 12)= (x*(1. + x))/2.;
770 
771  output.access(6, 3) = (z*(1. + z))/2.;
772  output.access(6, 4) = ((1. + 2.*y)*(1. + 2.*z))/4.;
773  output.access(6, 5) = (y*(1. + y))/2.;
774  output.access(6, 7) = ((1. + 2.*x)*(1. + 2.*z))/4.;
775  output.access(6, 8) = ((1. + 2.*x)*(1. + 2.*y))/4.;
776  output.access(6, 12)= (x*(1. + x))/2.;
777 
778  output.access(7, 3) = (z*(1. + z))/2.;
779  output.access(7, 4) = ((1. + 2.*y)*(1. + 2.*z))/4.;
780  output.access(7, 5) = (y*(1. + y))/2.;
781  output.access(7, 7) = ((-1.+ 2.*x)*(1. + 2.*z))/4.;
782  output.access(7, 8) = ((-1.+ 2.*x)*(1. + 2.*y))/4.;
783  output.access(7, 12)= ((-1.+ x)*x)/2.;
784 
785  output.access(8, 3) = -((-1.+ z)*z);
786  output.access(8, 4) = -0.5 + y + z - 2.*y*z;
787  output.access(8, 5) = -((-1.+ y)*y);
788  output.access(8, 7) = x - 2.*x*z;
789  output.access(8, 8) = x - 2.*x*y;
790  output.access(8, 12)= 1. - x*x;
791 
792  output.access(9, 3) = -((-1.+ z)*z);
793  output.access(9, 4) = y - 2.*y*z;
794  output.access(9, 5) = 1 - y*y;
795  output.access(9, 7) = 0.5 + x - z - 2.*x*z;
796  output.access(9, 8) = -((1. + 2.*x)*y);
797  output.access(9, 12)= -(x*(1. + x));
798 
799  output.access(10, 3) = -((-1.+ z)*z);
800  output.access(10, 4) = 0.5 + y - z - 2.*y*z;
801  output.access(10, 5) = -(y*(1. + y));
802  output.access(10, 7) = x - 2.*x*z;
803  output.access(10, 8) = -(x*(1. + 2.*y));
804  output.access(10, 12)= 1. - x*x;
805 
806  output.access(11, 3) = -((-1.+ z)*z);
807  output.access(11, 4) = y - 2.*y*z;
808  output.access(11, 5) = 1. - y*y;
809  output.access(11, 7) = -0.5 + x + z - 2.*x*z;
810  output.access(11, 8) = y - 2.*x*y;
811  output.access(11, 12)= -((-1.+ x)*x);
812 
813  output.access(12, 3) = 1. - z*z;
814  output.access(12, 4) = z - 2.*y*z;
815  output.access(12, 5) = -((-1.+ y)*y);
816  output.access(12, 7) = z - 2.*x*z;
817  output.access(12, 8) = -0.5 + x + y - 2.*x*y;
818  output.access(12, 12)= -((-1.+ x)*x);
819 
820  output.access(13, 3) = 1. - z*z;
821  output.access(13, 4) = z - 2.*y*z;
822  output.access(13, 5) = -((-1.+ y)*y);
823  output.access(13, 7) = -((1. + 2.*x)*z);
824  output.access(13, 8) = 0.5 + x - y - 2.*x*y;
825  output.access(13, 12)= -(x*(1. + x));
826 
827  output.access(14, 3) = 1. - z*z;
828  output.access(14, 4) = -((1. + 2.*y)*z);
829  output.access(14, 5) = -(y*(1. + y));
830  output.access(14, 7) = -((1. + 2.*x)*z);
831  output.access(14, 8) = -((1. + 2.*x)*(1. + 2.*y))/2.;
832  output.access(14, 12)= -(x*(1. + x));
833 
834  output.access(15, 3) = 1. - z*z;
835  output.access(15, 4) = -((1. + 2.*y)*z);
836  output.access(15, 5) = -(y*(1. + y));
837  output.access(15, 7) = z - 2.*x*z;
838  output.access(15, 8) = 0.5 + y - x*(1. + 2.*y);
839  output.access(15, 12)= -((-1.+ x)*x);
840 
841  output.access(16, 3) = -(z*(1. + z));
842  output.access(16, 4) = 0.5 + z - y*(1. + 2.*z);
843  output.access(16, 5) = -((-1.+ y)*y);
844  output.access(16, 7) = -(x*(1. + 2.*z));
845  output.access(16, 8) = x - 2.*x*y;
846  output.access(16, 12)= 1. - x*x;
847 
848  output.access(17, 3) = -(z*(1. + z));
849  output.access(17, 4) = -(y*(1. + 2.*z));
850  output.access(17, 5) = 1. - y*y;
851  output.access(17, 7) = -((1. + 2.*x)*(1. + 2.*z))/2.;
852  output.access(17, 8) = -((1. + 2.*x)*y);
853  output.access(17, 12)= -(x*(1. + x));
854 
855  output.access(18, 3) = -(z*(1. + z));
856  output.access(18, 4) = -((1. + 2.*y)*(1. + 2.*z))/2.;
857  output.access(18, 5) = -(y*(1. + y));
858  output.access(18, 7) = -(x*(1. + 2.*z));
859  output.access(18, 8) = -(x*(1. + 2.*y));
860  output.access(18, 12)= 1. - x*x;
861 
862  output.access(19, 3) = -(z*(1. + z));
863  output.access(19, 4) = -(y*(1. + 2.*z));
864  output.access(19, 5) = 1. - y*y;
865  output.access(19, 7) = 0.5 + z - x*(1. + 2.*z);
866  output.access(19, 8) = y - 2.*x*y;
867  output.access(19, 12)= -((-1.+ x)*x);
868 
869  output.access(20, 3) = 4. - 4.*z*z;
870  output.access(20, 4) = -8.*y*z;
871  output.access(20, 5) = 4. - 4.*y*y;
872  output.access(20, 7) = -8.*x*z;
873  output.access(20, 8) = -8.*x*y;
874  output.access(20, 12)= 4. - 4.*x*x;
875 
876  output.access(21, 3) = 2.*(-1.+ z)*z;
877  output.access(21, 4) = 2.*y*(-1.+ 2.*z);
878  output.access(21, 5) = 2.*(-1.+ y*y);
879  output.access(21, 7) = 2.*x*(-1.+ 2.*z);
880  output.access(21, 8) = 4.*x*y;
881  output.access(21, 12)= 2.*(-1.+ x*x);
882 
883  output.access(22, 3) = 2.*z*(1. + z);
884  output.access(22, 4) = 2.*(y + 2.*y*z);
885  output.access(22, 5) = 2.*(-1.+ y*y);
886  output.access(22, 7) = 2.*(x + 2.*x*z);
887  output.access(22, 8) = 4.*x*y;
888  output.access(22, 12)= 2.*(-1.+ x*x);
889 
890  output.access(23, 3) = 2.*(-1.+ z*z);
891  output.access(23, 4) = 4.*y*z;
892  output.access(23, 5) = 2.*(-1.+ y*y);
893  output.access(23, 7) = 2.*(-1.+ 2.*x)*z;
894  output.access(23, 8) = 2.*(-1.+ 2.*x)*y;
895  output.access(23, 12)= 2.*(-1.+ x)*x;
896 
897  output.access(24, 3) = 2.*(-1.+ z*z);
898  output.access(24, 4) = 4.*y*z;
899  output.access(24, 5) = 2.*(-1.+ y*y);
900  output.access(24, 7) = 2.*(z + 2.*x*z);
901  output.access(24, 8) = 2.*(y + 2.*x*y);
902  output.access(24, 12)= 2.*x*(1. + x);
903 
904  output.access(25, 3) = 2.*(-1.+ z*z);
905  output.access(25, 4) = 2.*(-1.+ 2.*y)*z;
906  output.access(25, 5) = 2.*(-1.+ y)*y;
907  output.access(25, 7) = 4.*x*z;
908  output.access(25, 8) = 2.*x*(-1.+ 2.*y);
909  output.access(25, 12)= 2.*(-1.+ x*x);
910 
911  output.access(26, 3) = 2.*(-1.+ z*z);
912  output.access(26, 4) = 2.*(z + 2.*y*z);
913  output.access(26, 5) = 2.*y*(1. + y);
914  output.access(26, 7) = 4.*x*z;
915  output.access(26, 8) = 2.*(x + 2.*x*y);
916  output.access(26, 12)= 2.*(-1.+ x*x);
917 
918  break;
919  }
920  case OPERATOR_MAX : {
921  const ordinal_type jend = output.extent(1);
922  const ordinal_type iend = output.extent(0);
923 
924  for (ordinal_type j=0;j<jend;++j)
925  for (ordinal_type i=0;i<iend;++i)
926  output.access(i, j) = 0.0;
927  break;
928  }
929  default: {
930  INTREPID2_TEST_FOR_ABORT( opType != OPERATOR_VALUE &&
931  opType != OPERATOR_GRAD &&
932  opType != OPERATOR_CURL &&
933  opType != OPERATOR_D1 &&
934  opType != OPERATOR_D2 &&
935  opType != OPERATOR_D3 &&
936  opType != OPERATOR_D4 &&
937  opType != OPERATOR_MAX,
938  ">>> ERROR: (Intrepid2::Basis_HGRAD_HEX_C2_FEM::Serial::getValues) operator is not supported");
939 
940  }
941  }
942  }
943 
944  template<typename SpT,
945  typename outputValueValueType, class ...outputValueProperties,
946  typename inputPointValueType, class ...inputPointProperties>
947  void
948  Basis_HGRAD_HEX_C2_FEM::
949  getValues( Kokkos::DynRankView<outputValueValueType,outputValueProperties...> outputValues,
950  const Kokkos::DynRankView<inputPointValueType, inputPointProperties...> inputPoints,
951  const EOperator operatorType ) {
952  typedef Kokkos::DynRankView<outputValueValueType,outputValueProperties...> outputValueViewType;
953  typedef Kokkos::DynRankView<inputPointValueType, inputPointProperties...> inputPointViewType;
954  typedef typename ExecSpace<typename inputPointViewType::execution_space,SpT>::ExecSpaceType ExecSpaceType;
955 
956  // Number of evaluation points = dim 0 of inputPoints
957  const auto loopSize = inputPoints.extent(0);
958  Kokkos::RangePolicy<ExecSpaceType,Kokkos::Schedule<Kokkos::Static> > policy(0, loopSize);
959 
960  switch (operatorType) {
961 
962  case OPERATOR_VALUE: {
963  typedef Functor<outputValueViewType,inputPointViewType,OPERATOR_VALUE> FunctorType;
964  Kokkos::parallel_for( policy, FunctorType(outputValues, inputPoints) );
965  break;
966  }
967  case OPERATOR_GRAD:
968  case OPERATOR_D1: {
969  typedef Functor<outputValueViewType,inputPointViewType,OPERATOR_GRAD> FunctorType;
970  Kokkos::parallel_for( policy, FunctorType(outputValues, inputPoints) );
971  break;
972  }
973  case OPERATOR_CURL:
974  INTREPID2_TEST_FOR_EXCEPTION( (operatorType == OPERATOR_CURL), std::invalid_argument,
975  ">>> ERROR (Basis_HGRAD_HEX_C2_FEM): CURL is invalid operator for rank-0 (scalar) functions in 3D");
976  break;
977 
978  case OPERATOR_DIV:
979  INTREPID2_TEST_FOR_EXCEPTION( (operatorType == OPERATOR_DIV), std::invalid_argument,
980  ">>> ERROR (Basis_HGRAD_HEX_C2_FEM): DIV is invalid operator for rank-0 (scalar) functions in 3D");
981  break;
982 
983  case OPERATOR_D2: {
984  typedef Functor<outputValueViewType,inputPointViewType,OPERATOR_D2> FunctorType;
985  Kokkos::parallel_for( policy, FunctorType(outputValues, inputPoints) );
986  break;
987  }
988  case OPERATOR_D3: {
989  typedef Functor<outputValueViewType,inputPointViewType,OPERATOR_D3> FunctorType;
990  Kokkos::parallel_for( policy, FunctorType(outputValues, inputPoints) );
991  break;
992  }
993  case OPERATOR_D4: {
994  typedef Functor<outputValueViewType,inputPointViewType,OPERATOR_D4> FunctorType;
995  Kokkos::parallel_for( policy, FunctorType(outputValues, inputPoints) );
996  break;
997  }
998  case OPERATOR_D5:
999  case OPERATOR_D6: {
1000  INTREPID2_TEST_FOR_EXCEPTION( true, std::invalid_argument,
1001  ">>> ERROR (Basis_HGRAD_HEX_C2_FEM): operator not supported");
1002  // break; commented out becuase this always throws
1003  }
1004  case OPERATOR_D7:
1005  case OPERATOR_D8:
1006  case OPERATOR_D9:
1007  case OPERATOR_D10: {
1008  typedef Functor<outputValueViewType,inputPointViewType,OPERATOR_MAX> FunctorType;
1009  Kokkos::parallel_for( policy, FunctorType(outputValues, inputPoints) );
1010  break;
1011  }
1012  default: {
1013  INTREPID2_TEST_FOR_EXCEPTION( !( Intrepid2::isValidOperator(operatorType) ), std::invalid_argument,
1014  ">>> ERROR (Basis_HGRAD_HEX_C2_FEM): Invalid operator type");
1015  }
1016  }
1017  }
1018 
1019  }
1020 
1021  // -------------------------------------------------------------------------------------
1022 
1023  template<typename SpT, typename OT, typename PT>
1026  this -> basisCardinality_ = 27;
1027  this -> basisDegree_ = 2;
1028  this -> basisCellTopology_ = shards::CellTopology(shards::getCellTopologyData<shards::Hexahedron<8> >() );
1029  this -> basisType_ = BASIS_FEM_DEFAULT;
1030  this -> basisCoordinates_ = COORDINATES_CARTESIAN;
1031  this->functionSpace_ = FUNCTION_SPACE_HGRAD;
1032 
1033  // initialize tags
1034  {
1035  // Basis-dependent intializations
1036  const ordinal_type tagSize = 4; // size of DoF tag, i.e., number of fields in the tag
1037  const ordinal_type posScDim = 0; // position in the tag, counting from 0, of the subcell dim
1038  const ordinal_type posScOrd = 1; // position in the tag, counting from 0, of the subcell ordinal
1039  const ordinal_type posDfOrd = 2; // position in the tag, counting from 0, of DoF ordinal relative to the subcell
1040 
1041  // An array with local DoF tags assigned to basis functions, in the order of their local enumeration
1042  ordinal_type tags[108] = { 0, 0, 0, 1, // Nodes 0 to 7 follow vertex order of the topology
1043  0, 1, 0, 1,
1044  0, 2, 0, 1,
1045  0, 3, 0, 1,
1046  0, 4, 0, 1,
1047  0, 5, 0, 1,
1048  0, 6, 0, 1,
1049  0, 7, 0, 1,
1050  1, 0, 0, 1, // Node 8 -> edge 0
1051  1, 1, 0, 1, // Node 9 -> edge 1
1052  1, 2, 0, 1, // Node 10 -> edge 2
1053  1, 3, 0, 1, // Node 11 -> edge 3
1054  1, 8, 0, 1, // Node 12 -> edge 8
1055  1, 9, 0, 1, // Node 13 -> edge 9
1056  1,10, 0, 1, // Node 14 -> edge 10
1057  1,11, 0, 1, // Node 15 -> edge 11
1058  1, 4, 0, 1, // Node 16 -> edge 4
1059  1, 5, 0, 1, // Node 17 -> edge 5
1060  1, 6, 0, 1, // Node 18 -> edge 6
1061  1, 7, 0, 1, // Node 19 -> edge 7
1062  3, 0, 0, 1, // Node 20 -> Hexahedron
1063  2, 4, 0, 1, // Node 21 -> face 4
1064  2, 5, 0, 1, // Node 22 -> face 5
1065  2, 3, 0, 1, // Node 23 -> face 3
1066  2, 1, 0, 1, // Node 24 -> face 1
1067  2, 0, 0, 1, // Node 25 -> face 0
1068  2, 2, 0, 1, // Node 26 -> face 2
1069  };
1070 
1071  // host tags
1072  OrdinalTypeArray1DHost tagView(&tags[0], 108);
1073 
1074  // Basis-independent function sets tag and enum data in tagToOrdinal_ and ordinalToTag_ arrays:
1075  this->setOrdinalTagData(this -> tagToOrdinal_,
1076  this -> ordinalToTag_,
1077  tagView,
1078  this -> basisCardinality_,
1079  tagSize,
1080  posScDim,
1081  posScOrd,
1082  posDfOrd);
1083  }
1084  // dofCoords on host and create its mirror view to device
1085  Kokkos::DynRankView<typename ScalarViewType::value_type,typename SpT::array_layout,Kokkos::HostSpace>
1086  dofCoords("dofCoordsHost", this->basisCardinality_,this->basisCellTopology_.getDimension());
1087 
1088  dofCoords(0,0) = -1.0; dofCoords(0,1) = -1.0; dofCoords(0,2) = -1.0;
1089  dofCoords(1,0) = 1.0; dofCoords(1,1) = -1.0; dofCoords(1,2) = -1.0;
1090  dofCoords(2,0) = 1.0; dofCoords(2,1) = 1.0; dofCoords(2,2) = -1.0;
1091  dofCoords(3,0) = -1.0; dofCoords(3,1) = 1.0; dofCoords(3,2) = -1.0;
1092  dofCoords(4,0) = -1.0; dofCoords(4,1) = -1.0; dofCoords(4,2) = 1.0;
1093  dofCoords(5,0) = 1.0; dofCoords(5,1) = -1.0; dofCoords(5,2) = 1.0;
1094  dofCoords(6,0) = 1.0; dofCoords(6,1) = 1.0; dofCoords(6,2) = 1.0;
1095  dofCoords(7,0) = -1.0; dofCoords(7,1) = 1.0; dofCoords(7,2) = 1.0;
1096 
1097  dofCoords(8,0) = 0.0; dofCoords(8,1) = -1.0; dofCoords(8,2) = -1.0;
1098  dofCoords(9,0) = 1.0; dofCoords(9,1) = 0.0; dofCoords(9,2) = -1.0;
1099  dofCoords(10,0) = 0.0; dofCoords(10,1) = 1.0; dofCoords(10,2) = -1.0;
1100  dofCoords(11,0) = -1.0; dofCoords(11,1) = 0.0; dofCoords(11,2) = -1.0;
1101  dofCoords(12,0) = -1.0; dofCoords(12,1) = -1.0; dofCoords(12,2) = 0.0;
1102  dofCoords(13,0) = 1.0; dofCoords(13,1) = -1.0; dofCoords(13,2) = 0.0;
1103  dofCoords(14,0) = 1.0; dofCoords(14,1) = 1.0; dofCoords(14,2) = 0.0;
1104  dofCoords(15,0) = -1.0; dofCoords(15,1) = 1.0; dofCoords(15,2) = 0.0;
1105  dofCoords(16,0) = 0.0; dofCoords(16,1) = -1.0; dofCoords(16,2) = 1.0;
1106  dofCoords(17,0) = 1.0; dofCoords(17,1) = 0.0; dofCoords(17,2) = 1.0;
1107  dofCoords(18,0) = 0.0; dofCoords(18,1) = 1.0; dofCoords(18,2) = 1.0;
1108  dofCoords(19,0) = -1.0; dofCoords(19,1) = 0.0; dofCoords(19,2) = 1.0;
1109 
1110  dofCoords(20,0) = 0.0; dofCoords(20,1) = 0.0; dofCoords(20,2) = 0.0;
1111 
1112  dofCoords(21,0) = 0.0; dofCoords(21,1) = 0.0; dofCoords(21,2) = -1.0;
1113  dofCoords(22,0) = 0.0; dofCoords(22,1) = 0.0; dofCoords(22,2) = 1.0;
1114  dofCoords(23,0) = -1.0; dofCoords(23,1) = 0.0; dofCoords(23,2) = 0.0;
1115  dofCoords(24,0) = 1.0; dofCoords(24,1) = 0.0; dofCoords(24,2) = 0.0;
1116  dofCoords(25,0) = 0.0; dofCoords(25,1) = -1.0; dofCoords(25,2) = 0.0;
1117  dofCoords(26,0) = 0.0; dofCoords(26,1) = 1.0; dofCoords(26,2) = 0.0;
1118 
1119  this->dofCoords_ = Kokkos::create_mirror_view(typename SpT::memory_space(), dofCoords);
1120  Kokkos::deep_copy(this->dofCoords_, dofCoords);
1121 
1122  }
1123 
1124 }// namespace Intrepid2
1125 #endif
Kokkos::View< ordinal_type *, typename ExecSpaceType::array_layout, Kokkos::HostSpace > OrdinalTypeArray1DHost
View type for 1d host array.