/* phi_tri.c Phi and derivatives for order 1 through 4 for Galerkin FEM * and dimension 1 (x) through 4 (x,y,z,t) on triangles * phi11(c,x) is linear(order 1) FEM phi function in 1 dimension(x) * =c[0]+c[1]*x c is a vector of polynomial coefficients * phi11x(c,x) is first derivative of phi11(c,x) * * phi21(c,x) is second order FEM phi function in 1 dimension * phi21x(c,x) is first derivative of phi21(c,x) * phi21xx(c,x) is second derivative of phi21(c,x) * * phi22(c,x,y) is second order FEM phi function in 2 dimensions * = c[0]+c[1]*x+c[2]*y+c[3]*x*x+c[4]*x*y+c[5]*y*y * phi22x(c,x,y) is partial derivative of phi22(c,x,y) with respect to x * phi22y(c,x,y) is partial derivative of phi22(c,x,y) with respect to y * phi22xx(c,x,y) is second partial of phi22(c,x,y) with respect to x * phi22xy(c,x,y) is second partial of phi22(c,x,y) wrt x and wrt y * phi22yy(c,x,y) is second partial of phi22(c,x,y) with respect to y * * ... up to fourth derivative of fourth order phi in four dimensions * phi44(c,x,y,z,t) is fourth order four dimensional FEM phi function * ... * phi44tttt(c,x,y,z,t) is fourth partial of phi44(c,x,y,z,t) wrt t */ double phi11(double c[], double x) { return c[0]+c[1]*x; } double phi11x(double c[], double x) { return c[1]; } double phi21(double c[], double x) { return c[0]+c[1]*x+c[2]*x*x; } double phi21x(double c[], double x) { return c[1]+c[2]*2.0*x; } double phi21xx(double c[], double x) { return c[2]*2.0; } double phi31(double c[], double x) { return c[0]+c[1]*x+c[2]*x*x+c[3]*x*x*x; } double phi31x(double c[], double x) { return c[1]+c[2]*2.0*x+c[3]*3.0*x*x; } double phi31xx(double c[], double x) { return c[2]*2.0+c[3]*6.0*x; } double phi31xxx(double c[], double x) { return c[3]*6.0; } double phi41(double c[], double x) { return c[0]+c[1]*x+c[2]*x*x+c[3]*x*x*x+c[4]*x*x*x*x; } double phi41x(double c[], double x) { return c[1]+c[2]*2.0*x+c[3]*3.0*x*x+c[4]*4.0*x*x*x; } double phi41xx(double c[], double x) { return c[2]*2.0+c[3]*6.0*x+c[4]*12.0*x*x; } double phi41xxx(double c[], double x) { return c[3]*6.0+c[4]*24.0*x; } double phi41xxxx(double c[], double x) { return c[4]*24.0; } double phi12(double c[], double x, double y) { return c[0]+c[1]*x+c[2]*y; } double phi12x(double c[], double x, double y) { return c[1]; } double phi12y(double c[], double x, double y) { return c[2]; } double phi22(double c[], double x, double y) { return c[0]+c[1]*x+c[2]*y+c[3]*x*x+c[4]*x*y+c[5]*y*y; } double phi22x(double c[], double x, double y) { return c[1]+c[3]*2.0*x+c[4]*y; } double phi22y(double c[], double x, double y) { return c[2]+c[4]*x+c[5]*2.0*y; } double phi22xx(double c[], double x, double y) { return c[3]*2.0; } double phi22xy(double c[], double x, double y) { return c[4]; } double phi22yy(double c[], double x, double y) { return c[5]*2.0; } double phi32(double c[], double x, double y) { return c[0]+c[1]*x+c[2]*y+c[3]*x*x+c[4]*x*y+c[5]*y*y+ c[6]*x*x*x+c[7]*x*x*y+c[8]*x*y*y+c[9]*y*y*y; } double phi32x(double c[], double x, double y) { return c[1]+c[3]*2.0*x+c[4]*y+ c[6]*3.0*x*x+c[7]*2.0*x*y+c[8]*y*y; } double phi32y(double c[], double x, double y) { return c[2]+c[4]*x+c[5]*2.0*y+ c[7]*x*x+c[8]*2.0*x*y+c[9]*3.0*y*y ; } double phi32xx(double c[], double x, double y) { return c[3]*2.0+c[6]*6.0*x+c[7]*2.0*y; } double phi32xy(double c[], double x, double y) { return c[4]+c[7]*2.0*x+c[8]*2.0*y; } double phi32yy(double c[], double x, double y) { return c[5]*2.0+c[8]*2.0*x+c[9]*6.0*y; } double phi32xxx(double c[], double x, double y) { return c[6]*6.0; } double phi32xxy(double c[], double x, double y) { return c[7]*2.0; } double phi32xyy(double c[], double x, double y) { return c[8]*2.0; } double phi32yyy(double c[], double x, double y) { return c[9]*6.0; } double phi42(double c[], double x, double y) { return c[0]+c[1]*x+c[2]*y+c[3]*x*x+c[4]*x*y+c[5]*y*y+ c[6]*x*x*x+c[7]*x*x*y+c[8]*x*y*y+c[9]*y*y*y+ c[10]*x*x*x*x+c[11]*x*x*x*y+c[12]*x*x*y*y+ c[13]*x*y*y*y+c[14]*y*y*y*y; } double phi42x(double c[], double x, double y) { return c[1]+c[3]*2.0*x+c[3]*y+ c[6]*3.0*x*x+c[7]*2.0*x*y+c[8]*y*y+ c[13]*y*y*y; } double phi42y(double c[], double x, double y) { return c[0]; /* TBD */ } double phi42xx(double c[], double x, double y) { return c[0]; } double phi42xy(double c[], double x, double y) { return c[0]; } double phi42yy(double c[], double x, double y) { return c[0]; } double phi42xxx(double c[], double x, double y) { return c[0]; } double phi42xxy(double c[], double x, double y) { return c[0]; } double phi42xyy(double c[], double x, double y) { return c[0]; } double phi42yyy(double c[], double x, double y) { return c[0]; } double phi42xxxx(double c[], double x, double y) { return c[10]*24.0; } double phi42xxxy(double c[], double x, double y) { return c[11]*6.0; } double phi42xxyy(double c[], double x, double y) { return c[12]*4.0; } double phi42xyyy(double c[], double x, double y) { return c[13]*6.0; } double phi42yyyy(double c[], double x, double y) { return c[14]*24.0; } double phi13(double c[], double x, double y, double z) { return c[0]+c[1]*x+c[2]*y+c[3]*z; } double phi13x(double c[], double x, double y, double z) { return c[1]; } double phi13y(double c[], double x, double y, double z) { return c[2]; } double phi13z(double c[], double x, double y, double z) { return c[3]; } double phi23(double c[], double x, double y, double z) { return c[0]+c[1]*x+c[2]*y+c[3]*z+ c[4]*x*x+c[5]*x*y+c[6]*x*z+ c[7]*y*y+c[8]*y*z+c[9]*z*z; } double phi23x(double c[], double x, double y, double z) { return c[1]+c[4]*2.0*x+c[5]*y+c[6]*z; } double phi23y(double c[], double x, double y, double z) { return c[2]+c[5]*x+c[7]*2.0*y+c[8]*z; } double phi23z(double c[], double x, double y, double z) { return c[3]+c[6]*x+c[8]*y+c[9]*2.0*z; } double phi23xx(double c[], double x, double y, double z) { return c[4]*2.0; } double phi23xy(double c[], double x, double y, double z) { return c[5]; } double phi23xz(double c[], double x, double y, double z) { return c[6]; } double phi23yy(double c[], double x, double y, double z) { return c[7]*2.0; } double phi23yz(double c[], double x, double y, double z) { return c[8]; } double phi23zz(double c[], double x, double y, double z) { return c[9]*2.0; } double phi33(double c[], double x, double y, double z) { return c[0]+c[1]*x+c[2]*y+c[3]*z+ c[4]*x*x+c[5]*x*y+c[6]*x*z+ c[7]*y*y+c[8]*y*z+c[9]*z*z+ c[10]*x*x*x+c[11]*x*x*y+c[12]*x*x*z+ c[13]*x*y*y+c[14]*x*y*z+c[15]*x*z*z+ c[16]*y*y*y+c[17]*y*y*z+c[18]*y*z*z+c[19]*z*z*z; } double phi33x(double c[], double x, double y, double z) { return c[0]; /* TBD */ } double phi33y(double c[], double x, double y, double z) { return c[0]; } double phi33z(double c[], double x, double y, double z) { return c[0]; } double phi33xx(double c[], double x, double y, double z) { return c[0]; } double phi33xy(double c[], double x, double y, double z) { return c[0]; } double phi33xz(double c[], double x, double y, double z) { return c[0]; } double phi33yy(double c[], double x, double y, double z) { return c[0]; } double phi33yz(double c[], double x, double y, double z) { return c[0]; } double phi33zz(double c[], double x, double y, double z) { return c[0]; } double phi33xxx(double c[], double x, double y, double z) { return c[10]*6.0; } double phi33xxy(double c[], double x, double y, double z) { return c[11]*2.0; } double phi33xxz(double c[], double x, double y, double z) { return c[12]*2.0; } double phi33xyy(double c[], double x, double y, double z) { return c[13]*2.0; } double phi33xyz(double c[], double x, double y, double z) { return c[14]; } double phi33xzz(double c[], double x, double y, double z) { return c[15]*2.0; } double phi33yyy(double c[], double x, double y, double z) { return c[16]*6.0; } double phi33yyz(double c[], double x, double y, double z) { return c[17]*2.0; } double phi33yzz(double c[], double x, double y, double z) { return c[18]*2.0; } double phi33zzz(double c[], double x, double y, double z) { return c[19]*6.0; } double phi43(double c[], double x, double y, double z) { return c[0]+c[1]*x+c[2]*y+c[3]*z+ c[4]*x*x+c[5]*x*y+c[6]*x*z+ c[7]*y*y+c[8]*y*z+c[9]*z*z+ c[10]*x*x*x+c[11]*x*x*y+c[12]*x*x*z+ c[13]*x*y*y+c[14]*x*y*z+c[15]*x*z*z+ c[16]*y*y*y+c[17]*y*y*z+c[18]*y*z*z+c[19]*z*z*z+ c[20]*x*x*x*x+c[21]*x*x*x*y+c[22]*x*x*x*z+ c[23]*x*x*y*y+c[24]*x*x*y*z+c[25]*x*x*z*z+ c[26]*x*y*y*y+c[27]*x*y*y*z+c[28]*x*y*z*z+ c[29]*x*z*z*z+c[30]*y*y*y*y+c[30]*y*y*y*z+ c[31]*y*y*z*z+c[32]*y*z*z*z+c[33]*z*z*z*z; } double phi43x(double c[], double x, double y, double z) { return c[0]; } double phi43y(double c[], double x, double y, double z) { return c[0]; } double phi43z(double c[], double x, double y, double z) { return c[0]; } double phi43xx(double c[], double x, double y, double z) { return c[0]; } double phi43xy(double c[], double x, double y, double z) { return c[0]; } double phi43xz(double c[], double x, double y, double z) { return c[0]; } double phi43yy(double c[], double x, double y, double z) { return c[0]; } double phi43yz(double c[], double x, double y, double z) { return c[0]; } double phi43zz(double c[], double x, double y, double z) { return c[0]; } double phi43xxx(double c[], double x, double y, double z) { return c[0]; } double phi43xxy(double c[], double x, double y, double z) { return c[0]; } double phi43xxz(double c[], double x, double y, double z) { return c[0]; } double phi43xyy(double c[], double x, double y, double z) { return c[0]; } double phi43xyz(double c[], double x, double y, double z) { return c[0]; } double phi43xzz(double c[], double x, double y, double z) { return c[0]; } double phi43yyy(double c[], double x, double y, double z) { return c[0]; } double phi43yyz(double c[], double x, double y, double z) { return c[0]; } double phi43yzz(double c[], double x, double y, double z) { return c[0]; } double phi43zzz(double c[], double x, double y, double z) { return c[0]; } double phi43xxxx(double c[], double x, double y, double z) { return c[0]; } double phi43xxxy(double c[], double x, double y, double z) { return c[0]; } double phi43xxxz(double c[], double x, double y, double z) { return c[0]; } double phi43xxyy(double c[], double x, double y, double z) { return c[0]; } double phi43xxyz(double c[], double x, double y, double z) { return c[0]; } double phi43xxzz(double c[], double x, double y, double z) { return c[0]; } double phi43xyyy(double c[], double x, double y, double z) { return c[0]; } double phi43xyyz(double c[], double x, double y, double z) { return c[0]; } double phi43xyzz(double c[], double x, double y, double z) { return c[0]; } double phi43xzzz(double c[], double x, double y, double z) { return c[0]; } double phi43yyyy(double c[], double x, double y, double z) { return c[0]; } double phi43yyyz(double c[], double x, double y, double z) { return c[0]; } double phi43yyzz(double c[], double x, double y, double z) { return c[0]; } double phi43yzzz(double c[], double x, double y, double z) { return c[0]; } double phi43zzzz(double c[], double x, double y, double z) { return c[0]; } double phi14(double c[], double x, double y, double z, double t) { return c[0]+c[1]*x+c[2]*y+c[3]*z+c[4]*t; } double phi14x(double c[], double x, double y, double z, double t) { return c[1]; } double phi14y(double c[], double x, double y, double z, double t) { return c[2]; } double phi14z(double c[], double x, double y, double z, double t) { return c[3]; } double phi14t(double c[], double x, double y, double z, double t) { return c[4]; } /* ... */ double phi44zzzz(double c[], double x, double y, double z, double t) { return c[0]; /* TBD */ } /* end phi_tri.c */