int ActuatorCorot::update() { if (theChannel == 0) { if (this->setupConnection() != 0) { opserr << "ActuatorCorot::update() - " << "failed to setup connection\n"; return -1; } } // determine dsp in basic system const Vector &dsp1 = theNodes[0]->getTrialDisp(); const Vector &dsp2 = theNodes[1]->getTrialDisp(); // initial offsets d21[0] = L; d21[1] = 0.0; d21[2] = 0.0; // update offsets in basic system due to nodal displacements for (int i=0; i<numDIM; i++) { d21[0] += (dsp2(i)-dsp1(i))*R(0,i); d21[1] += (dsp2(i)-dsp1(i))*R(1,i); d21[2] += (dsp2(i)-dsp1(i))*R(2,i); } // compute new length and deformation Ln = sqrt(d21[0]*d21[0] + d21[1]*d21[1] + d21[2]*d21[2]); db(0) = Ln - L; return 0; }
const Vector& ElasticTimoshenkoBeam2d::getResistingForce() { // zero the residual theVector.Zero(); // get global trial displacements const Vector &dsp1 = theNodes[0]->getTrialDisp(); const Vector &dsp2 = theNodes[1]->getTrialDisp(); static Vector ug(6); for (int i=0; i<3; i++) { ug(i) = dsp1(i); ug(i+3) = dsp2(i); } // transform response from the global to the local system ul.addMatrixVector(0.0, Tgl, ug, 1.0); // get the resisting forces in local system ql.addMatrixVector(0.0, kl, ul, 1.0); // add P-Delta moments to local forces if ((ql(0) != 0.0) && (nlGeo == 1)) ql.addMatrixVector(1.0, klgeo, ul, ql(0)); // add effects of element loads, ql = ql(ul) + ql0 ql.addVector(1.0, ql0, 1.0); // determine resisting forces in global system theVector.addMatrixTransposeVector(0.0, Tgl, ql, 1.0); return theVector; }
int TwoNodeLink::update() { int errCode = 0; // get global trial response const Vector &dsp1 = theNodes[0]->getTrialDisp(); const Vector &dsp2 = theNodes[1]->getTrialDisp(); const Vector &vel1 = theNodes[0]->getTrialVel(); const Vector &vel2 = theNodes[1]->getTrialVel(); int numDOF2 = numDOF/2; Vector ug(numDOF), ugdot(numDOF), uldot(numDOF); for (int i=0; i<numDOF2; i++) { ug(i) = dsp1(i); ugdot(i) = vel1(i); ug(i+numDOF2) = dsp2(i); ugdot(i+numDOF2) = vel2(i); } // transform response from the global to the local system ul.addMatrixVector(0.0, Tgl, ug, 1.0); uldot.addMatrixVector(0.0, Tgl, ugdot, 1.0); // transform response from the local to the basic system ub.addMatrixVector(0.0, Tlb, ul, 1.0); ubdot.addMatrixVector(0.0, Tlb, uldot, 1.0); //ub = (Tlb*Tgl)*ug; //ubdot = (Tlb*Tgl)*ugdot; // set trial response for material models for (int i=0; i<numDir; i++) errCode += theMaterials[i]->setTrialStrain(ub(i),ubdot(i)); return errCode; }
int YamamotoBiaxialHDR::update() { // get global trial displacements and velocities const Vector &dsp1 = theNodes[0]->getTrialDisp(); const Vector &dsp2 = theNodes[1]->getTrialDisp(); static Vector globalDisp(12), globalDispDot(12); for (int i=0; i<6; i++) { globalDisp(i) = dsp1(i); globalDisp(i+6) = dsp2(i); } static Vector localDispDot(12); // transform response from the global to the local system localDisp = Tgl*globalDisp; // transform response from the local to the basic system basicDisp = Tlb*localDisp; // calculate shear forces and stiffnesses in basic y- and z-direction // get trial shear forces of hysteretic component basicForce.Zero(); basicStiff.Zero(); this->setTrialStrain(basicDisp); basicForce(1) = this->getStress(0); basicForce(2) = this->getStress(1); basicStiff(1,1) = this->getTangent(0); basicStiff(2,2) = this->getTangent(1); //check print //opserr << "basicStiff: " << basicStiff << endln; return 0; }
const Matrix& ElasticTimoshenkoBeam2d::getTangentStiff() { // zero the matrix theMatrix.Zero(); if (nlGeo == 0) { // transform from local to global system theMatrix.addMatrixTripleProduct(0.0, Tgl, kl, 1.0); } else { // initialize local stiffness matrix static Matrix klTot(6,6); klTot.addMatrix(0.0, kl, 1.0); // get global trial displacements const Vector &dsp1 = theNodes[0]->getTrialDisp(); const Vector &dsp2 = theNodes[1]->getTrialDisp(); static Vector ug(6); for (int i=0; i<3; i++) { ug(i) = dsp1(i); ug(i+3) = dsp2(i); } // transform response from the global to the local system ul.addMatrixVector(0.0, Tgl, ug, 1.0); // get the resisting forces in local system ql.addMatrixVector(0.0, kl, ul, 1.0); // add geometric stiffness to local stiffness if (ql(0) != 0.0) klTot.addMatrix(1.0, klgeo, ql(0)); // transform from local to global system theMatrix.addMatrixTripleProduct(0.0, Tgl, klTot, 1.0); } return theMatrix; }
int ElastomericBearingBoucWen2d::update() { // get global trial displacements and velocities const Vector &dsp1 = theNodes[0]->getTrialDisp(); const Vector &dsp2 = theNodes[1]->getTrialDisp(); const Vector &vel1 = theNodes[0]->getTrialVel(); const Vector &vel2 = theNodes[1]->getTrialVel(); static Vector ug(6), ugdot(6), uldot(6), ubdot(3); for (int i=0; i<3; i++) { ug(i) = dsp1(i); ugdot(i) = vel1(i); ug(i+3) = dsp2(i); ugdot(i+3) = vel2(i); } // transform response from the global to the local system ul.addMatrixVector(0.0, Tgl, ug, 1.0); uldot.addMatrixVector(0.0, Tgl, ugdot, 1.0); // transform response from the local to the basic system ub.addMatrixVector(0.0, Tlb, ul, 1.0); ubdot.addMatrixVector(0.0, Tlb, uldot, 1.0); // 1) get axial force and stiffness in basic x-direction theMaterials[0]->setTrialStrain(ub(0), ubdot(0)); qb(0) = theMaterials[0]->getStress(); kb(0,0) = theMaterials[0]->getTangent(); // 2) calculate shear force and stiffness in basic y-direction // get displacement increment (trial - commited) double delta_ub = ub(1) - ubC(1); if (fabs(delta_ub) > 0.0) { // get yield displacement double uy = qYield/k0; // calculate hysteretic evolution parameter z using Newton-Raphson int iter = 0; double zAbs, tmp1, f, Df, delta_z; do { zAbs = fabs(z); if (zAbs == 0.0) // check because of negative exponents zAbs = DBL_EPSILON; tmp1 = gamma + beta*sgn(z*delta_ub); // function and derivative f = z - zC - delta_ub/uy*(A - pow(zAbs,eta)*tmp1); Df = 1.0 + delta_ub/uy*eta*pow(zAbs,eta-1.0)*sgn(z)*tmp1; // issue warning if derivative Df is zero if (fabs(Df) <= DBL_EPSILON) { opserr << "WARNING: ElastomericBearingBoucWen2d::update() - " << "zero derivative in Newton-Raphson scheme for " << "hysteretic evolution parameter z.\n"; return -1; } // advance one step delta_z = f/Df; z -= delta_z; iter++; } while ((fabs(delta_z) >= tol) && (iter < maxIter)); // issue warning if Newton-Raphson scheme did not converge if (iter >= maxIter) { opserr << "WARNING: ElastomericBearingBoucWen2d::update() - " << "did not find the hysteretic evolution parameter z after " << iter << " iterations and norm: " << fabs(delta_z) << endln; return -2; } // get derivative of hysteretic evolution parameter * uy dzdu = A - pow(fabs(z),eta)*(gamma + beta*sgn(z*delta_ub)); // set shear force qb(1) = qYield*z + k2*ub(1) + k3*sgn(ub(1))*pow(fabs(ub(1)),mu); // set tangent stiffness kb(1,1) = k0*dzdu + k2 + k3*mu*pow(fabs(ub(1)),mu-1.0); } // 3) get moment and stiffness about basic z-direction theMaterials[1]->setTrialStrain(ub(2), ubdot(2)); qb(2) = theMaterials[1]->getStress(); kb(2,2) = theMaterials[1]->getTangent(); return 0; }
int SingleFPSimple2d::update() { // get global trial displacements and velocities const Vector &dsp1 = theNodes[0]->getTrialDisp(); const Vector &dsp2 = theNodes[1]->getTrialDisp(); const Vector &vel1 = theNodes[0]->getTrialVel(); const Vector &vel2 = theNodes[1]->getTrialVel(); static Vector ug(6), ugdot(6), uldot(6), ubdot(3); for (int i=0; i<3; i++) { ug(i) = dsp1(i); ugdot(i) = vel1(i); ug(i+3) = dsp2(i); ugdot(i+3) = vel2(i); } // transform response from the global to the local system ul = Tgl*ug; uldot = Tgl*ugdot; // transform response from the local to the basic system ub = Tlb*ul; ubdot = Tlb*uldot; // get absolute velocity double ubdotAbs = sqrt(pow(ubdot(1)/Reff*ub(1),2) + pow(ubdot(1),2)); // 1) get axial force and stiffness in basic x-direction double ub0Old = theMaterials[0]->getStrain(); theMaterials[0]->setTrialStrain(ub(0),ubdot(0)); qb(0) = theMaterials[0]->getStress(); kb(0,0) = theMaterials[0]->getTangent(); // check for uplift if (qb(0) >= 0.0) { kb = kbInit; if (qb(0) > 0.0) { theMaterials[0]->setTrialStrain(ub0Old,0.0); kb(0,0) *= DBL_EPSILON; kb(2,2) *= DBL_EPSILON; // update plastic displacement ubPlastic = ub(1); } qb.Zero(); return 0; } // 2) calculate shear force and stiffness in basic y-direction int iter = 0; double qb1Old = 0.0; do { // save old shear force qb1Old = qb(1); // get normal and friction (yield) forces double N = -qb(0) + qb(1)/Reff*ub(1) - qb(1)*ul(2); theFrnMdl->setTrial(N, ubdotAbs); double qYield = (theFrnMdl->getFrictionForce()); // get stiffness of elastic component double k2 = N/Reff; // get initial stiffness of hysteretic component double k0 = qYield/uy; // get trial shear force of hysteretic component double qTrial = k0*(ub(1) - ubPlasticC); // compute yield criterion of hysteretic component double qTrialNorm = fabs(qTrial); double Y = qTrialNorm - qYield; // elastic step -> no updates required if (Y <= 0.0) { // set shear force qb(1) = qTrial + k2*ub(1) - N*ul(2); // set tangent stiffness kb(1,1) = k0 + k2; } // plastic step -> return mapping else { // compute consistency parameter double dGamma = Y/k0; // update plastic displacement ubPlastic = ubPlasticC + dGamma*qTrial/qTrialNorm; // set shear force qb(1) = qYield*qTrial/qTrialNorm + k2*ub(1) - N*ul(2); // set tangent stiffness kb(1,1) = k2; } iter++; } while ((fabs(qb(1)-qb1Old) >= tol) && (iter < maxIter)); // issue warning if iteration did not converge if (iter >= maxIter) { opserr << "WARNING: SingleFPSimple2d::update() - did not find the shear force after " << iter << " iterations and norm: " << fabs(qb(1)-qb1Old) << endln; return -1; } // 3) get moment and stiffness in basic z-direction theMaterials[1]->setTrialStrain(ub(2),ubdot(2)); qb(2) = theMaterials[1]->getStress(); kb(2,2) = theMaterials[1]->getTangent(); return 0; }
int ElastomericBearing2d::update() { // get global trial displacements and velocities const Vector &dsp1 = theNodes[0]->getTrialDisp(); const Vector &dsp2 = theNodes[1]->getTrialDisp(); const Vector &vel1 = theNodes[0]->getTrialVel(); const Vector &vel2 = theNodes[1]->getTrialVel(); static Vector ug(6), ugdot(6), uldot(6), ubdot(3); for (int i=0; i<3; i++) { ug(i) = dsp1(i); ugdot(i) = vel1(i); ug(i+3) = dsp2(i); ugdot(i+3) = vel2(i); } // transform response from the global to the local system ul = Tgl*ug; uldot = Tgl*ugdot; // transform response from the local to the basic system ub = Tlb*ul; ubdot = Tlb*uldot; // 1) get axial force and stiffness in basic x-direction theMaterials[0]->setTrialStrain(ub(0),ubdot(0)); qb(0) = theMaterials[0]->getStress(); kb(0,0) = theMaterials[0]->getTangent(); // 2) calculate shear force and stiffness in basic y-direction // get trial shear force of hysteretic component double qTrial = k0*(ub(1) - ubPlasticC); // compute yield criterion of hysteretic component double qTrialNorm = fabs(qTrial); double Y = qTrialNorm - qYield; // elastic step -> no updates required if (Y <= 0.0) { // set shear force qb(1) = qTrial + k2*ub(1); // set tangent stiffness kb(1,1) = k0 + k2; } // plastic step -> return mapping else { // compute consistency parameter double dGamma = Y/k0; // update plastic displacement ubPlastic = ubPlasticC + dGamma*qTrial/qTrialNorm; // set shear force qb(1) = qYield*qTrial/qTrialNorm + k2*ub(1); // set tangent stiffness kb(1,1) = k2; } // 3) get moment and stiffness in basic z-direction theMaterials[1]->setTrialStrain(ub(2),ubdot(2)); qb(2) = theMaterials[1]->getStress(); kb(2,2) = theMaterials[1]->getTangent(); return 0; }