void TypeOfFE_P1Lagrange1d::FB(const What_d whatd,const Mesh & ,const Element & K,const R1 & P,RNMK_ & val) const { // const Triangle & K(FE.T); R l[]={1.-P.sum(),P.x}; assert(val.N() >=Element::nv); assert(val.M()==1 ); val=0; RN_ f0(val('.',0,op_id)); if (whatd & Fop_D0) { f0[0] = l[0]; f0[1] = l[1]; } if (whatd & Fop_D1) { R1 Dl[3]; K.Gradlambda(Dl); if (whatd & Fop_dx) { RN_ f0x(val('.',0,op_dx)); f0x[0] = Dl[0].x; f0x[1] = Dl[1].x; } } }
void TypeOfFE_P2Lagrange1d::FB(const What_d whatd,const Mesh & ,const Element & K,const R1 & P,RNMK_ & val) const { // const Triangle & K(FE.T); R l[]={1.-P.sum(),P.x}; assert(val.N() >=E::nv+E::ne); assert(val.M()==1 ); val=0; RN_ f0(val('.',0,op_id)); // if (whatd & Fop_D0) { int k=0; for(int i=0;i<E::nv;++i) f0[k++] = l[i]*(2*l[i]-1.); for(int i=0;i<E::ne;++i) f0[k++] = 4.*l[E::nvedge[i][0]]*l[E::nvedge[i][1]]; } if (whatd & (Fop_D1|Fop_D2)) { R1 Dl[2]; R l4[2]={ (4*l[0]-1),(4*l[1]-1)}; K.Gradlambda(Dl); RN_ f0x(val('.',0,op_dx)); int k=0; for(int i=0;i<E::nv;++i,++k) { f0x[k] = Dl[i].x*l4[i]; } for(int i=0;i<E::ne;++i,++k) { int i0=E::nvedge[i][0],i1=E::nvedge[i][1]; f0x[k] = 4*(Dl[i1].x*l[i0] + Dl[i0].x*l[i1]) ; } assert(k==1); //cout << " D2 " << whatd << endl; if (whatd & Fop_D2) { //cout << " D2 " << endl; RN_ f0xx(val('.',0,op_dxx)); k=0; for(int i=0;i<E::nv;++i,++k) { f0xx[k] = 4.*Dl[i].x*Dl[i].x; } for(int i=0;i<E::ne;++i,++k) { int i0=E::nvedge[i][0],i1=E::nvedge[i][1]; f0xx[k] = 8.*Dl[i0].x*Dl[i1].x; } } } }