| 240 | } |
| 241 | |
| 242 | int |
| 243 | LoadControl::formSensitivityRHS(int passedGradNumber) |
| 244 | { |
| 245 | sensitivityFlag = 1; |
| 246 | |
| 247 | // Set a couple of data members |
| 248 | gradNumber = passedGradNumber; |
| 249 | |
| 250 | // get model |
| 251 | AnalysisModel* theAnalysisModel = this->getAnalysisModel(); |
| 252 | LinearSOE* theSOE = this->getLinearSOE(); |
| 253 | |
| 254 | // Loop through elements |
| 255 | FE_Element *elePtr; |
| 256 | FE_EleIter &theEles = theAnalysisModel->getFEs(); |
| 257 | while((elePtr = theEles()) != 0) { |
| 258 | theSOE->addB( elePtr->getResidual(this), elePtr->getID() ); |
| 259 | } |
| 260 | |
| 261 | // Loop through the loadPatterns and add the dPext/dh contributions |
| 262 | static Vector oneDimVectorWithOne(1); |
| 263 | oneDimVectorWithOne(0) = 1.0; |
| 264 | static ID oneDimID(1); |
| 265 | |
| 266 | Node *aNode; |
| 267 | DOF_Group *aDofGroup; |
| 268 | int nodeNumber, dofNumber, relevantID, i, sizeRandomLoads, numRandomLoads; |
| 269 | LoadPattern *loadPatternPtr; |
| 270 | |
| 271 | Domain *theDomain = theAnalysisModel->getDomainPtr(); |
| 272 | LoadPatternIter &thePatterns = theDomain->getLoadPatterns(); |
| 273 | while((loadPatternPtr = thePatterns()) != 0) { |
| 274 | const Vector &randomLoads = loadPatternPtr->getExternalForceSensitivity(gradNumber); |
| 275 | sizeRandomLoads = randomLoads.Size(); |
| 276 | if (sizeRandomLoads == 1) { |
| 277 | // No random loads in this load pattern |
| 278 | } |
| 279 | else { |
| 280 | // Random loads: add contributions to the 'B' vector |
| 281 | numRandomLoads = (int)(sizeRandomLoads/2); |
| 282 | for (i=0; i<numRandomLoads*2; i=i+2) { |
| 283 | nodeNumber = (int)randomLoads(i); |
| 284 | dofNumber = (int)randomLoads(i+1); |
| 285 | aNode = theDomain->getNode(nodeNumber); |
| 286 | aDofGroup = aNode->getDOF_GroupPtr(); |
| 287 | const ID &anID = aDofGroup->getID(); |
| 288 | relevantID = anID(dofNumber-1); |
| 289 | oneDimID(0) = relevantID; |
| 290 | theSOE->addB(oneDimVectorWithOne, oneDimID); |
| 291 | } |
| 292 | } |
| 293 | } |
| 294 | |
| 295 | // reset sensitivity flag |
| 296 | sensitivityFlag = 0; |
| 297 | |
| 298 | return 0; |
| 299 | } |
no test coverage detected