Exemplo n.º 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);
}