int PFEMIntegrator::newStep(double deltaT) { if (deltaT <= 0.0) { opserr << "PFEMIntegrator::newStep() - error in variable\n"; opserr << "dT = " << deltaT << endln; return -2; } // get a pointer to the AnalysisModel and Domain AnalysisModel *theModel = this->getAnalysisModel(); if(theModel == 0) { opserr << "Analysis model has not been linked - PFEMIntegrator::newStep()\n"; return -1; } Domain* theDomain = theModel->getDomainPtr(); if(theDomain == 0) { opserr<<"WARNING: no domain is set for the model"; opserr<<" -- PFEMIntegrator::newStep()\n"; return -1; } // set the constants c1 = deltaT; c2 = 1.0; c3 = 1.0/deltaT; c4 = deltaT*deltaT; c5 = deltaT; c6 = 1.0; // check if domainchange() is called if (U == 0) { opserr << "PFEMIntegrator::newStep() - domainChange() failed or hasn't been called\n"; return -3; } // set response at t to be that at t+deltaT of previous step (*Ut) = *U; (*Utdot) = *Udot; (*Utdotdot) = *Udotdot; // determinte new disps and accels U->addVector(1.0, *Utdot, deltaT); Udotdot->Zero(); // set states theModel->setDisp(*U); theModel->setAccel(*Udotdot); // increment the time to t+deltaT and apply the load double time = theModel->getCurrentDomainTime(); time += deltaT; if (theModel->updateDomain(time, deltaT) < 0) { opserr << "PFEMIntegrator::newStep() - failed to update the domain\n"; return -4; } return 0; }
int AlphaOS::update(const Vector &deltaU) { updateCount++; if (updateCount > 1) { opserr << "WARNING AlphaOS::update() - called more than once -"; opserr << " AlphaOS integration scheme requires a LINEAR solution algorithm\n"; return -1; } AnalysisModel *theModel = this->getAnalysisModel(); if (theModel == 0) { opserr << "WARNING AlphaOS::update() - no AnalysisModel set\n"; return -2; } // check domainChanged() has been called, i.e. Ut will not be zero if (Ut == 0) { opserr << "WARNING AlphaOS::update() - domainChange() failed or not called\n"; return -3; } // check deltaU is of correct size if (deltaU.Size() != U->Size()) { opserr << "WARNING AlphaOS::update() - Vectors of incompatible size "; opserr << " expecting " << U->Size() << " obtained " << deltaU.Size() << "\n"; return -4; } // save the predictor displacements (*Upt) = *U; // determine the response at t+deltaT U->addVector(1.0, deltaU, c1); Udot->addVector(1.0, deltaU, c2); Udotdot->addVector(0.0, deltaU, c3); // update the response at the DOFs theModel->setVel(*Udot); theModel->setAccel(*Udotdot); if (theModel->updateDomain() < 0) { opserr << "AlphaOS::update() - failed to update the domain\n"; return -5; } // do not update displacements in elements only at nodes theModel->setDisp(*U); return 0; }
int CentralDifferenceAlternative::update(const Vector &X) { updateCount++; if (updateCount > 1) { opserr << "ERROR CentralDifferenceAlternative::update() - called more than once -"; opserr << " Central Difference integraion schemes require a LINEAR solution algorithm\n"; return -1; } AnalysisModel *theModel = this->getAnalysisModel(); if (theModel == 0) { opserr << "ERROR CentralDifferenceAlternative::update() - no AnalysisModel set\n"; return -2; } // check domainChanged() has been called, i.e. Ut will not be zero if (Ut == 0) { opserr << "WARNING CentralDifferenceAlternative::update() - domainChange() failed or not called\n"; return -2; } // check deltaU is of correct size if (X.Size() != Ut->Size()) { opserr << "WARNING CentralDifferenceAlternative::update() - Vectors of incompatible size "; opserr << " expecting " << Ut->Size() << " obtained " << X.Size() << endln; return -3; } // determine the displacement at t+delta t Utp1->addVector(0.0, X, deltaT * deltaT); (*Utp1) += *Ut; Utp1->addVector(1.0, *Udot, deltaT); // determine the vel at t+ 0.5 * delta t (*Udot) = *Utp1; (*Udot) -= *Ut; (*Udot) *= (1.0/deltaT); // update the disp & responses at the DOFs theModel->setDisp(*Utp1); theModel->setVel(*Udot); theModel->updateDomain(); return 0; }
int Newmark::newStep(double deltaT) { if (beta == 0 || gamma == 0) { opserr << "Newmark::newStep() - error in variable\n"; opserr << "gamma = " << gamma << " beta = " << beta << endln; return -1; } if (deltaT <= 0.0) { opserr << "Newmark::newStep() - error in variable\n"; opserr << "dT = " << deltaT << endln; return -2; } // get a pointer to the AnalysisModel AnalysisModel *theModel = this->getAnalysisModel(); // set the constants if (displ == true) { c1 = 1.0; c2 = gamma/(beta*deltaT); c3 = 1.0/(beta*deltaT*deltaT); } else { c1 = beta*deltaT*deltaT; c2 = gamma*deltaT; c3 = 1.0; } if (U == 0) { opserr << "Newmark::newStep() - domainChange() failed or hasn't been called\n"; return -3; } // set response at t to be that at t+deltaT of previous step (*Ut) = *U; (*Utdot) = *Udot; (*Utdotdot) = *Udotdot; if (displ == true) { // determine new velocities and accelerations at t+deltaT double a1 = (1.0 - gamma/beta); double a2 = (deltaT)*(1.0 - 0.5*gamma/beta); Udot->addVector(a1, *Utdotdot, a2); double a3 = -1.0/(beta*deltaT); double a4 = 1.0 - 0.5/beta; Udotdot->addVector(a4, *Utdot, a3); // set the trial response quantities theModel->setVel(*Udot); theModel->setAccel(*Udotdot); } else { // determine new displacements and velocities at t+deltaT double a1 = (deltaT*deltaT/2.0); U->addVector(1.0, *Utdot, deltaT); U->addVector(1.0, *Utdotdot, a1); Udot->addVector(1.0, *Utdotdot, deltaT); // set the trial response quantities theModel->setDisp(*U); theModel->setVel(*Udot); } // increment the time to t+deltaT and apply the load double time = theModel->getCurrentDomainTime(); time += deltaT; if (theModel->updateDomain(time, deltaT) < 0) { opserr << "Newmark::newStep() - failed to update the domain\n"; return -4; } return 0; }