Processing the sensitivity

The sensitivity is calculated in routines results_se.c, mafillsmmain_se.c and objectivemain_se.c.

In routine results_se.c $ \frac{\partial F_{\text{int}}}{\partial s}$ is determined. For geometrically nonlinear calculations (parameter NLGEOM on the *STEP card) the unperturbed displacements leading to the internal force correspond to the displacements at the end of the previous static step, if any, augmented by the actual prescribed displacements. For linear geometric calculations the unperturbed displacements correspond to zero augmented by the actual prescribed displacements. Indeed, nonzero prescribed displacements lead to internal forces in linear calculations. Therefore, the term $ \frac{\partial
F}{\partial s}$ in Equation (571) can be replaced by $ \frac{\partial F_{\text{ext}}}{\partial s}-\frac{\partial F_{\text{int}}}{\partial
s}$ for linear calculations, noting that only nonzero initial displacement boundary conditions lead to internal forces (and not any previous displacements). The second reason why results_se.c has to be called for linear calculations too is that the material tangent $ \frac{\partial
S}{\partial E}$ at each integration point, which is needed in mafillsmmain_se.c for the set up of the stiffness matrix, is also determined in results_se.c.

Routine mafillsmmain_se.c calculates the derivative of the external forces and of the stiffness matrix (and similar matrices):

Out of computational efficiency the latter terms are calculated at the element level and assembled into a global matrix thereupon.

The last major routine, objectivemain_se.c assembles the previous information to obtain the final sensitivity. For the orientation as design variable these sensitivities are immediately stored in the .dat or the .frd file. The sensitivity for the geometry (normal directions of nodes on the external surface) as design variable, however, is kept for further postprocessing in sens_coor.c.

For the objective $ G$ the total sensitivity $ \frac{d G(s,U(s))}{d s}$ is written as $ \frac{\partial
G}{\partial s} + \frac{\partial G}{\partial U} \cdot \frac{\partial
U}{\partial s}$. So the objective function is used in the terms $ \frac{\partial G}{\partial s}$ and $ \frac{\partial G}{\partial U}$. The routine objectivemain_se.c is split according to the objective function: