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; }
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; } } }