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); }
const Vector & NodalLoad::getExternalForceSensitivity(int gradNumber) { gradientVector(0) = (double)parameterID; return gradientVector; }
NOX::Abstract::Group::ReturnType NOX::LAPACK::Group::computeGradient() { if (isValidGradient) return NOX::Abstract::Group::Ok; if (!isF()) { std::cerr << "ERROR: NOX::LAPACK::Group::computeGrad() - F is out of date wrt X!" << std::endl; return NOX::Abstract::Group::BadDependency; } if (!isJacobian()) { std::cerr << "ERROR: NOX::LAPACK::Group::computeGrad() - Jacobian is out of date wrt X!" << std::endl; return NOX::Abstract::Group::BadDependency; } // Compute Gradient = J' * F jacSolver.apply(true, 1, &fVector(0), &gradientVector(0)); // Reset isValidGradient isValidGradient = true; // Return result return NOX::Abstract::Group::Ok; }