xref: /petsc/src/dm/dt/space/impls/wxy/spacewxy.c (revision 4dfa11a44d5adf2389f1d3acbc8f3c1116dc6c3a)
169cc43acSMatthew G. Knepley #include <petsc/private/petscfeimpl.h> /*I "petscfe.h" I*/
269cc43acSMatthew G. Knepley 
39371c9d4SSatish Balay static PetscErrorCode PetscSpaceSetFromOptions_WXY(PetscSpace sp, PetscOptionItems *PetscOptionsObject) {
469cc43acSMatthew G. Knepley   PetscFunctionBegin;
5d0609cedSBarry Smith   PetscOptionsHeadBegin(PetscOptionsObject, "PetscSpace WXY options");
6d0609cedSBarry Smith   PetscOptionsHeadEnd();
769cc43acSMatthew G. Knepley   PetscFunctionReturn(0);
869cc43acSMatthew G. Knepley }
969cc43acSMatthew G. Knepley 
109371c9d4SSatish Balay static PetscErrorCode PetscSpacePolynomialView_Ascii(PetscSpace sp, PetscViewer v) {
1169cc43acSMatthew G. Knepley   PetscFunctionBegin;
129566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(v, "WXY space of degree %" PetscInt_FMT "\n", sp->degree));
1369cc43acSMatthew G. Knepley   PetscFunctionReturn(0);
1469cc43acSMatthew G. Knepley }
1569cc43acSMatthew G. Knepley 
169371c9d4SSatish Balay static PetscErrorCode PetscSpaceView_WXY(PetscSpace sp, PetscViewer viewer) {
1769cc43acSMatthew G. Knepley   PetscBool iascii;
1869cc43acSMatthew G. Knepley 
1969cc43acSMatthew G. Knepley   PetscFunctionBegin;
2069cc43acSMatthew G. Knepley   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
2169cc43acSMatthew G. Knepley   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
229566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
239566063dSJacob Faibussowitsch   if (iascii) PetscCall(PetscSpacePolynomialView_Ascii(sp, viewer));
2469cc43acSMatthew G. Knepley   PetscFunctionReturn(0);
2569cc43acSMatthew G. Knepley }
2669cc43acSMatthew G. Knepley 
279371c9d4SSatish Balay static PetscErrorCode PetscSpaceDestroy_WXY(PetscSpace sp) {
2869cc43acSMatthew G. Knepley   PetscSpace_WXY *wxy = (PetscSpace_WXY *)sp->data;
2969cc43acSMatthew G. Knepley 
3069cc43acSMatthew G. Knepley   PetscFunctionBegin;
319566063dSJacob Faibussowitsch   PetscCall(PetscFree(wxy));
3269cc43acSMatthew G. Knepley   PetscFunctionReturn(0);
3369cc43acSMatthew G. Knepley }
3469cc43acSMatthew G. Knepley 
359371c9d4SSatish Balay static PetscErrorCode PetscSpaceSetUp_WXY(PetscSpace sp) {
3669cc43acSMatthew G. Knepley   PetscSpace_WXY *wxy = (PetscSpace_WXY *)sp->data;
3769cc43acSMatthew G. Knepley 
3869cc43acSMatthew G. Knepley   PetscFunctionBegin;
3969cc43acSMatthew G. Knepley   if (wxy->setupCalled) PetscFunctionReturn(0);
4069cc43acSMatthew G. Knepley   PetscCheck(sp->degree >= 0, PetscObjectComm((PetscObject)sp), PETSC_ERR_ARG_OUTOFRANGE, "Negative degree %" PetscInt_FMT " invalid\n", sp->degree);
4169cc43acSMatthew G. Knepley   sp->maxDegree    = sp->degree;
4269cc43acSMatthew G. Knepley   wxy->setupCalled = PETSC_TRUE;
4369cc43acSMatthew G. Knepley   PetscFunctionReturn(0);
4469cc43acSMatthew G. Knepley }
4569cc43acSMatthew G. Knepley 
469371c9d4SSatish Balay static PetscErrorCode PetscSpaceGetDimension_WXY(PetscSpace sp, PetscInt *dim) {
4769cc43acSMatthew G. Knepley   PetscFunctionBegin;
4869cc43acSMatthew G. Knepley   *dim = 6;
4969cc43acSMatthew G. Knepley   PetscFunctionReturn(0);
5069cc43acSMatthew G. Knepley }
5169cc43acSMatthew G. Knepley 
529371c9d4SSatish Balay static PetscErrorCode PetscSpaceEvaluate_WXY(PetscSpace sp, PetscInt npoints, const PetscReal points[], PetscReal B[], PetscReal D[], PetscReal H[]) {
5369cc43acSMatthew G. Knepley   PetscSpace_WXY *wxy = (PetscSpace_WXY *)sp->data;
5469cc43acSMatthew G. Knepley   PetscInt        dim = sp->Nv;
5569cc43acSMatthew G. Knepley   PetscInt        Nb  = 6;
5669cc43acSMatthew G. Knepley   PetscInt        Nc  = 3;
5769cc43acSMatthew G. Knepley 
5869cc43acSMatthew G. Knepley   PetscFunctionBegin;
5969cc43acSMatthew G. Knepley   if (!wxy->setupCalled) {
609566063dSJacob Faibussowitsch     PetscCall(PetscSpaceSetUp(sp));
619566063dSJacob Faibussowitsch     PetscCall(PetscSpaceEvaluate(sp, npoints, points, B, D, H));
6269cc43acSMatthew G. Knepley     PetscFunctionReturn(0);
6369cc43acSMatthew G. Knepley   }
6469cc43acSMatthew G. Knepley   PetscCheck((sp->Nc == 3) && (sp->Nv == 3), PETSC_COMM_SELF, PETSC_ERR_PLIB, "WXY space must have 3 variables and 3 components");
6569cc43acSMatthew G. Knepley   if (B) {
6669cc43acSMatthew G. Knepley     PetscInt p_inc = Nb * Nc;
6769cc43acSMatthew G. Knepley     PetscInt b_inc = Nc;
6869cc43acSMatthew G. Knepley     PetscInt c_inc = 1;
6969cc43acSMatthew G. Knepley 
7069cc43acSMatthew G. Knepley     for (PetscInt p = 0; p < npoints; p++) {
7169cc43acSMatthew G. Knepley       const PetscReal x = points[p * dim + 0];
7269cc43acSMatthew G. Knepley       const PetscReal y = points[p * dim + 1];
7369cc43acSMatthew G. Knepley       const PetscReal z = points[p * dim + 2];
7469cc43acSMatthew G. Knepley 
7569cc43acSMatthew G. Knepley       /* {2 y z, 0, 0} */
7669cc43acSMatthew G. Knepley       B[p * p_inc + 0 * b_inc + 0 * c_inc] = 2. * y * z;
7769cc43acSMatthew G. Knepley       B[p * p_inc + 0 * b_inc + 1 * c_inc] = 0.;
7869cc43acSMatthew G. Knepley       B[p * p_inc + 0 * b_inc + 2 * c_inc] = 0.;
7969cc43acSMatthew G. Knepley       /* {0, 2 x z, 0} */
8069cc43acSMatthew G. Knepley       B[p * p_inc + 1 * b_inc + 0 * c_inc] = 0.;
8169cc43acSMatthew G. Knepley       B[p * p_inc + 1 * b_inc + 1 * c_inc] = 2. * x * z;
8269cc43acSMatthew G. Knepley       B[p * p_inc + 1 * b_inc + 2 * c_inc] = 0.;
8369cc43acSMatthew G. Knepley       /* {0, 2 y z, -z^2} */
8469cc43acSMatthew G. Knepley       B[p * p_inc + 2 * b_inc + 0 * c_inc] = 0.;
8569cc43acSMatthew G. Knepley       B[p * p_inc + 2 * b_inc + 1 * c_inc] = 2. * y * z;
8669cc43acSMatthew G. Knepley       B[p * p_inc + 2 * b_inc + 2 * c_inc] = -z * z;
8769cc43acSMatthew G. Knepley       /* {2 x z, 0, -z^2} */
8869cc43acSMatthew G. Knepley       B[p * p_inc + 3 * b_inc + 0 * c_inc] = 2. * x * z;
8969cc43acSMatthew G. Knepley       B[p * p_inc + 3 * b_inc + 1 * c_inc] = 0.;
9069cc43acSMatthew G. Knepley       B[p * p_inc + 3 * b_inc + 2 * c_inc] = -z * z;
9169cc43acSMatthew G. Knepley       /* {x^2, x y, -3 x z} */
9269cc43acSMatthew G. Knepley       B[p * p_inc + 4 * b_inc + 0 * c_inc] = x * x;
9369cc43acSMatthew G. Knepley       B[p * p_inc + 4 * b_inc + 1 * c_inc] = x * y;
9469cc43acSMatthew G. Knepley       B[p * p_inc + 4 * b_inc + 2 * c_inc] = -3. * x * z;
9569cc43acSMatthew G. Knepley       /* {x y, y^2, -3 y z} */
9669cc43acSMatthew G. Knepley       B[p * p_inc + 5 * b_inc + 0 * c_inc] = x * y;
9769cc43acSMatthew G. Knepley       B[p * p_inc + 5 * b_inc + 1 * c_inc] = y * y;
9869cc43acSMatthew G. Knepley       B[p * p_inc + 5 * b_inc + 2 * c_inc] = -3. * y * z;
9969cc43acSMatthew G. Knepley     }
10069cc43acSMatthew G. Knepley   }
10169cc43acSMatthew G. Knepley   if (D) {
10269cc43acSMatthew G. Knepley     PetscInt p_inc = Nb * Nc * dim;
10369cc43acSMatthew G. Knepley     PetscInt b_inc = Nc * dim;
10469cc43acSMatthew G. Knepley     PetscInt c_inc = dim;
10569cc43acSMatthew G. Knepley 
10669cc43acSMatthew G. Knepley     for (PetscInt p = 0; p < npoints; p++) {
10769cc43acSMatthew G. Knepley       const PetscReal x = points[p * dim + 0];
10869cc43acSMatthew G. Knepley       const PetscReal y = points[p * dim + 1];
10969cc43acSMatthew G. Knepley       const PetscReal z = points[p * dim + 2];
11069cc43acSMatthew G. Knepley 
11169cc43acSMatthew G. Knepley       /* {2 y z, 0, 0} */
11269cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 0 * c_inc + 0] = 0.;
11369cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 0 * c_inc + 1] = 2. * z;
11469cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 0 * c_inc + 2] = 2. * y;
11569cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 1 * c_inc + 0] = 0.;
11669cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 1 * c_inc + 1] = 0.;
11769cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 1 * c_inc + 2] = 0.;
11869cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 2 * c_inc + 0] = 0.;
11969cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 2 * c_inc + 1] = 0.;
12069cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 2 * c_inc + 2] = 0.;
12169cc43acSMatthew G. Knepley       /* {0, 2 x z, 0} */
12269cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 0 * c_inc + 0] = 0.;
12369cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 0 * c_inc + 1] = 0.;
12469cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 0 * c_inc + 2] = 0.;
12569cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 1 * c_inc + 0] = 2. * z;
12669cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 1 * c_inc + 1] = 0.;
12769cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 1 * c_inc + 2] = 2. * x;
12869cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 2 * c_inc + 0] = 0.;
12969cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 2 * c_inc + 1] = 0.;
13069cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 2 * c_inc + 2] = 0.;
13169cc43acSMatthew G. Knepley       /* {0, 2 y z, -z^2} */
13269cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 0 * c_inc + 0] = 0.;
13369cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 0 * c_inc + 1] = 0.;
13469cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 0 * c_inc + 2] = 0.;
13569cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 1 * c_inc + 0] = 0.;
13669cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 1 * c_inc + 1] = 2. * z;
13769cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 1 * c_inc + 2] = 2. * y;
13869cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 2 * c_inc + 0] = 0.;
13969cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 2 * c_inc + 1] = 0.;
14069cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 2 * c_inc + 2] = -2. * z;
14169cc43acSMatthew G. Knepley       /* {2 x z, 0, -z^2} */
14269cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 0 * c_inc + 0] = 2. * z;
14369cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 0 * c_inc + 1] = 0.;
14469cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 0 * c_inc + 2] = 2. * x;
14569cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 1 * c_inc + 0] = 0.;
14669cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 1 * c_inc + 1] = 0.;
14769cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 1 * c_inc + 2] = 0.;
14869cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 2 * c_inc + 0] = 0.;
14969cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 2 * c_inc + 1] = 0.;
15069cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 2 * c_inc + 2] = -2. * z;
15169cc43acSMatthew G. Knepley       /* {x^2, x y, -3 x z} */
15269cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 0 * c_inc + 0] = 2. * x;
15369cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 0 * c_inc + 1] = 0.;
15469cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 0 * c_inc + 2] = 0.;
15569cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 1 * c_inc + 0] = y;
15669cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 1 * c_inc + 1] = x;
15769cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 1 * c_inc + 2] = 0.;
15869cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 2 * c_inc + 0] = -3. * z;
15969cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 2 * c_inc + 1] = 0.;
16069cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 2 * c_inc + 2] = -3. * x;
16169cc43acSMatthew G. Knepley       /* {x y, y^2, -3 y z} */
16269cc43acSMatthew G. Knepley       D[p * p_inc + 5 * b_inc + 0 * c_inc + 0] = y;
16369cc43acSMatthew G. Knepley       D[p * p_inc + 5 * b_inc + 0 * c_inc + 1] = x;
16469cc43acSMatthew G. Knepley       D[p * p_inc + 5 * b_inc + 0 * c_inc + 2] = 0.;
16569cc43acSMatthew G. Knepley       D[p * p_inc + 5 * b_inc + 1 * c_inc + 0] = 0.;
16669cc43acSMatthew G. Knepley       D[p * p_inc + 5 * b_inc + 1 * c_inc + 1] = 2. * y;
16769cc43acSMatthew G. Knepley       D[p * p_inc + 5 * b_inc + 1 * c_inc + 2] = 0.;
16869cc43acSMatthew G. Knepley       D[p * p_inc + 5 * b_inc + 2 * c_inc + 0] = 0.;
16969cc43acSMatthew G. Knepley       D[p * p_inc + 5 * b_inc + 2 * c_inc + 1] = -3. * z;
17069cc43acSMatthew G. Knepley       D[p * p_inc + 5 * b_inc + 2 * c_inc + 2] = -3. * y;
17169cc43acSMatthew G. Knepley     }
17269cc43acSMatthew G. Knepley   }
17369cc43acSMatthew G. Knepley   if (H) {
17469cc43acSMatthew G. Knepley     PetscInt p_inc = Nb * Nc * dim * dim;
17569cc43acSMatthew G. Knepley     PetscInt b_inc = Nc * dim * dim;
17669cc43acSMatthew G. Knepley     PetscInt c_inc = dim * dim;
17769cc43acSMatthew G. Knepley 
17869cc43acSMatthew G. Knepley     for (PetscInt p = 0; p < npoints; p++) {
17969cc43acSMatthew G. Knepley       /* {2 y z, 0, 0} */
18069cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 0 * c_inc + 0] = 0.;
18169cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 0 * c_inc + 1] = 0.;
18269cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 0 * c_inc + 2] = 0.;
18369cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 0 * c_inc + 3] = 0.;
18469cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 0 * c_inc + 4] = 0.;
18569cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 0 * c_inc + 5] = 2.;
18669cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 0 * c_inc + 6] = 0.;
18769cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 0 * c_inc + 7] = 2.;
18869cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 0 * c_inc + 8] = 0.;
18969cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 1 * c_inc + 0] = 0.;
19069cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 1 * c_inc + 1] = 0.;
19169cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 1 * c_inc + 2] = 0.;
19269cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 1 * c_inc + 3] = 0.;
19369cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 1 * c_inc + 4] = 0.;
19469cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 1 * c_inc + 5] = 0.;
19569cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 1 * c_inc + 6] = 0.;
19669cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 1 * c_inc + 7] = 0.;
19769cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 1 * c_inc + 8] = 0.;
19869cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 2 * c_inc + 0] = 0.;
19969cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 2 * c_inc + 1] = 0.;
20069cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 2 * c_inc + 2] = 0.;
20169cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 2 * c_inc + 3] = 0.;
20269cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 2 * c_inc + 4] = 0.;
20369cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 2 * c_inc + 5] = 0.;
20469cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 2 * c_inc + 6] = 0.;
20569cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 2 * c_inc + 7] = 0.;
20669cc43acSMatthew G. Knepley       D[p * p_inc + 0 * b_inc + 2 * c_inc + 8] = 0.;
20769cc43acSMatthew G. Knepley       /* {0, 2 x z, 0} */
20869cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 0 * c_inc + 0] = 0.;
20969cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 0 * c_inc + 1] = 0.;
21069cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 0 * c_inc + 2] = 0.;
21169cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 0 * c_inc + 3] = 0.;
21269cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 0 * c_inc + 4] = 0.;
21369cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 0 * c_inc + 5] = 0.;
21469cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 0 * c_inc + 6] = 0.;
21569cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 0 * c_inc + 7] = 0.;
21669cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 0 * c_inc + 8] = 0.;
21769cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 1 * c_inc + 0] = 0.;
21869cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 1 * c_inc + 1] = 0.;
21969cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 1 * c_inc + 2] = 2.;
22069cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 1 * c_inc + 3] = 0.;
22169cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 1 * c_inc + 4] = 0.;
22269cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 1 * c_inc + 5] = 0.;
22369cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 1 * c_inc + 6] = 2.;
22469cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 1 * c_inc + 7] = 0.;
22569cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 1 * c_inc + 8] = 0.;
22669cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 2 * c_inc + 0] = 0.;
22769cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 2 * c_inc + 1] = 0.;
22869cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 2 * c_inc + 2] = 0.;
22969cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 2 * c_inc + 3] = 0.;
23069cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 2 * c_inc + 4] = 0.;
23169cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 2 * c_inc + 5] = 0.;
23269cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 2 * c_inc + 6] = 0.;
23369cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 2 * c_inc + 7] = 0.;
23469cc43acSMatthew G. Knepley       D[p * p_inc + 1 * b_inc + 2 * c_inc + 8] = 0.;
23569cc43acSMatthew G. Knepley       /* {0, 2 y z, -z^2} */
23669cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 0 * c_inc + 0] = 0.;
23769cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 0 * c_inc + 1] = 0.;
23869cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 0 * c_inc + 2] = 0.;
23969cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 0 * c_inc + 3] = 0.;
24069cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 0 * c_inc + 4] = 0.;
24169cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 0 * c_inc + 5] = 0.;
24269cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 0 * c_inc + 6] = 0.;
24369cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 0 * c_inc + 7] = 0.;
24469cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 0 * c_inc + 8] = 0.;
24569cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 1 * c_inc + 0] = 0.;
24669cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 1 * c_inc + 1] = 0.;
24769cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 1 * c_inc + 2] = 0.;
24869cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 1 * c_inc + 3] = 0.;
24969cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 1 * c_inc + 4] = 0.;
25069cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 1 * c_inc + 5] = 2.;
25169cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 1 * c_inc + 6] = 0.;
25269cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 1 * c_inc + 7] = 2.;
25369cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 1 * c_inc + 8] = 0.;
25469cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 2 * c_inc + 0] = 0.;
25569cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 2 * c_inc + 1] = 0.;
25669cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 2 * c_inc + 2] = 0.;
25769cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 2 * c_inc + 3] = 0.;
25869cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 2 * c_inc + 4] = 0.;
25969cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 2 * c_inc + 5] = 0.;
26069cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 2 * c_inc + 6] = 0.;
26169cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 2 * c_inc + 7] = 0.;
26269cc43acSMatthew G. Knepley       D[p * p_inc + 2 * b_inc + 2 * c_inc + 8] = -2.;
26369cc43acSMatthew G. Knepley       /* {2 x z, 0, -z^2} */
26469cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 0 * c_inc + 0] = 0.;
26569cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 0 * c_inc + 1] = 0.;
26669cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 0 * c_inc + 2] = 2.;
26769cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 0 * c_inc + 3] = 0.;
26869cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 0 * c_inc + 4] = 0.;
26969cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 0 * c_inc + 5] = 0.;
27069cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 0 * c_inc + 6] = 2.;
27169cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 0 * c_inc + 7] = 0.;
27269cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 0 * c_inc + 8] = 0.;
27369cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 1 * c_inc + 0] = 0.;
27469cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 1 * c_inc + 1] = 0.;
27569cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 1 * c_inc + 2] = 0.;
27669cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 1 * c_inc + 3] = 0.;
27769cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 1 * c_inc + 4] = 0.;
27869cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 1 * c_inc + 5] = 0.;
27969cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 1 * c_inc + 6] = 0.;
28069cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 1 * c_inc + 7] = 0.;
28169cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 1 * c_inc + 8] = 0.;
28269cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 2 * c_inc + 0] = 0.;
28369cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 2 * c_inc + 1] = 0.;
28469cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 2 * c_inc + 2] = 0.;
28569cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 2 * c_inc + 3] = 0.;
28669cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 2 * c_inc + 4] = 0.;
28769cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 2 * c_inc + 5] = 0.;
28869cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 2 * c_inc + 6] = 0.;
28969cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 2 * c_inc + 7] = 0.;
29069cc43acSMatthew G. Knepley       D[p * p_inc + 3 * b_inc + 2 * c_inc + 8] = -2.;
29169cc43acSMatthew G. Knepley       /* {x^2, x y, -3 x z} */
29269cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 0 * c_inc + 0] = 2.;
29369cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 0 * c_inc + 1] = 0.;
29469cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 0 * c_inc + 2] = 0.;
29569cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 0 * c_inc + 3] = 0.;
29669cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 0 * c_inc + 4] = 0.;
29769cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 0 * c_inc + 5] = 0.;
29869cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 0 * c_inc + 6] = 0.;
29969cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 0 * c_inc + 7] = 0.;
30069cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 0 * c_inc + 8] = 0.;
30169cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 1 * c_inc + 0] = 0.;
30269cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 1 * c_inc + 1] = 1.;
30369cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 1 * c_inc + 2] = 0.;
30469cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 1 * c_inc + 3] = 1.;
30569cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 1 * c_inc + 4] = 0.;
30669cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 1 * c_inc + 5] = 0.;
30769cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 1 * c_inc + 6] = 0.;
30869cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 1 * c_inc + 7] = 0.;
30969cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 1 * c_inc + 8] = 0.;
31069cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 2 * c_inc + 0] = 0.;
31169cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 2 * c_inc + 1] = 0.;
31269cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 2 * c_inc + 2] = -3.;
31369cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 2 * c_inc + 3] = 0.;
31469cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 2 * c_inc + 4] = 0.;
31569cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 2 * c_inc + 5] = 0.;
31669cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 2 * c_inc + 6] = -3.;
31769cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 2 * c_inc + 7] = 0.;
31869cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 2 * c_inc + 8] = 0.;
31969cc43acSMatthew G. Knepley       /* {x y, y^2, -3 y z} */
32069cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 0 * c_inc + 0] = 2.;
32169cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 0 * c_inc + 1] = 0.;
32269cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 0 * c_inc + 2] = 0.;
32369cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 0 * c_inc + 3] = 0.;
32469cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 0 * c_inc + 4] = 0.;
32569cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 0 * c_inc + 5] = 0.;
32669cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 0 * c_inc + 6] = 0.;
32769cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 0 * c_inc + 7] = 0.;
32869cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 0 * c_inc + 8] = 0.;
32969cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 1 * c_inc + 0] = 0.;
33069cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 1 * c_inc + 1] = 1.;
33169cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 1 * c_inc + 2] = 0.;
33269cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 1 * c_inc + 3] = 1.;
33369cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 1 * c_inc + 4] = 0.;
33469cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 1 * c_inc + 5] = 0.;
33569cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 1 * c_inc + 6] = 0.;
33669cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 1 * c_inc + 7] = 0.;
33769cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 1 * c_inc + 8] = 0.;
33869cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 2 * c_inc + 0] = 0.;
33969cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 2 * c_inc + 1] = 0.;
34069cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 2 * c_inc + 2] = -3.;
34169cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 2 * c_inc + 3] = 0.;
34269cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 2 * c_inc + 4] = 0.;
34369cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 2 * c_inc + 5] = 0.;
34469cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 2 * c_inc + 6] = -3.;
34569cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 2 * c_inc + 7] = 0.;
34669cc43acSMatthew G. Knepley       D[p * p_inc + 4 * b_inc + 2 * c_inc + 8] = 0.;
34769cc43acSMatthew G. Knepley     }
34869cc43acSMatthew G. Knepley   }
34969cc43acSMatthew G. Knepley   PetscFunctionReturn(0);
35069cc43acSMatthew G. Knepley }
35169cc43acSMatthew G. Knepley 
3529371c9d4SSatish Balay static PetscErrorCode PetscSpaceGetHeightSubspace_WXY(PetscSpace sp, PetscInt height, PetscSpace *subsp) {
35369cc43acSMatthew G. Knepley   SETERRQ(PetscObjectComm((PetscObject)sp), PETSC_ERR_SUP, "Do not know how to do this");
35469cc43acSMatthew G. Knepley }
35569cc43acSMatthew G. Knepley 
3569371c9d4SSatish Balay static PetscErrorCode PetscSpaceInitialize_WXY(PetscSpace sp) {
35769cc43acSMatthew G. Knepley   PetscFunctionBegin;
35869cc43acSMatthew G. Knepley   sp->ops->setfromoptions    = PetscSpaceSetFromOptions_WXY;
35969cc43acSMatthew G. Knepley   sp->ops->setup             = PetscSpaceSetUp_WXY;
36069cc43acSMatthew G. Knepley   sp->ops->view              = PetscSpaceView_WXY;
36169cc43acSMatthew G. Knepley   sp->ops->destroy           = PetscSpaceDestroy_WXY;
36269cc43acSMatthew G. Knepley   sp->ops->getdimension      = PetscSpaceGetDimension_WXY;
36369cc43acSMatthew G. Knepley   sp->ops->evaluate          = PetscSpaceEvaluate_WXY;
36469cc43acSMatthew G. Knepley   sp->ops->getheightsubspace = PetscSpaceGetHeightSubspace_WXY;
36569cc43acSMatthew G. Knepley   PetscFunctionReturn(0);
36669cc43acSMatthew G. Knepley }
36769cc43acSMatthew G. Knepley 
36869cc43acSMatthew G. Knepley /*MC
36969cc43acSMatthew G. Knepley   PETSCSPACEWXY = "wxy" - A PetscSpace object that encapsulates the Wheeler-Xu-Yotov enrichments.
37069cc43acSMatthew 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}}
37169cc43acSMatthew 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}}
37269cc43acSMatthew G. Knepley 
37369cc43acSMatthew G. Knepley   Level: intermediate
37469cc43acSMatthew G. Knepley 
375db781477SPatrick Sanan .seealso: `PetscSpaceType`, `PetscSpaceCreate()`, `PetscSpaceSetType()`
37669cc43acSMatthew G. Knepley M*/
37769cc43acSMatthew G. Knepley 
3789371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode PetscSpaceCreate_WXY(PetscSpace sp) {
37969cc43acSMatthew G. Knepley   PetscSpace_WXY *wxy;
38069cc43acSMatthew G. Knepley 
38169cc43acSMatthew G. Knepley   PetscFunctionBegin;
38269cc43acSMatthew G. Knepley   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
383*4dfa11a4SJacob Faibussowitsch   PetscCall(PetscNew(&wxy));
38469cc43acSMatthew G. Knepley   sp->data   = wxy;
38569cc43acSMatthew G. Knepley   sp->degree = 2;
38669cc43acSMatthew G. Knepley 
3879566063dSJacob Faibussowitsch   PetscCall(PetscSpaceInitialize_WXY(sp));
38869cc43acSMatthew G. Knepley   PetscFunctionReturn(0);
38969cc43acSMatthew G. Knepley }
390