const Vector& ElasticIsotropicBeamFiber2d::getStressSensitivity(int gradIndex, bool conditional) { sigma(0) = 0.0; sigma(1) = 0.0; if (parameterID == 1) { // E //double mu = 0.5*E/(1.0+v); double dmudE = 0.5/(1.0+v); sigma(0) = Tepsilon(0); sigma(1) = dmudE*Tepsilon(1); } if (parameterID == 2) { // nu //double mu = 0.5*E/(1.0+v); double dmudnu = -0.5*E/(1.0 + 2*v + v*v); sigma(0) = 0.0; sigma(1) = dmudnu*Tepsilon(1); } return sigma; }
const Vector& ElasticIsotropicBeamFiber2d::getStress (void) { double mu = 0.50*E/(1.0+v); sigma(0) = E*Tepsilon(0); sigma(1) = mu*Tepsilon(1); return sigma; }
const Vector& ElasticIsotropicBeamFiber::getStressSensitivity(int gradIndex, bool conditional) { sigma.Zero(); if (parameterID == 1) { // E //double mu = 0.5*E/(1.0+v); double dmudE = 0.5/(1.0+v); sigma(0) = Tepsilon(0); sigma(1) = dmudE*Tepsilon(1); sigma(2) = dmudE*Tepsilon(2); } return sigma; }
int J2BeamFiber2d::commitSensitivity(const Vector &depsdh, int gradIndex, int numGrads) { if (SHVs == 0) { SHVs = new Matrix(3,numGrads); } if (gradIndex >= SHVs->noCols()) { //opserr << gradIndex << ' ' << SHVs->noCols() << endln; return 0; } //return 0; double dEdh = 0.0; double dsigmaYdh = 0.0; double dHkindh = 0.0; double dHisodh = 0.0; double dGdh = 0.0; if (parameterID == 1) { // E dEdh = 1.0; dGdh = 0.5/(1.0+nu); } if (parameterID == 2) { // nu dGdh = -0.5*E/(1.0 + 2.0*nu + nu*nu); } if (parameterID == 5) { dsigmaYdh = 1.0; } if (parameterID == 6) { dHkindh = 1.0; } if (parameterID == 7) { dHisodh = 1.0; } double G = 0.5*E/(1.0+nu); double depsPdh[2]; depsPdh[0] = 0.0; depsPdh[1] = 0.0; double dalphadh = 0.0; if (SHVs != 0) { depsPdh[0] = (*SHVs)(0,gradIndex); depsPdh[1] = (*SHVs)(1,gradIndex); dalphadh = (*SHVs)(2,gradIndex); } static const double one3 = 1.0/3; static const double two3 = 2.0*one3; static const double root23 = sqrt(two3); double xsi[2]; xsi[0] = E*(Tepsilon(0)-epsPn1[0]) - Hkin*epsPn1[0]; xsi[1] = G*(Tepsilon(1)-epsPn1[1]) - one3*Hkin*epsPn1[1]; double q = sqrt(two3*xsi[0]*xsi[0] + 2.0*xsi[1]*xsi[1]); double F = q - root23*(sigmaY + Hiso*alphan1); if (F <= -100*DBL_EPSILON) { // Do nothing } else { static Matrix J(3,3); static Vector b(3); static Vector dx(3); double dg = dg_n1; J(0,0) = 1.0 + dg*two3*(E+Hkin); J(0,1) = 0.0; J(1,0) = 0.0; J(1,1) = 1.0 + dg*(2.0*G+two3*Hkin); J(0,2) = two3*(E+Hkin)*xsi[0]; J(1,2) = (2.0*G+two3*Hkin)*xsi[1]; //J(2,0) = xsi[0]*two3/q; J(2,1) = xsi[1]*2.0/q; J(2,0) = (1.0-two3*Hiso*dg)*xsi[0]*two3/q; J(2,1) = (1.0-two3*Hiso*dg)*xsi[1]*2.0/q; //J(2,2) = -root23*Hiso; J(2,2) = -two3*Hiso*q; b(0) = E*depsdh(0) + dEdh*Tepsilon(0) - (E+ Hkin)*depsPdh[0] - (dEdh+ dHkindh)*epsPn1[0]; b(1) = G*depsdh(1) + dGdh*Tepsilon(1) - (G+one3*Hkin)*depsPdh[1] - (dGdh+one3*dHkindh)*epsPn1[1]; b(2) = root23*(dsigmaYdh + dHisodh*alphan1 + Hiso*dalphadh); J.Solve(b, dx); dalphadh += dx(2)*root23*q + dg*root23*(xsi[0]*two3*dx(0)+xsi[1]*2.0*dx(1))/q; depsPdh[0] += dx(2)*two3*xsi[0] + dg*two3*dx(0); depsPdh[1] += dx(2)* 2.0*xsi[1] + dg* 2.0*dx(1); (*SHVs)(0,gradIndex) = depsPdh[0]; (*SHVs)(1,gradIndex) = depsPdh[1]; (*SHVs)(2,gradIndex) = dalphadh; } return 0; }
const Vector& J2BeamFiber2d::getStressSensitivity(int gradIndex, bool conditional) { static Vector sigma(2); sigma(0) = 0.0; sigma(1) = 0.0; double dEdh = 0.0; double dsigmaYdh = 0.0; double dHkindh = 0.0; double dHisodh = 0.0; double dGdh = 0.0; if (parameterID == 1) { // E dEdh = 1.0; dGdh = 0.5/(1.0+nu); } if (parameterID == 2) { // nu dGdh = -0.5*E/(1.0 + 2.0*nu + nu*nu); } if (parameterID == 5) { dsigmaYdh = 1.0; } if (parameterID == 6) { dHkindh = 1.0; } if (parameterID == 7) { dHisodh = 1.0; } double G = 0.5*E/(1.0+nu); double depsPdh[2]; depsPdh[0] = 0.0; depsPdh[1] = 0.0; double dalphadh = 0.0; if (SHVs != 0) { depsPdh[0] = (*SHVs)(0,gradIndex); depsPdh[1] = (*SHVs)(1,gradIndex); dalphadh = (*SHVs)(2,gradIndex); } static const double one3 = 1.0/3; static const double two3 = 2.0*one3; static const double root23 = sqrt(two3); double xsi[2]; xsi[0] = E*(Tepsilon(0)-epsPn1[0]) - Hkin*epsPn1[0]; xsi[1] = G*(Tepsilon(1)-epsPn1[1]) - one3*Hkin*epsPn1[1]; double q = sqrt(two3*xsi[0]*xsi[0] + 2.0*xsi[1]*xsi[1]); double F = q - root23*(sigmaY + Hiso*alphan1); if (F <= -100*DBL_EPSILON) { sigma(0) = dEdh*(Tepsilon(0)-epsPn1[0]) - E*depsPdh[0]; sigma(1) = dGdh*(Tepsilon(1)-epsPn1[1]) - G*depsPdh[1]; } else { static Matrix J(3,3); static Vector b(3); static Vector dx(3); double dg = dg_n1; J(0,0) = 1.0 + dg*two3*(E+Hkin); J(0,1) = 0.0; J(1,0) = 0.0; J(1,1) = 1.0 + dg*(2.0*G+two3*Hkin); J(0,2) = two3*(E+Hkin)*xsi[0]; J(1,2) = (2.0*G+two3*Hkin)*xsi[1]; //J(2,0) = xsi[0]*two3/q; J(2,1) = xsi[1]*2.0/q; J(2,0) = (1.0-two3*Hiso*dg)*xsi[0]*two3/q; J(2,1) = (1.0-two3*Hiso*dg)*xsi[1]*2.0/q; //J(2,2) = -root23*Hiso; J(2,2) = -two3*Hiso*q; b(0) = dEdh*Tepsilon(0) - (E+ Hkin)*depsPdh[0] - (dEdh+ dHkindh)*epsPn1[0]; b(1) = dGdh*Tepsilon(1) - (G+one3*Hkin)*depsPdh[1] - (dGdh+one3*dHkindh)*epsPn1[1]; b(2) = root23*(dsigmaYdh + dHisodh*alphan1 + Hiso*dalphadh); J.Solve(b, dx); depsPdh[0] += dx(2)*two3*xsi[0] + dg*two3*dx(0); depsPdh[1] += dx(2)* 2.0*xsi[1] + dg* 2.0*dx(1); sigma(0) = dx(0) + Hkin*depsPdh[0] + dHkindh*epsPn1[0]; sigma(1) = dx(1) + one3*Hkin*depsPdh[1] + one3*dHkindh*epsPn1[1]; } return sigma; }
const Vector& J2BeamFiber2d::getStress (void) { double G = 0.5*E/(1.0+nu); sigma(0) = E*(Tepsilon(0)-epsPn[0]); sigma(1) = G*(Tepsilon(1)-epsPn[1]); static const double one3 = 1.0/3; static const double two3 = 2.0*one3; static const double root23 = sqrt(two3); double xsi[2]; //xsi[0] = sigma(0) - two3*Hkin*1.5*epsPn[0]; //xsi[1] = sigma(1) - two3*Hkin*0.5*epsPn[1]; xsi[0] = sigma(0) - Hkin*epsPn[0]; xsi[1] = sigma(1) - one3*Hkin*epsPn[1]; double q = sqrt(two3*xsi[0]*xsi[0] + 2.0*xsi[1]*xsi[1]); double F = q - root23*(sigmaY + Hiso*alphan); if (F < -100*DBL_EPSILON) { epsPn1[0] = epsPn[0]; epsPn1[1] = epsPn[1]; } else { // Solve for dg double dg = 0.0; static Vector R(3); R(0) = 0.0; R(1) = 0.0; R(2) = F; static Vector x(3); x(0) = xsi[0]; x(1) = xsi[1]; x(2) = dg; static Matrix J(3,3); static Vector dx(3); int iter = 0; int maxIter = 25; while (iter < maxIter && R.Norm() > sigmaY*1.0e-14) { iter++; J(0,0) = 1.0 + dg*two3*(E+Hkin); J(0,1) = 0.0; J(1,0) = 0.0; J(1,1) = 1.0 + dg*(2.0*G+two3*Hkin); J(0,2) = two3*(E+Hkin)*x(0); J(1,2) = (2.0*G+two3*Hkin)*x(1); //J(2,0) = x(0)*two3/q; J(2,1) = x(1)*2.0/q; J(2,0) = (1.0-two3*Hiso*dg)*x(0)*two3/q; J(2,1) = (1.0-two3*Hiso*dg)*x(1)*2.0/q; //J(2,2) = -root23*Hiso; J(2,2) = -two3*Hiso*q; J.Solve(R, dx); x = x-dx; dg = x(2); dg_n1 = dg; q = sqrt(two3*x(0)*x(0) + 2.0*x(1)*x(1)); R(0) = x(0) - xsi[0] + dg*two3*(E+Hkin)*x(0); R(1) = x(1) - xsi[1] + dg*(2.0*G+two3*Hkin)*x(1); R(2) = q - root23*(sigmaY + Hiso*(alphan+dg*root23*q)); } if (iter == maxIter) { //opserr << "J2BeamFiber2d::getStress -- maxIter reached " << R.Norm() << endln; } alphan1 = alphan + dg*root23*q; epsPn1[0] = epsPn[0] + dg*two3*x(0); epsPn1[1] = epsPn[1] + dg*2.0*x(1); //sigma(0) = x(0) + two3*Hkin*1.5*epsPn1[0]; //sigma(1) = x(1) + two3*Hkin*0.5*epsPn1[1]; sigma(0) = x(0) + Hkin*epsPn1[0]; sigma(1) = x(1) + one3*Hkin*epsPn1[1]; } return sigma; }
const Matrix& J2BeamFiber2d::getTangent (void) { double twoG = E/(1.0+nu); double G = 0.5*twoG; double sig[2]; sig[0] = E*(Tepsilon(0)-epsPn[0]); sig[1] = G*(Tepsilon(1)-epsPn[1]); static const double one3 = 1.0/3; static const double two3 = 2.0*one3; static const double root23 = sqrt(two3); double two3Hkin = two3*Hkin; double xsi[2]; //xsi[0] = sig[0] - two3*Hkin*1.5*epsPn[0]; //xsi[1] = sig[1] - two3*Hkin*0.5*epsPn[1]; xsi[0] = sig[0] - Hkin*epsPn[0]; xsi[1] = sig[1] - one3*Hkin*epsPn[1]; double q = sqrt(two3*xsi[0]*xsi[0] + 2.0*xsi[1]*xsi[1]); double F = q - root23*(sigmaY + Hiso*alphan); if (F < -100*DBL_EPSILON) { D(0,0) = E; D(1,1) = G; D(0,1) = D(1,0) = 0.0; epsPn1[0] = epsPn[0]; epsPn1[1] = epsPn[1]; } else { // Solve for dg double dg = 0.0; static Vector R(3); R(0) = 0.0; R(1) = 0.0; R(2) = F; static Vector x(3); x(0) = xsi[0]; x(1) = xsi[1]; x(2) = dg; static Matrix J(3,3); static Vector dx(3); int iter = 0; int maxIter = 25; while (iter < maxIter && R.Norm() > sigmaY*1.0e-14) { iter++; J(0,0) = 1.0 + dg*two3*(E+Hkin); J(0,1) = 0.0; J(1,0) = 0.0; J(1,1) = 1.0 + dg*(twoG+two3Hkin); J(0,2) = two3*(E+Hkin)*x(0); J(1,2) = (twoG+two3Hkin)*x(1); //J(2,0) = x(0)*two3/q; J(2,1) = x(1)*2.0/q; J(2,0) = (1.0-two3*Hiso*dg)*x(0)*two3/q; J(2,1) = (1.0-two3*Hiso*dg)*x(1)*2.0/q; //J(2,2) = -root23*Hiso; J(2,2) = -two3*Hiso*q; J.Solve(R, dx); x.addVector(1.0, dx, -1.0); dg = x(2); dg_n1 = dg; q = sqrt(two3*x(0)*x(0) + 2.0*x(1)*x(1)); R(0) = x(0) - xsi[0] + dg*two3*(E+Hkin)*x(0); R(1) = x(1) - xsi[1] + dg*(twoG+two3Hkin)*x(1); R(2) = q - root23*(sigmaY + Hiso*(alphan+dg*root23*q)); } if (iter == maxIter) { //opserr << "J2BeamFiber2d::getTangent -- maxIter reached " << R.Norm() << endln; } alphan1 = alphan + dg*root23*q; epsPn1[0] = epsPn[0] + dg*two3*x(0); epsPn1[1] = epsPn[1] + dg*2.0*x(1); //J(2,0) = (1.0-two3*Hiso*dg)*x(0)*two3/q; J(2,1) = (1.0-two3*Hiso*dg)*x(1)*2.0/q; //J(2,2) = -two3*Hiso*q; //static Matrix invJ(3,3); //J.Invert(invJ); J(0,0) = 1.0 + dg*two3*E/(1.0+dg*two3Hkin); J(0,1) = 0.0; J(1,0) = 0.0; J(1,1) = 1.0 + dg*twoG/(1.0+dg*two3Hkin); J(0,2) = (two3*E-dg*two3*E/(1.0+dg*two3Hkin)*two3Hkin)*x(0); J(1,2) = (twoG -dg* twoG/(1.0+dg*two3Hkin)*two3Hkin)*x(1); //J(2,0) = x(0)/q*two3/(1.0+dg*two3Hkin); //J(2,1) = x(1)/q* 2.0/(1.0+dg*two3Hkin); J(2,0) = (1.0-two3*Hiso*dg)*x(0)/q*two3/(1.0+dg*two3Hkin); J(2,1) = (1.0-two3*Hiso*dg)*x(1)/q* 2.0/(1.0+dg*two3Hkin); //J(2,2) = -(x(0)/q*two3/(1.0+dg*two3Hkin)*two3Hkin*x(0)) // -(x(1)/q* 2.0/(1.0+dg*two3Hkin)*two3Hkin*x(1)); //J(2,2) = -q*two3Hkin/(1.0+dg*two3Hkin) - root23*Hiso; J(2,2) = -q*two3Hkin/(1.0+dg*two3Hkin) - two3*Hiso*q; static Matrix invJ(3,3); J.Invert(invJ); D(0,0) = invJ(0,0)*E; D(1,0) = invJ(1,0)*E; D(0,1) = invJ(0,1)*G; D(1,1) = invJ(1,1)*G; } return D; }