const Vector & LoadPattern::getExternalForceSensitivity(int gradNumber) { // THIS METHOD IS CURRENTLY ONLY USED FOR THE STATIC CASE // IT SHOULD BE DELETED AND REPLACED BY THE DYNAMIC CASE // Initial declarations Vector tempRandomLoads(1); int sizeRandomLoads; // Start with a fresh return vector if (randomLoads == 0) { randomLoads = new Vector(1); } else { delete randomLoads; randomLoads = new Vector(1); } // Prepare the vector identifying which loads are random. NodalLoad *theNodalLoad = 0; NodalLoadIter &theNodalIter = this->getNodalLoads(); int i; // Loop through the nodal loads to pick up possible contributions int nodeNumber; int dofNumber; while ((theNodalLoad = theNodalIter()) != 0) { const Vector &gradientVector = theNodalLoad->getExternalForceSensitivity(gradNumber); if (gradientVector(0) != 0.0 ) { // Found a random load! Get nodeNumber and dofNumber nodeNumber = theNodalLoad->getNodeTag(); dofNumber = (int)gradientVector(0); // Update the randomLoads vector sizeRandomLoads = randomLoads->Size(); if (sizeRandomLoads == 1) { delete randomLoads; randomLoads = new Vector(2); (*randomLoads)(0) = (double)nodeNumber; (*randomLoads)(1) = (double)dofNumber; } else { tempRandomLoads = (*randomLoads); delete randomLoads; randomLoads = new Vector(sizeRandomLoads+2); for (i=0; i<sizeRandomLoads; i++) { (*randomLoads)(i) = tempRandomLoads(i); } (*randomLoads)(sizeRandomLoads) = nodeNumber; (*randomLoads)(sizeRandomLoads+1) = dofNumber; } } } return (*randomLoads); }