Structural concentrated point load and associated example updates.
This PR formally adds the feature for applying concentrated point loads to structural systems. This load application is similar in principle to Nastran/ASTROS FORCE cards and Abaqus *CLOAD keyword entry.
@manavbhatia In this PR we have basically created a generalized version of the PointLoad class you were defining in structural example 2 into src/boundary_condition/point_load_condition.h/cpp. I already switched the pressure load in structural example 1 that was applied at the end of the axial bar over to using this.
What do you think about swapping the point load application in structural example 2 to this? I am thinking about a more generalized "user guide" type explanation of how boundary conditions are basically functions when I update that documentation. I could include something like what is currently in structural example 2 in there for more advanced usage and communicate how you can define new boundary types.
The demonstration for 1D elem seems sensible and similar to example 2. However, both of these require definition of one such loads, so the overhead of defining the loads this way is small.
What would be the right way to approach to scale this up for large general structures? Would there be a point load BC object created for each nodal load? This would require some storage cost (perhaps not too large). They could all be tied into a single parameter for sensitivity analysis, which can be helpful.
Or would we have a single point load BC object with an internal tabulated data that computes the nodal load based on the (x,y,z) location of the node?
I think @JohnDN90 was also doing something about nodal loads in adjoint sensitivity analysis. How does this fit into that?
What would be the right way to approach to scale this up for large general structures? Would there be a point load BC object created for each nodal load? This would require some storage cost (perhaps not too large). They could all be tied into a single parameter for sensitivity analysis, which can be helpful.
Or would we have a single point load BC object with an internal tabulated data that computes the nodal load based on the
(x,y,z)location of the node?I think @JohnDN90 was also doing something about nodal loads in adjoint sensitivity analysis. How does this fit into that?
I was thinking about the more general case as well last night and how it would work in SA. I think currently my understanding about what exactly is happening under the hood is too limited to know without creating a more complex demo/test case and digging in. I know John did some sort of example using multiple PointLoadConditions and PointLoads, but its probably still on a smaller scale.
I think more general cases would kind of fall into two groups:
- limited number (on the order of a dozen) of independent concentrated loads applied to different parts of a structure (i.e. multiple FORCE cards with same load set SID in Nastran)
- representation of a load distribution (like from an external aerodynamic distribution) using a large number of concentrated forces (in not necessarily a tightly coupled sense, I don't know the right way to handle that yet) that are in essence related to one another.
I think @JohnDN90 was also doing something about nodal loads in adjoint sensitivity analysis. How does this fit into that?
I think you might be referring to when I was messing around with SA of compliance and I realized that point loads weren't being included in the calculation of compliance or its sensitivity. If so, that was just a matter of modifying the output and I think the assembly class to include the point loads and didn't actually do anything with the point loads themselves.
What would be the right way to approach to scale this up for large general structures? Would there be a point load BC object created for each nodal load?
Right now, you create a MAST::PointLoad for each magnitude / direction pair defining a load. You create a MAST::PointLoadCondition to add that MAST::PointLoad to, then you add all nodes the load acts on to the MAST::PointLoadCondition.
MAST::PointLoad accepts a MAST::Parmeter which is the load magnitude and a vector which describes the direction of the load. If you wanted the magnitude to be variable in space, then maybe we could change it so that MAST::PointLoad accepts a MAST::FieldFunction instead of a MAST::Parameter. We could maybe do something similar if you wanted a variable direction as well.