void IntElLine1PhF :: computeCovarBaseVectorAt(IntegrationPoint *ip, FloatArray &G) { FloatMatrix dNdxi; FEInterpolation *interp = this->giveInterpolation(); interp->evaldNdxi( dNdxi, ip->giveNaturalCoordinates(), FEIElementGeometryWrapper(this) ); G.resize(2); G.zero(); int numNodes = this->giveNumberOfNodes(); for ( int i = 1; i <= dNdxi.giveNumberOfRows(); i++ ) { double X1_i = 0.5 * ( this->giveNode(i)->giveCoordinate(1) + this->giveNode(i + numNodes / 2)->giveCoordinate(1) ); // (mean) point on the fictious mid surface double X2_i = 0.5 * ( this->giveNode(i)->giveCoordinate(2) + this->giveNode(i + numNodes / 2)->giveCoordinate(2) ); G.at(1) += dNdxi.at(i, 1) * X1_i; G.at(2) += dNdxi.at(i, 1) * X2_i; } }
void IntElLine2IntPen :: computeCovarBaseVectorAt(IntegrationPoint *ip, FloatArray &G) { // printf("Entering IntElLine2IntPen :: computeCovarBaseVectorAt\n"); // Since we are averaging over the whole element, always evaluate the base vectors at xi = 0. FloatArray xi_0 = {0.0}; FloatMatrix dNdxi; FEInterpolation *interp = this->giveInterpolation(); // interp->evaldNdxi( dNdxi, ip->giveNaturalCoordinates(), FEIElementGeometryWrapper(this) ); interp->evaldNdxi( dNdxi, xi_0, FEIElementGeometryWrapper(this) ); G.resize(2); G.zero(); int numNodes = this->giveNumberOfNodes(); for ( int i = 1; i <= dNdxi.giveNumberOfRows(); i++ ) { double X1_i = 0.5 * ( this->giveNode(i)->giveCoordinate(1) + this->giveNode(i + numNodes / 2)->giveCoordinate(1) ); // (mean) point on the fictious mid surface double X2_i = 0.5 * ( this->giveNode(i)->giveCoordinate(2) + this->giveNode(i + numNodes / 2)->giveCoordinate(2) ); G.at(1) += dNdxi.at(i, 1) * X1_i; G.at(2) += dNdxi.at(i, 1) * X2_i; } }