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