3.6.9: BESO for Beams
Evolutionary structural optimization (ESO) constitutes a method of topology optimization which was pioneered by Y.M. Xie and G.P. Steven. The underlying principle is simple: One starts from a given volume made up from structural elements on predefined supports and with preset loads acting on it. Calculating the structural response will show that there are regions which carry more of the external load than others. Now one removes a number of those elements of the structure that are least strained and thus least effective. Again the response of the now thinned out model is determined, under-utilized elements removed and so on. This iterative procedure stops when a target volume or number of remaining structural elements is reached.
Fig. 3.6.9.1: Cantilever with initially regular mesh after application of the “BESO for Beams”-component
The above algorithm can be viewed as a way of tracing the internal force flow through a structure and removing those elements that do not form part of it. Fig. 3.6.9.1 shows a cantilever after applying the “BESO for Beams”-component on it. The algorithm works on beam and truss elements only. For shells a separate component exists (see section 3.5.10).
Fig. 3.6.9.2: Triangular mesh of beams before (a) and after (b) applying the “BESO for Beams”-component
Fig. 3.6.9.2 shows the “BESO for Beams”-component at work. On the left side one can see the initial geometry which is a triangular mesh derived from a surface. There exist two load cases with loads acting in the plane of the structure in horizontal and vertical direction respectively. Three corner nodes of the structure are held fixed. The right picture shows the optimized structure reduced to 45 % of its initial mass in the course of 20 design iterations.

Here the description of the input parameters:

"Model"
Receives the model to be processed.
"ElemIds"
There are two alternatives concerning this input parameter:
  • No input: The whole of the structure will be included in the optimization procedure.
  • The input consists of a list of strings: All elements whose identifiers match take part.
"LCases"
List of load cases to be considered. Zero is the index of the first load case. Considering the total effect of several load cases amounts to adding up their individual influences on an element.
"TargetRatio"
Ratio of the target mass of beam- or truss elements to the initial mass of beams/trusses in a structure. When determining the initial mass all beam- or truss- elements of the structure – irrespective of state of activation – count. In the target structure only active elements contribute to its mass. This enables one to apply BESO-components in series. Depending on the activation status of the model elements, applying “BESO for Beams” will lead to an increase or decrease in the number of active elements. The activation status of individual elements can be set by means of the “ModifyBeam”- and “ActivateModel”-components.
"MaxChangeIter"
Number of iterations within which the target mass of the structure should be reached. If the number of iterations is selected too low then it may occur that single beams get disconnected from the main structure and they seem to fly. The reason for this lies in the fact that Karamba3D applies a so called soft-kill approach for thinning out the structure: Elements are not removed but simply given small stiffness values. This ensures that structural response can be calculated under all circumstances.
"MaxConvIter"
Maximum number of additional iterations for convergence after the structures mass has reached its target value using “MaxChangeIter” iterations.
"GroupIds"
Expects a list of strings. Elements that match a given list entry take part in the optimization and belong to one group. They get collectively activated or deactivated during force path finding. A structure may consist of active and non-active elements. The initial state of a group is determined by the state of the majority of its elements. Groups need not be disjoint.

By clicking on the “Settings” bar you can unfold the following input-plugs:

Factors for weighting forces/moments: The “BESO for Beams”-component lets you select weighting factors for the different force and bending components in an element. The weight of an element is determined on the basis of the density of deformation energy induced by individual cross section force components. Multiplication by the corresponding user given weighting factor and adding up the component contributions results in the element weight. The weight of groups results from the average of their members. These are the available weighting factors:
  • “WTension”: factor for axial tension force
  • “WCompr.”: factor for axial compression force
  • “WShear”: factor for resultant shear force
  • “WMoment”: factor for resultant moments
"BESOFac": Say in each iteration step there needs to be a mass of
n[kg]n[kg]
removed in order to meet the structure's target mass in the given
nChangeIternChangeIter
number of iterations. With
BESOFac=mBESOFac = m
there will be
(m+1)n(m+1) \cdot n
active elements moved to the pool of inactive elements. An evaluation of the structure's response follows. In a second step
mnm \cdot n
members get flipped from inactive to active so that the balance is right again. This adds a bi-directional component to the process which often leads to improved results.
“MinDist”: In some cases one wishes to limit the number of elements that get added or removed in a certain area. “MinDist” lets you select the minimum distance in meter between the endpoints of elements that may be changed in one iteration.
“WLimit”: At the end of the BESO-process it often occurs that a small fraction of the elements is much less utilized than the average. “WLimit” lets you remove those elements whose weight is below “WLimit” times the average weight of elements.

On the right side of the “BESOBeam”-component these output-plugs exist:

"Max.disp"
Maximum displacement of the resulting model from among all load cases.
"Model"
Structure with element activation according to the force path found.
"Hist"
A data tree which contains for each iteration step a list of boolean values that signify whether an element is active (true) or inactive (false). The boolean values map directly on the model elements. Using a “Tree Branch”-component with a slider connected to a “Activate Model”-component (see section 3.1.5) lets you inspect the history of the BESO-process (see fig. 3.6.9.2).
"Is active"
Renders a list of “True”/“False” values – one for each element. “True” signals that the corresponding element is part of the final structure (i.e. active). Otherwise it contains a “False” entry.
"Weights"
List of element or group weights in ascending order in the final structure. This can be used as a qualitative check of the result: The more evenly distributed the weights, the better utilized the structure. There will always be force concentrations around supports and external loads which show up as sharp peaks. A good way of visualization is to use a “Quick Graph”-component (see fig. 3.6.9.2).
BESO_Beams_Grid.gh
30KB
Binary
BESO_Beams_Grid_With_History.gh
31KB
Binary
BESO_Beams_Grid_With_History.gh
31KB
Binary
BESO_Beams_Proof_Of_Principle.gh
25KB
Binary
BESO_Beams_Proof_Of_Principle_With_Shell.gh
29KB
Binary
BESO_Beams_Solution_History.gh
26KB
Binary
Last modified 26d ago