169cc43acSMatthew G. Knepley #include <petsc/private/petscfeimpl.h> /*I "petscfe.h" I*/ 269cc43acSMatthew G. Knepley 3ce78bad3SBarry Smith static PetscErrorCode PetscSpaceSetFromOptions_WXY(PetscSpace sp, PetscOptionItems PetscOptionsObject) 4d71ae5a4SJacob Faibussowitsch { 569cc43acSMatthew G. Knepley PetscFunctionBegin; 6d0609cedSBarry Smith PetscOptionsHeadBegin(PetscOptionsObject, "PetscSpace WXY options"); 7d0609cedSBarry Smith PetscOptionsHeadEnd(); 83ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 969cc43acSMatthew G. Knepley } 1069cc43acSMatthew G. Knepley 11d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscSpacePolynomialView_Ascii(PetscSpace sp, PetscViewer v) 12d71ae5a4SJacob Faibussowitsch { 1369cc43acSMatthew G. Knepley PetscFunctionBegin; 149566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(v, "WXY space of degree %" PetscInt_FMT "\n", sp->degree)); 153ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1669cc43acSMatthew G. Knepley } 1769cc43acSMatthew G. Knepley 18d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscSpaceView_WXY(PetscSpace sp, PetscViewer viewer) 19d71ae5a4SJacob Faibussowitsch { 20*9f196a02SMartin Diehl PetscBool isascii; 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*9f196a02SMartin Diehl PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 26*9f196a02SMartin Diehl if (isascii) PetscCall(PetscSpacePolynomialView_Ascii(sp, viewer)); 273ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2869cc43acSMatthew G. Knepley } 2969cc43acSMatthew G. Knepley 30d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscSpaceDestroy_WXY(PetscSpace sp) 31d71ae5a4SJacob Faibussowitsch { 3269cc43acSMatthew G. Knepley PetscSpace_WXY *wxy = (PetscSpace_WXY *)sp->data; 3369cc43acSMatthew G. Knepley 3469cc43acSMatthew G. Knepley PetscFunctionBegin; 359566063dSJacob Faibussowitsch PetscCall(PetscFree(wxy)); 363ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3769cc43acSMatthew G. Knepley } 3869cc43acSMatthew G. Knepley 39d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscSpaceSetUp_WXY(PetscSpace sp) 40d71ae5a4SJacob Faibussowitsch { 4169cc43acSMatthew G. Knepley PetscSpace_WXY *wxy = (PetscSpace_WXY *)sp->data; 4269cc43acSMatthew G. Knepley 4369cc43acSMatthew G. Knepley PetscFunctionBegin; 44371d2eb7SMartin Diehl if (wxy->setupcalled) PetscFunctionReturn(PETSC_SUCCESS); 4500045ab3SPierre Jolivet PetscCheck(sp->degree >= 0, PetscObjectComm((PetscObject)sp), PETSC_ERR_ARG_OUTOFRANGE, "Negative degree %" PetscInt_FMT " invalid", sp->degree); 4669cc43acSMatthew G. Knepley sp->maxDegree = sp->degree; 47371d2eb7SMartin Diehl wxy->setupcalled = PETSC_TRUE; 483ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4969cc43acSMatthew G. Knepley } 5069cc43acSMatthew G. Knepley 51d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscSpaceGetDimension_WXY(PetscSpace sp, PetscInt *dim) 52d71ae5a4SJacob Faibussowitsch { 5369cc43acSMatthew G. Knepley PetscFunctionBegin; 5469cc43acSMatthew G. Knepley *dim = 6; 553ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5669cc43acSMatthew G. Knepley } 5769cc43acSMatthew G. Knepley 58d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscSpaceEvaluate_WXY(PetscSpace sp, PetscInt npoints, const PetscReal points[], PetscReal B[], PetscReal D[], PetscReal H[]) 59d71ae5a4SJacob Faibussowitsch { 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; 66371d2eb7SMartin Diehl if (!wxy->setupcalled) { 679566063dSJacob Faibussowitsch PetscCall(PetscSpaceSetUp(sp)); 689566063dSJacob Faibussowitsch PetscCall(PetscSpaceEvaluate(sp, npoints, points, B, D, H)); 693ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 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 } 3563ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 35769cc43acSMatthew G. Knepley } 35869cc43acSMatthew G. Knepley 359d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscSpaceGetHeightSubspace_WXY(PetscSpace sp, PetscInt height, PetscSpace *subsp) 360d71ae5a4SJacob Faibussowitsch { 36169cc43acSMatthew G. Knepley SETERRQ(PetscObjectComm((PetscObject)sp), PETSC_ERR_SUP, "Do not know how to do this"); 36269cc43acSMatthew G. Knepley } 36369cc43acSMatthew G. Knepley 364d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscSpaceInitialize_WXY(PetscSpace sp) 365d71ae5a4SJacob Faibussowitsch { 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; 3743ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 37569cc43acSMatthew G. Knepley } 37669cc43acSMatthew G. Knepley 37769cc43acSMatthew G. Knepley /*MC 378dce8aebaSBarry Smith PETSCSPACEWXY = "wxy" - A `PetscSpace` object that encapsulates the Wheeler-Xu-Yotov enrichments. 37969cc43acSMatthew G. Knepley 38069cc43acSMatthew G. Knepley Level: intermediate 38169cc43acSMatthew G. Knepley 38237fdd005SBarry Smith Note: 38337fdd005SBarry Smith .vb 38437fdd005SBarry Smith 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}} 38537fdd005SBarry Smith = {{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}} 38637fdd005SBarry Smith .ve 38737fdd005SBarry Smith 388dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceType`, `PetscSpaceCreate()`, `PetscSpaceSetType()` 38969cc43acSMatthew G. Knepley M*/ 39069cc43acSMatthew G. Knepley 391d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscSpaceCreate_WXY(PetscSpace sp) 392d71ae5a4SJacob Faibussowitsch { 39369cc43acSMatthew G. Knepley PetscSpace_WXY *wxy; 39469cc43acSMatthew G. Knepley 39569cc43acSMatthew G. Knepley PetscFunctionBegin; 39669cc43acSMatthew G. Knepley PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 3974dfa11a4SJacob Faibussowitsch PetscCall(PetscNew(&wxy)); 39869cc43acSMatthew G. Knepley sp->data = wxy; 39969cc43acSMatthew G. Knepley sp->degree = 2; 40069cc43acSMatthew G. Knepley 4019566063dSJacob Faibussowitsch PetscCall(PetscSpaceInitialize_WXY(sp)); 4023ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 40369cc43acSMatthew G. Knepley } 404