Beispiel #1
0
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);
}
Beispiel #2
0
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;
}