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