Advance to a new time step This method implements the leap-frog scheme: - Velocity is stored at half time steps: v_{t+0.5*dt} - Displacement is at full time steps: u_t, u_{t+dt} - Acceleration is at full time steps: a_t, a_{t+dt}
| 97 | // - Displacement is at full time steps: u_t, u_{t+dt} |
| 98 | // - Acceleration is at full time steps: a_t, a_{t+dt} |
| 99 | int ExplicitDifferenceStatic::newStep(double _deltaT) |
| 100 | { |
| 101 | updateCount = 0; |
| 102 | deltaT = _deltaT; |
| 103 | |
| 104 | if (deltaT <= 0.0) { |
| 105 | opserr << "ExplicitDifferenceStatic::newStep() - error in variable\n"; |
| 106 | opserr << "dT = " << deltaT << endln; |
| 107 | return -1; |
| 108 | } |
| 109 | |
| 110 | AnalysisModel *theModel = this->getAnalysisModel(); |
| 111 | |
| 112 | // Leap-frog update: advance velocity to t+0.5*dt and displacement to t+dt |
| 113 | Utdot->addVector(1.0, *Utdotdot, deltaT); // v_{t+0.5*dt} += a_t * dt |
| 114 | Ut->addVector(1.0, *Utdot, deltaT); // u_{t+dt} = u_t + v_{t+0.5*dt} * dt |
| 115 | |
| 116 | if (Ut == 0) { |
| 117 | opserr << "ExplicitDifferenceStatic::newStep() - domainChange() failed or hasn't been called\n"; |
| 118 | return -2; |
| 119 | } |
| 120 | |
| 121 | // Zero acceleration for explicit method (Ma = RHS, no Ma on LHS) |
| 122 | (*Utdotdot) *= 0.0; |
| 123 | |
| 124 | // Set trial response quantities |
| 125 | theModel->setVel(*Utdot); |
| 126 | theModel->setAccel(*Utdotdot); |
| 127 | theModel->setDisp(*Ut); |
| 128 | |
| 129 | // Increment time and apply loads |
| 130 | double time = theModel->getCurrentDomainTime(); |
| 131 | time += deltaT; |
| 132 | if (theModel->updateDomain(time, deltaT) < 0) { |
| 133 | opserr << "ExplicitDifferenceStatic::newStep() - failed to update the domain\n"; |
| 134 | return -3; |
| 135 | } |
| 136 | |
| 137 | // Set response at t to be that at t+deltaT of previous step |
| 138 | (*Utdotdot) = (*Utdotdot1); |
| 139 | |
| 140 | return 0; |
| 141 | } |
| 142 | |
| 143 | // Form element tangent matrix (mass matrix for explicit scheme) |
| 144 | int ExplicitDifferenceStatic::formEleTangent(FE_Element *theEle) |
nothing calls this directly
no test coverage detected