| 87 | |
| 88 | |
| 89 | int TRBDF3::newStep(double deltaT) |
| 90 | { |
| 91 | // check the vectors have been created |
| 92 | if (U == 0) { |
| 93 | opserr << "TRBDF3::newStep() - domainChange() failed or hasn't been called\n"; |
| 94 | return -3; |
| 95 | } |
| 96 | |
| 97 | // mark step as Trapezoidal (=0), Backward Euler (=1), or Houbolt (=2) |
| 98 | if (deltaT != dt || step == 2) { |
| 99 | step = 0; |
| 100 | } else if (step == 0) { |
| 101 | step = 1; |
| 102 | } else { |
| 103 | step = 2; |
| 104 | } |
| 105 | |
| 106 | // get a pointer to the AnalysisModel |
| 107 | AnalysisModel *theModel = this->getAnalysisModel(); |
| 108 | |
| 109 | // set response at t to be that at t+deltaT of previous step |
| 110 | dt = deltaT; |
| 111 | |
| 112 | (*Utm2) = *Utm1; |
| 113 | (*Utm2dot) = *Utm1dot; |
| 114 | |
| 115 | (*Utm1) = *Ut; |
| 116 | (*Utm1dot) = *Utdot; |
| 117 | |
| 118 | (*Ut) = *U; |
| 119 | (*Utdot) = *Udot; |
| 120 | (*Utdotdot) = *Udotdot; |
| 121 | |
| 122 | // set the constants |
| 123 | if (step == 0) { // trapezoidal |
| 124 | c1 = 1.0; |
| 125 | c2 = 2.0/deltaT; |
| 126 | c3 = 4.0/(deltaT*deltaT); |
| 127 | |
| 128 | (*Udot) *= -1.0; |
| 129 | |
| 130 | double a3 = -4.0/deltaT; |
| 131 | double a4 = -1; |
| 132 | Udotdot->addVector(a4, *Utdot, a3); |
| 133 | |
| 134 | } else if (step == 1) { // backward euler |
| 135 | c1 = 1.0; |
| 136 | c2 = 1.5/deltaT; |
| 137 | c3 = 2.25/(deltaT*deltaT); |
| 138 | |
| 139 | (*Udot) = *Utm1; |
| 140 | Udot->addVector(0.5/deltaT, *Ut, -1/(2.0*deltaT)); |
| 141 | |
| 142 | (*Udotdot) = *Utm1dot; |
| 143 | Udotdot->addVector(0.5/deltaT, *Utdot, -4.0/(2.0*deltaT)); |
| 144 | Udotdot->addVector(1.0, *Udot, 3.0/(2.0*deltaT)); |
| 145 | |
| 146 | } else { // Houbolt |
nothing calls this directly
no test coverage detected