xref: /petsc/src/dm/dt/space/impls/wxy/spacewxy.c (revision 69cc43acf904673348835f1e68d7a5ddf92b44cb)
1*69cc43acSMatthew G. Knepley #include <petsc/private/petscfeimpl.h> /*I "petscfe.h" I*/
2*69cc43acSMatthew G. Knepley 
3*69cc43acSMatthew G. Knepley static PetscErrorCode PetscSpaceSetFromOptions_WXY(PetscOptionItems *PetscOptionsObject,PetscSpace sp)
4*69cc43acSMatthew G. Knepley {
5*69cc43acSMatthew G. Knepley   PetscErrorCode ierr;
6*69cc43acSMatthew G. Knepley 
7*69cc43acSMatthew G. Knepley   PetscFunctionBegin;
8*69cc43acSMatthew G. Knepley   ierr = PetscOptionsHead(PetscOptionsObject,"PetscSpace WXY options");CHKERRQ(ierr);
9*69cc43acSMatthew G. Knepley   ierr = PetscOptionsTail();CHKERRQ(ierr);
10*69cc43acSMatthew G. Knepley   PetscFunctionReturn(0);
11*69cc43acSMatthew G. Knepley }
12*69cc43acSMatthew G. Knepley 
13*69cc43acSMatthew G. Knepley static PetscErrorCode PetscSpacePolynomialView_Ascii(PetscSpace sp, PetscViewer v)
14*69cc43acSMatthew G. Knepley {
15*69cc43acSMatthew G. Knepley   PetscErrorCode ierr;
16*69cc43acSMatthew G. Knepley 
17*69cc43acSMatthew G. Knepley   PetscFunctionBegin;
18*69cc43acSMatthew G. Knepley   ierr = PetscViewerASCIIPrintf(v, "WXY space of degree %" PetscInt_FMT "\n", sp->degree);CHKERRQ(ierr);
19*69cc43acSMatthew G. Knepley   PetscFunctionReturn(0);
20*69cc43acSMatthew G. Knepley }
21*69cc43acSMatthew G. Knepley 
22*69cc43acSMatthew G. Knepley static PetscErrorCode PetscSpaceView_WXY(PetscSpace sp, PetscViewer viewer)
23*69cc43acSMatthew G. Knepley {
24*69cc43acSMatthew G. Knepley   PetscBool      iascii;
25*69cc43acSMatthew G. Knepley   PetscErrorCode ierr;
26*69cc43acSMatthew G. Knepley 
27*69cc43acSMatthew G. Knepley   PetscFunctionBegin;
28*69cc43acSMatthew G. Knepley   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
29*69cc43acSMatthew G. Knepley   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
30*69cc43acSMatthew G. Knepley   ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERASCII, &iascii);CHKERRQ(ierr);
31*69cc43acSMatthew G. Knepley   if (iascii) {ierr = PetscSpacePolynomialView_Ascii(sp, viewer);CHKERRQ(ierr);}
32*69cc43acSMatthew G. Knepley   PetscFunctionReturn(0);
33*69cc43acSMatthew G. Knepley }
34*69cc43acSMatthew G. Knepley 
35*69cc43acSMatthew G. Knepley static PetscErrorCode PetscSpaceDestroy_WXY(PetscSpace sp)
36*69cc43acSMatthew G. Knepley {
37*69cc43acSMatthew G. Knepley   PetscSpace_WXY *wxy = (PetscSpace_WXY *) sp->data;
38*69cc43acSMatthew G. Knepley   PetscErrorCode   ierr;
39*69cc43acSMatthew G. Knepley 
40*69cc43acSMatthew G. Knepley   PetscFunctionBegin;
41*69cc43acSMatthew G. Knepley   ierr = PetscFree(wxy);CHKERRQ(ierr);
42*69cc43acSMatthew G. Knepley   PetscFunctionReturn(0);
43*69cc43acSMatthew G. Knepley }
44*69cc43acSMatthew G. Knepley 
45*69cc43acSMatthew G. Knepley static PetscErrorCode PetscSpaceSetUp_WXY(PetscSpace sp)
46*69cc43acSMatthew G. Knepley {
47*69cc43acSMatthew G. Knepley   PetscSpace_WXY *wxy = (PetscSpace_WXY *) sp->data;
48*69cc43acSMatthew G. Knepley 
49*69cc43acSMatthew G. Knepley   PetscFunctionBegin;
50*69cc43acSMatthew G. Knepley   if (wxy->setupCalled) PetscFunctionReturn(0);
51*69cc43acSMatthew G. Knepley   PetscCheck(sp->degree >= 0, PetscObjectComm((PetscObject)sp), PETSC_ERR_ARG_OUTOFRANGE, "Negative degree %" PetscInt_FMT " invalid\n", sp->degree);
52*69cc43acSMatthew G. Knepley   sp->maxDegree = sp->degree;
53*69cc43acSMatthew G. Knepley   wxy->setupCalled = PETSC_TRUE;
54*69cc43acSMatthew G. Knepley   PetscFunctionReturn(0);
55*69cc43acSMatthew G. Knepley }
56*69cc43acSMatthew G. Knepley 
57*69cc43acSMatthew G. Knepley static PetscErrorCode PetscSpaceGetDimension_WXY(PetscSpace sp, PetscInt *dim)
58*69cc43acSMatthew G. Knepley {
59*69cc43acSMatthew G. Knepley   PetscFunctionBegin;
60*69cc43acSMatthew G. Knepley   *dim = 6;
61*69cc43acSMatthew G. Knepley   PetscFunctionReturn(0);
62*69cc43acSMatthew G. Knepley }
63*69cc43acSMatthew G. Knepley 
64*69cc43acSMatthew G. Knepley static PetscErrorCode PetscSpaceEvaluate_WXY(PetscSpace sp, PetscInt npoints, const PetscReal points[], PetscReal B[], PetscReal D[], PetscReal H[])
65*69cc43acSMatthew G. Knepley {
66*69cc43acSMatthew G. Knepley   PetscSpace_WXY *wxy = (PetscSpace_WXY *) sp->data;
67*69cc43acSMatthew G. Knepley   PetscInt        dim = sp->Nv;
68*69cc43acSMatthew G. Knepley   PetscInt        Nb  = 6;
69*69cc43acSMatthew G. Knepley   PetscInt        Nc  = 3;
70*69cc43acSMatthew G. Knepley 
71*69cc43acSMatthew G. Knepley   PetscFunctionBegin;
72*69cc43acSMatthew G. Knepley   if (!wxy->setupCalled) {
73*69cc43acSMatthew G. Knepley     PetscErrorCode ierr;
74*69cc43acSMatthew G. Knepley     ierr = PetscSpaceSetUp(sp);CHKERRQ(ierr);
75*69cc43acSMatthew G. Knepley     ierr = PetscSpaceEvaluate(sp, npoints, points, B, D, H);CHKERRQ(ierr);
76*69cc43acSMatthew G. Knepley     PetscFunctionReturn(0);
77*69cc43acSMatthew G. Knepley   }
78*69cc43acSMatthew G. Knepley   PetscCheck((sp->Nc == 3) && (sp->Nv == 3), PETSC_COMM_SELF, PETSC_ERR_PLIB, "WXY space must have 3 variables and 3 components");
79*69cc43acSMatthew G. Knepley   if (B) {
80*69cc43acSMatthew G. Knepley     PetscInt p_inc = Nb*Nc;
81*69cc43acSMatthew G. Knepley     PetscInt b_inc = Nc;
82*69cc43acSMatthew G. Knepley     PetscInt c_inc = 1;
83*69cc43acSMatthew G. Knepley 
84*69cc43acSMatthew G. Knepley     for (PetscInt p = 0; p < npoints; p++) {
85*69cc43acSMatthew G. Knepley       const PetscReal x = points[p*dim+0];
86*69cc43acSMatthew G. Knepley       const PetscReal y = points[p*dim+1];
87*69cc43acSMatthew G. Knepley       const PetscReal z = points[p*dim+2];
88*69cc43acSMatthew G. Knepley 
89*69cc43acSMatthew G. Knepley       /* {2 y z, 0, 0} */
90*69cc43acSMatthew G. Knepley       B[p*p_inc + 0*b_inc + 0*c_inc] = 2.*y*z;
91*69cc43acSMatthew G. Knepley       B[p*p_inc + 0*b_inc + 1*c_inc] = 0.;
92*69cc43acSMatthew G. Knepley       B[p*p_inc + 0*b_inc + 2*c_inc] = 0.;
93*69cc43acSMatthew G. Knepley       /* {0, 2 x z, 0} */
94*69cc43acSMatthew G. Knepley       B[p*p_inc + 1*b_inc + 0*c_inc] = 0.;
95*69cc43acSMatthew G. Knepley       B[p*p_inc + 1*b_inc + 1*c_inc] = 2.*x*z;
96*69cc43acSMatthew G. Knepley       B[p*p_inc + 1*b_inc + 2*c_inc] = 0.;
97*69cc43acSMatthew G. Knepley       /* {0, 2 y z, -z^2} */
98*69cc43acSMatthew G. Knepley       B[p*p_inc + 2*b_inc + 0*c_inc] = 0.;
99*69cc43acSMatthew G. Knepley       B[p*p_inc + 2*b_inc + 1*c_inc] = 2.*y*z;
100*69cc43acSMatthew G. Knepley       B[p*p_inc + 2*b_inc + 2*c_inc] = -z*z;
101*69cc43acSMatthew G. Knepley       /* {2 x z, 0, -z^2} */
102*69cc43acSMatthew G. Knepley       B[p*p_inc + 3*b_inc + 0*c_inc] = 2.*x*z;
103*69cc43acSMatthew G. Knepley       B[p*p_inc + 3*b_inc + 1*c_inc] = 0.;
104*69cc43acSMatthew G. Knepley       B[p*p_inc + 3*b_inc + 2*c_inc] = -z*z;
105*69cc43acSMatthew G. Knepley       /* {x^2, x y, -3 x z} */
106*69cc43acSMatthew G. Knepley       B[p*p_inc + 4*b_inc + 0*c_inc] = x*x;
107*69cc43acSMatthew G. Knepley       B[p*p_inc + 4*b_inc + 1*c_inc] = x*y;
108*69cc43acSMatthew G. Knepley       B[p*p_inc + 4*b_inc + 2*c_inc] = -3.*x*z;
109*69cc43acSMatthew G. Knepley       /* {x y, y^2, -3 y z} */
110*69cc43acSMatthew G. Knepley       B[p*p_inc + 5*b_inc + 0*c_inc] = x*y;
111*69cc43acSMatthew G. Knepley       B[p*p_inc + 5*b_inc + 1*c_inc] = y*y;
112*69cc43acSMatthew G. Knepley       B[p*p_inc + 5*b_inc + 2*c_inc] = -3.*y*z;
113*69cc43acSMatthew G. Knepley     }
114*69cc43acSMatthew G. Knepley   }
115*69cc43acSMatthew G. Knepley   if (D) {
116*69cc43acSMatthew G. Knepley     PetscInt p_inc = Nb*Nc*dim;
117*69cc43acSMatthew G. Knepley     PetscInt b_inc = Nc*dim;
118*69cc43acSMatthew G. Knepley     PetscInt c_inc = dim;
119*69cc43acSMatthew G. Knepley 
120*69cc43acSMatthew G. Knepley     for (PetscInt p = 0; p < npoints; p++) {
121*69cc43acSMatthew G. Knepley       const PetscReal x = points[p*dim+0];
122*69cc43acSMatthew G. Knepley       const PetscReal y = points[p*dim+1];
123*69cc43acSMatthew G. Knepley       const PetscReal z = points[p*dim+2];
124*69cc43acSMatthew G. Knepley 
125*69cc43acSMatthew G. Knepley       /* {2 y z, 0, 0} */
126*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 0*c_inc + 0] = 0.;
127*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 0*c_inc + 1] = 2.*z;
128*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 0*c_inc + 2] = 2.*y;
129*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 1*c_inc + 0] = 0.;
130*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 1*c_inc + 1] = 0.;
131*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 1*c_inc + 2] = 0.;
132*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 2*c_inc + 0] = 0.;
133*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 2*c_inc + 1] = 0.;
134*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 2*c_inc + 2] = 0.;
135*69cc43acSMatthew G. Knepley       /* {0, 2 x z, 0} */
136*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 0*c_inc + 0] = 0.;
137*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 0*c_inc + 1] = 0.;
138*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 0*c_inc + 2] = 0.;
139*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 1*c_inc + 0] = 2.*z;
140*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 1*c_inc + 1] = 0.;
141*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 1*c_inc + 2] = 2.*x;
142*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 2*c_inc + 0] = 0.;
143*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 2*c_inc + 1] = 0.;
144*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 2*c_inc + 2] = 0.;
145*69cc43acSMatthew G. Knepley       /* {0, 2 y z, -z^2} */
146*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 0*c_inc + 0] = 0.;
147*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 0*c_inc + 1] = 0.;
148*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 0*c_inc + 2] = 0.;
149*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 1*c_inc + 0] = 0.;
150*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 1*c_inc + 1] = 2.*z;
151*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 1*c_inc + 2] = 2.*y;
152*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 2*c_inc + 0] = 0.;
153*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 2*c_inc + 1] = 0.;
154*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 2*c_inc + 2] = -2.*z;
155*69cc43acSMatthew G. Knepley       /* {2 x z, 0, -z^2} */
156*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 0*c_inc + 0] = 2.*z;
157*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 0*c_inc + 1] = 0.;
158*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 0*c_inc + 2] = 2.*x;
159*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 1*c_inc + 0] = 0.;
160*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 1*c_inc + 1] = 0.;
161*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 1*c_inc + 2] = 0.;
162*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 2*c_inc + 0] = 0.;
163*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 2*c_inc + 1] = 0.;
164*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 2*c_inc + 2] = -2.*z;
165*69cc43acSMatthew G. Knepley       /* {x^2, x y, -3 x z} */
166*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 0*c_inc + 0] = 2.*x;
167*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 0*c_inc + 1] = 0.;
168*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 0*c_inc + 2] = 0.;
169*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 1*c_inc + 0] = y;
170*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 1*c_inc + 1] = x;
171*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 1*c_inc + 2] = 0.;
172*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 2*c_inc + 0] = -3.*z;
173*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 2*c_inc + 1] = 0.;
174*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 2*c_inc + 2] = -3.*x;
175*69cc43acSMatthew G. Knepley       /* {x y, y^2, -3 y z} */
176*69cc43acSMatthew G. Knepley       D[p*p_inc + 5*b_inc + 0*c_inc + 0] = y;
177*69cc43acSMatthew G. Knepley       D[p*p_inc + 5*b_inc + 0*c_inc + 1] = x;
178*69cc43acSMatthew G. Knepley       D[p*p_inc + 5*b_inc + 0*c_inc + 2] = 0.;
179*69cc43acSMatthew G. Knepley       D[p*p_inc + 5*b_inc + 1*c_inc + 0] = 0.;
180*69cc43acSMatthew G. Knepley       D[p*p_inc + 5*b_inc + 1*c_inc + 1] = 2.*y;
181*69cc43acSMatthew G. Knepley       D[p*p_inc + 5*b_inc + 1*c_inc + 2] = 0.;
182*69cc43acSMatthew G. Knepley       D[p*p_inc + 5*b_inc + 2*c_inc + 0] = 0.;
183*69cc43acSMatthew G. Knepley       D[p*p_inc + 5*b_inc + 2*c_inc + 1] = -3.*z;
184*69cc43acSMatthew G. Knepley       D[p*p_inc + 5*b_inc + 2*c_inc + 2] = -3.*y;
185*69cc43acSMatthew G. Knepley     }
186*69cc43acSMatthew G. Knepley   }
187*69cc43acSMatthew G. Knepley   if (H) {
188*69cc43acSMatthew G. Knepley     PetscInt p_inc = Nb*Nc*dim*dim;
189*69cc43acSMatthew G. Knepley     PetscInt b_inc = Nc*dim*dim;
190*69cc43acSMatthew G. Knepley     PetscInt c_inc = dim*dim;
191*69cc43acSMatthew G. Knepley 
192*69cc43acSMatthew G. Knepley     for (PetscInt p = 0; p < npoints; p++) {
193*69cc43acSMatthew G. Knepley       /* {2 y z, 0, 0} */
194*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 0*c_inc + 0] = 0.;
195*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 0*c_inc + 1] = 0.;
196*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 0*c_inc + 2] = 0.;
197*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 0*c_inc + 3] = 0.;
198*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 0*c_inc + 4] = 0.;
199*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 0*c_inc + 5] = 2.;
200*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 0*c_inc + 6] = 0.;
201*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 0*c_inc + 7] = 2.;
202*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 0*c_inc + 8] = 0.;
203*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 1*c_inc + 0] = 0.;
204*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 1*c_inc + 1] = 0.;
205*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 1*c_inc + 2] = 0.;
206*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 1*c_inc + 3] = 0.;
207*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 1*c_inc + 4] = 0.;
208*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 1*c_inc + 5] = 0.;
209*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 1*c_inc + 6] = 0.;
210*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 1*c_inc + 7] = 0.;
211*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 1*c_inc + 8] = 0.;
212*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 2*c_inc + 0] = 0.;
213*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 2*c_inc + 1] = 0.;
214*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 2*c_inc + 2] = 0.;
215*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 2*c_inc + 3] = 0.;
216*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 2*c_inc + 4] = 0.;
217*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 2*c_inc + 5] = 0.;
218*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 2*c_inc + 6] = 0.;
219*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 2*c_inc + 7] = 0.;
220*69cc43acSMatthew G. Knepley       D[p*p_inc + 0*b_inc + 2*c_inc + 8] = 0.;
221*69cc43acSMatthew G. Knepley       /* {0, 2 x z, 0} */
222*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 0*c_inc + 0] = 0.;
223*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 0*c_inc + 1] = 0.;
224*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 0*c_inc + 2] = 0.;
225*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 0*c_inc + 3] = 0.;
226*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 0*c_inc + 4] = 0.;
227*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 0*c_inc + 5] = 0.;
228*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 0*c_inc + 6] = 0.;
229*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 0*c_inc + 7] = 0.;
230*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 0*c_inc + 8] = 0.;
231*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 1*c_inc + 0] = 0.;
232*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 1*c_inc + 1] = 0.;
233*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 1*c_inc + 2] = 2.;
234*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 1*c_inc + 3] = 0.;
235*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 1*c_inc + 4] = 0.;
236*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 1*c_inc + 5] = 0.;
237*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 1*c_inc + 6] = 2.;
238*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 1*c_inc + 7] = 0.;
239*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 1*c_inc + 8] = 0.;
240*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 2*c_inc + 0] = 0.;
241*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 2*c_inc + 1] = 0.;
242*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 2*c_inc + 2] = 0.;
243*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 2*c_inc + 3] = 0.;
244*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 2*c_inc + 4] = 0.;
245*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 2*c_inc + 5] = 0.;
246*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 2*c_inc + 6] = 0.;
247*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 2*c_inc + 7] = 0.;
248*69cc43acSMatthew G. Knepley       D[p*p_inc + 1*b_inc + 2*c_inc + 8] = 0.;
249*69cc43acSMatthew G. Knepley       /* {0, 2 y z, -z^2} */
250*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 0*c_inc + 0] = 0.;
251*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 0*c_inc + 1] = 0.;
252*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 0*c_inc + 2] = 0.;
253*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 0*c_inc + 3] = 0.;
254*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 0*c_inc + 4] = 0.;
255*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 0*c_inc + 5] = 0.;
256*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 0*c_inc + 6] = 0.;
257*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 0*c_inc + 7] = 0.;
258*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 0*c_inc + 8] = 0.;
259*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 1*c_inc + 0] = 0.;
260*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 1*c_inc + 1] = 0.;
261*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 1*c_inc + 2] = 0.;
262*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 1*c_inc + 3] = 0.;
263*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 1*c_inc + 4] = 0.;
264*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 1*c_inc + 5] = 2.;
265*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 1*c_inc + 6] = 0.;
266*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 1*c_inc + 7] = 2.;
267*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 1*c_inc + 8] = 0.;
268*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 2*c_inc + 0] = 0.;
269*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 2*c_inc + 1] = 0.;
270*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 2*c_inc + 2] = 0.;
271*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 2*c_inc + 3] = 0.;
272*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 2*c_inc + 4] = 0.;
273*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 2*c_inc + 5] = 0.;
274*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 2*c_inc + 6] = 0.;
275*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 2*c_inc + 7] = 0.;
276*69cc43acSMatthew G. Knepley       D[p*p_inc + 2*b_inc + 2*c_inc + 8] = -2.;
277*69cc43acSMatthew G. Knepley       /* {2 x z, 0, -z^2} */
278*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 0*c_inc + 0] = 0.;
279*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 0*c_inc + 1] = 0.;
280*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 0*c_inc + 2] = 2.;
281*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 0*c_inc + 3] = 0.;
282*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 0*c_inc + 4] = 0.;
283*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 0*c_inc + 5] = 0.;
284*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 0*c_inc + 6] = 2.;
285*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 0*c_inc + 7] = 0.;
286*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 0*c_inc + 8] = 0.;
287*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 1*c_inc + 0] = 0.;
288*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 1*c_inc + 1] = 0.;
289*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 1*c_inc + 2] = 0.;
290*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 1*c_inc + 3] = 0.;
291*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 1*c_inc + 4] = 0.;
292*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 1*c_inc + 5] = 0.;
293*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 1*c_inc + 6] = 0.;
294*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 1*c_inc + 7] = 0.;
295*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 1*c_inc + 8] = 0.;
296*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 2*c_inc + 0] = 0.;
297*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 2*c_inc + 1] = 0.;
298*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 2*c_inc + 2] = 0.;
299*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 2*c_inc + 3] = 0.;
300*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 2*c_inc + 4] = 0.;
301*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 2*c_inc + 5] = 0.;
302*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 2*c_inc + 6] = 0.;
303*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 2*c_inc + 7] = 0.;
304*69cc43acSMatthew G. Knepley       D[p*p_inc + 3*b_inc + 2*c_inc + 8] = -2.;
305*69cc43acSMatthew G. Knepley       /* {x^2, x y, -3 x z} */
306*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 0*c_inc + 0] = 2.;
307*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 0*c_inc + 1] = 0.;
308*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 0*c_inc + 2] = 0.;
309*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 0*c_inc + 3] = 0.;
310*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 0*c_inc + 4] = 0.;
311*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 0*c_inc + 5] = 0.;
312*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 0*c_inc + 6] = 0.;
313*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 0*c_inc + 7] = 0.;
314*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 0*c_inc + 8] = 0.;
315*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 1*c_inc + 0] = 0.;
316*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 1*c_inc + 1] = 1.;
317*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 1*c_inc + 2] = 0.;
318*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 1*c_inc + 3] = 1.;
319*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 1*c_inc + 4] = 0.;
320*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 1*c_inc + 5] = 0.;
321*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 1*c_inc + 6] = 0.;
322*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 1*c_inc + 7] = 0.;
323*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 1*c_inc + 8] = 0.;
324*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 2*c_inc + 0] = 0.;
325*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 2*c_inc + 1] = 0.;
326*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 2*c_inc + 2] = -3.;
327*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 2*c_inc + 3] = 0.;
328*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 2*c_inc + 4] = 0.;
329*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 2*c_inc + 5] = 0.;
330*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 2*c_inc + 6] = -3.;
331*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 2*c_inc + 7] = 0.;
332*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 2*c_inc + 8] = 0.;
333*69cc43acSMatthew G. Knepley       /* {x y, y^2, -3 y z} */
334*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 0*c_inc + 0] = 2.;
335*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 0*c_inc + 1] = 0.;
336*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 0*c_inc + 2] = 0.;
337*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 0*c_inc + 3] = 0.;
338*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 0*c_inc + 4] = 0.;
339*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 0*c_inc + 5] = 0.;
340*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 0*c_inc + 6] = 0.;
341*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 0*c_inc + 7] = 0.;
342*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 0*c_inc + 8] = 0.;
343*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 1*c_inc + 0] = 0.;
344*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 1*c_inc + 1] = 1.;
345*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 1*c_inc + 2] = 0.;
346*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 1*c_inc + 3] = 1.;
347*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 1*c_inc + 4] = 0.;
348*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 1*c_inc + 5] = 0.;
349*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 1*c_inc + 6] = 0.;
350*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 1*c_inc + 7] = 0.;
351*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 1*c_inc + 8] = 0.;
352*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 2*c_inc + 0] = 0.;
353*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 2*c_inc + 1] = 0.;
354*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 2*c_inc + 2] = -3.;
355*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 2*c_inc + 3] = 0.;
356*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 2*c_inc + 4] = 0.;
357*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 2*c_inc + 5] = 0.;
358*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 2*c_inc + 6] = -3.;
359*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 2*c_inc + 7] = 0.;
360*69cc43acSMatthew G. Knepley       D[p*p_inc + 4*b_inc + 2*c_inc + 8] = 0.;
361*69cc43acSMatthew G. Knepley     }
362*69cc43acSMatthew G. Knepley   }
363*69cc43acSMatthew G. Knepley   PetscFunctionReturn(0);
364*69cc43acSMatthew G. Knepley }
365*69cc43acSMatthew G. Knepley 
366*69cc43acSMatthew G. Knepley static PetscErrorCode PetscSpaceGetHeightSubspace_WXY(PetscSpace sp, PetscInt height, PetscSpace *subsp)
367*69cc43acSMatthew G. Knepley {
368*69cc43acSMatthew G. Knepley   SETERRQ(PetscObjectComm((PetscObject) sp), PETSC_ERR_SUP, "Do not know how to do this");
369*69cc43acSMatthew G. Knepley }
370*69cc43acSMatthew G. Knepley 
371*69cc43acSMatthew G. Knepley static PetscErrorCode PetscSpaceInitialize_WXY(PetscSpace sp)
372*69cc43acSMatthew G. Knepley {
373*69cc43acSMatthew G. Knepley   PetscFunctionBegin;
374*69cc43acSMatthew G. Knepley   sp->ops->setfromoptions    = PetscSpaceSetFromOptions_WXY;
375*69cc43acSMatthew G. Knepley   sp->ops->setup             = PetscSpaceSetUp_WXY;
376*69cc43acSMatthew G. Knepley   sp->ops->view              = PetscSpaceView_WXY;
377*69cc43acSMatthew G. Knepley   sp->ops->destroy           = PetscSpaceDestroy_WXY;
378*69cc43acSMatthew G. Knepley   sp->ops->getdimension      = PetscSpaceGetDimension_WXY;
379*69cc43acSMatthew G. Knepley   sp->ops->evaluate          = PetscSpaceEvaluate_WXY;
380*69cc43acSMatthew G. Knepley   sp->ops->getheightsubspace = PetscSpaceGetHeightSubspace_WXY;
381*69cc43acSMatthew G. Knepley   PetscFunctionReturn(0);
382*69cc43acSMatthew G. Knepley }
383*69cc43acSMatthew G. Knepley 
384*69cc43acSMatthew G. Knepley /*MC
385*69cc43acSMatthew G. Knepley   PETSCSPACEWXY = "wxy" - A PetscSpace object that encapsulates the Wheeler-Xu-Yotov enrichments.
386*69cc43acSMatthew G. Knepley $ curl {{0, 0, y^2 z}, {x z^2, 0, 0}, {y z^2, 0, 0}, {0, -x z^2, 0}, {0, -3/2 x^2 z, -1/2 x^2 y}, {3/2 y^2 z, 0, 1/2 y^2 x}}
387*69cc43acSMatthew G. Knepley $ = {{2 y z, 0, 0}, {0, 2 x z, 0}, {0, 2 y z, -z^2}, {2 x z, 0, -z^2}, {x^2, x y, -3 x z}, {x y, y^2, -3 y z}}
388*69cc43acSMatthew G. Knepley 
389*69cc43acSMatthew G. Knepley   Level: intermediate
390*69cc43acSMatthew G. Knepley 
391*69cc43acSMatthew G. Knepley .seealso: PetscSpaceType, PetscSpaceCreate(), PetscSpaceSetType()
392*69cc43acSMatthew G. Knepley M*/
393*69cc43acSMatthew G. Knepley 
394*69cc43acSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscSpaceCreate_WXY(PetscSpace sp)
395*69cc43acSMatthew G. Knepley {
396*69cc43acSMatthew G. Knepley   PetscSpace_WXY *wxy;
397*69cc43acSMatthew G. Knepley   PetscErrorCode  ierr;
398*69cc43acSMatthew G. Knepley 
399*69cc43acSMatthew G. Knepley   PetscFunctionBegin;
400*69cc43acSMatthew G. Knepley   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
401*69cc43acSMatthew G. Knepley   ierr     = PetscNewLog(sp,&wxy);CHKERRQ(ierr);
402*69cc43acSMatthew G. Knepley   sp->data = wxy;
403*69cc43acSMatthew G. Knepley   sp->degree = 2;
404*69cc43acSMatthew G. Knepley 
405*69cc43acSMatthew G. Knepley   ierr = PetscSpaceInitialize_WXY(sp);CHKERRQ(ierr);
406*69cc43acSMatthew G. Knepley   PetscFunctionReturn(0);
407*69cc43acSMatthew G. Knepley }
408