Exemplo n.º 1
0
double Tri31::shapeFunction(double xi, double eta)
{
	const Vector &nd1Crds = theNodes[0]->getCrds();
	const Vector &nd2Crds = theNodes[1]->getCrds();
	const Vector &nd3Crds = theNodes[2]->getCrds();

	shp[2][0] = xi;	        // N_1
	shp[2][1] = eta;		// N_2
	shp[2][2] = 1-xi-eta;	// N_3

	double J[2][2];

	// See p 180 "A First Course in Finite Elements" by Fish and Belytschko.
	J[0][0] = (nd1Crds(0) - nd3Crds(0));
	J[0][1] = (nd2Crds(0) - nd3Crds(0));
	J[1][0] = (nd1Crds(1) - nd3Crds(1));
	J[1][1] = (nd2Crds(1) - nd3Crds(1));

	double detJ = J[0][0]*J[1][1] - J[0][1]*J[1][0];
	double oneOverdetJ = 1.0/detJ;
	double L[2][2];

	// L = inv(J)
	L[0][0] =  J[1][1]*oneOverdetJ;
	L[1][0] = -J[0][1]*oneOverdetJ;
	L[0][1] = -J[1][0]*oneOverdetJ;
	L[1][1] =  J[0][0]*oneOverdetJ;

	// See Cook, Malkus, Plesha p. 169 for the derivation of these terms
    shp[0][0] = L[0][0];	            // N_1,1
    shp[0][1] = L[0][1];		        // N_2,1
    shp[0][2] = -(L[0][0] + L[0][1]);	// N_3,1
	
    shp[1][0] = L[1][0];	            // N_1,2
    shp[1][1] = L[1][1];		        // N_2,2
    shp[1][2] = -(L[1][0] + L[1][1]);	// N_3,2

    return detJ;
}
double FourNodeQuadWithSensitivity::shapeFunction(double xi, double eta)
{
	const Vector &nd1Crds = theNodes[0]->getCrds();
	const Vector &nd2Crds = theNodes[1]->getCrds();
	const Vector &nd3Crds = theNodes[2]->getCrds();
	const Vector &nd4Crds = theNodes[3]->getCrds();

	double oneMinuseta = 1.0-eta;
	double onePluseta = 1.0+eta;
	double oneMinusxi = 1.0-xi;
	double onePlusxi = 1.0+xi;

	shp[2][0] = 0.25*oneMinusxi*oneMinuseta;	// N_1
	shp[2][1] = 0.25*onePlusxi*oneMinuseta;		// N_2
	shp[2][2] = 0.25*onePlusxi*onePluseta;		// N_3
	shp[2][3] = 0.25*oneMinusxi*onePluseta;		// N_4

	double J[2][2];

	J[0][0] = 0.25 * (-nd1Crds(0)*oneMinuseta + nd2Crds(0)*oneMinuseta +
				nd3Crds(0)*(onePluseta) - nd4Crds(0)*(onePluseta));

	J[0][1] = 0.25 * (-nd1Crds(0)*oneMinusxi - nd2Crds(0)*onePlusxi +
				nd3Crds(0)*onePlusxi + nd4Crds(0)*oneMinusxi);

	J[1][0] = 0.25 * (-nd1Crds(1)*oneMinuseta + nd2Crds(1)*oneMinuseta +
				nd3Crds(1)*onePluseta - nd4Crds(1)*onePluseta);

	J[1][1] = 0.25 * (-nd1Crds(1)*oneMinusxi - nd2Crds(1)*onePlusxi +
				nd3Crds(1)*onePlusxi + nd4Crds(1)*oneMinusxi);

	double detJ = J[0][0]*J[1][1] - J[0][1]*J[1][0];
	double oneOverdetJ = 1.0/detJ;
	double L[2][2];

	// L = inv(J)
	L[0][0] =  J[1][1]*oneOverdetJ;
	L[1][0] = -J[0][1]*oneOverdetJ;
	L[0][1] = -J[1][0]*oneOverdetJ;
	L[1][1] =  J[0][0]*oneOverdetJ;

    double L00 = 0.25*L[0][0];
    double L10 = 0.25*L[1][0];
    double L01 = 0.25*L[0][1];
    double L11 = 0.25*L[1][1];
	
	double L00oneMinuseta = L00*oneMinuseta;
	double L00onePluseta  = L00*onePluseta;
	double L01oneMinusxi  = L01*oneMinusxi;
	double L01onePlusxi   = L01*onePlusxi;

	double L10oneMinuseta = L10*oneMinuseta;
	double L10onePluseta  = L10*onePluseta;
	double L11oneMinusxi  = L11*oneMinusxi;
	double L11onePlusxi   = L11*onePlusxi;

	// See Cook, Malkus, Plesha p. 169 for the derivation of these terms
    shp[0][0] = -L00oneMinuseta - L01oneMinusxi;	// N_1,1
    shp[0][1] =  L00oneMinuseta - L01onePlusxi;		// N_2,1
    shp[0][2] =  L00onePluseta  + L01onePlusxi;		// N_3,1
    shp[0][3] = -L00onePluseta  + L01oneMinusxi;	// N_4,1
	
    shp[1][0] = -L10oneMinuseta - L11oneMinusxi;	// N_1,2
    shp[1][1] =  L10oneMinuseta - L11onePlusxi;		// N_2,2
    shp[1][2] =  L10onePluseta  + L11onePlusxi;		// N_3,2
    shp[1][3] = -L10onePluseta  + L11oneMinusxi;	// N_4,2

    return detJ;
}
Exemplo n.º 3
0
void FourNodeQuadUP::shapeFunction(void)
{
    double xi, eta, oneMinuseta, onePluseta, oneMinusxi, onePlusxi,
           detJ, oneOverdetJ, J[2][2], L[2][2], L00, L01, L10, L11,
           L00oneMinuseta, L00onePluseta, L01oneMinusxi, L01onePlusxi,
           L10oneMinuseta, L10onePluseta, L11oneMinusxi, L11onePlusxi,
           vol = 0.0;
    int k, l;

    for (k=0; k<3; k++) {
        for (l=0; l<4; l++) {
            shpBar[k][l] = 0.0;
        }
    }

    // loop over integration points
    for (int i=0; i<4; i++) {
        xi = pts[i][0];
        eta = pts[i][1];
        const Vector &nd1Crds = nd1Ptr->getCrds();
        const Vector &nd2Crds = nd2Ptr->getCrds();
        const Vector &nd3Crds = nd3Ptr->getCrds();
        const Vector &nd4Crds = nd4Ptr->getCrds();

        oneMinuseta = 1.0-eta;
        onePluseta = 1.0+eta;
        oneMinusxi = 1.0-xi;
        onePlusxi = 1.0+xi;

        shp[2][0][i] = 0.25*oneMinusxi*oneMinuseta;	// N_1
        shp[2][1][i] = 0.25*onePlusxi*oneMinuseta;		// N_2
        shp[2][2][i] = 0.25*onePlusxi*onePluseta;		// N_3
        shp[2][3][i] = 0.25*oneMinusxi*onePluseta;		// N_4

        J[0][0] = 0.25 * (-nd1Crds(0)*oneMinuseta + nd2Crds(0)*oneMinuseta +
                          nd3Crds(0)*(onePluseta) - nd4Crds(0)*(onePluseta));

        J[0][1] = 0.25 * (-nd1Crds(0)*oneMinusxi - nd2Crds(0)*onePlusxi +
                          nd3Crds(0)*onePlusxi + nd4Crds(0)*oneMinusxi);

        J[1][0] = 0.25 * (-nd1Crds(1)*oneMinuseta + nd2Crds(1)*oneMinuseta +
                          nd3Crds(1)*onePluseta - nd4Crds(1)*onePluseta);

        J[1][1] = 0.25 * (-nd1Crds(1)*oneMinusxi - nd2Crds(1)*onePlusxi +
                          nd3Crds(1)*onePlusxi + nd4Crds(1)*oneMinusxi);

        detJ = J[0][0]*J[1][1] - J[0][1]*J[1][0];
        oneOverdetJ = 1.0/detJ;

        // L = inv(J)
        L[0][0] =  J[1][1]*oneOverdetJ;
        L[1][0] = -J[0][1]*oneOverdetJ;
        L[0][1] = -J[1][0]*oneOverdetJ;
        L[1][1] =  J[0][0]*oneOverdetJ;

        L00 = 0.25*L[0][0];
        L10 = 0.25*L[1][0];
        L01 = 0.25*L[0][1];
        L11 = 0.25*L[1][1];

        L00oneMinuseta = L00*oneMinuseta;
        L00onePluseta  = L00*onePluseta;
        L01oneMinusxi  = L01*oneMinusxi;
        L01onePlusxi   = L01*onePlusxi;

        L10oneMinuseta = L10*oneMinuseta;
        L10onePluseta  = L10*onePluseta;
        L11oneMinusxi  = L11*oneMinusxi;
        L11onePlusxi   = L11*onePlusxi;

        // B: See Cook, Malkus, Plesha p. 169 for the derivation of these terms
        shp[0][0][i] = -L00oneMinuseta - L01oneMinusxi;	// N_1,1
        shp[0][1][i] =  L00oneMinuseta - L01onePlusxi;		// N_2,1
        shp[0][2][i] =  L00onePluseta  + L01onePlusxi;		// N_3,1
        shp[0][3][i] = -L00onePluseta  + L01oneMinusxi;	// N_4,1

        shp[1][0][i] = -L10oneMinuseta - L11oneMinusxi;	// N_1,2
        shp[1][1][i] =  L10oneMinuseta - L11onePlusxi;		// N_2,2
        shp[1][2][i] =  L10onePluseta  + L11onePlusxi;		// N_3,2
        shp[1][3][i] = -L10onePluseta  + L11oneMinusxi;	// N_4,2

        dvol[i] = detJ * thickness * wts[i];
        vol += dvol[i];

        for (k=0; k<3; k++) {
            for (l=0; l<4; l++) {
                shpBar[k][l] += shp[k][l][i] * dvol[i];
            }
        }
    }

    for (k=0; k<3; k++) {
        for (l=0; l<4; l++) {
            shpBar[k][l] /= vol;
        }
    }
}