Skip to content

๐Ÿ’พ Assemble โ€‹

Assemble is the hinge of the whole workflow. It takes the loose pieces โ€” elements, supports, load patterns, constraints โ€” works out which of them share nodes, numbers everything, and produces the single AlpacaModel object that every downstream component reads.

Nothing before Assemble knows about anything else. A beam does not know which other beam it meets; a point load does not know which node it lands on. All of that is resolved here, and resolved geometrically.

๐Ÿ”ง Grasshopper component โ€‹

AssembleModelAlpaca4d โ–ธ 06_Assemble
Assemble Model component
Inputs
ElementsElementlistEvery element in the model: beams, shells, bricks, tetrahedra, spring links.
SupportsSupportlistEvery Support.
LoadPatternsLoadPattern / Loadlist(empty)Load patterns and mass points; the two may be mixed freely on this input.
Anything else is an error.
ConstraintsConstraintlist(empty)Rigid diaphragms, rigid links and Equal DOFs.
RecordersRecorderlist(empty)From the MPCO Recorder: which results Run Analysis writes.
Left empty, Run Analysis picks a set to suit the analysis type.
ToleranceNumber0.01Distance below which two positions are treated as the same node, in m.
Outputs
AlpacaModelModelThe assembled model โ€” feed it to Model View, Run Analysis or Natural Vibration.
MassNumberTotal mass of the structure, in kg.
Element mass is area ร— ฯ ร— length and so on; a Mass Point contributes only the Z component of its TransMass.

๐Ÿ“ˆ When to use it โ€‹

Use it when you have finished building elements, supports and loads. Every model passes through Assemble exactly once; there is no other route to an AlpacaModel.

Do not use it when the model already exists as an OpenSees deck โ†’ Deserialise assembles one directly from a .tcl file.

๐Ÿ’ก Tolerance is the setting that matters โ€‹

Every element endpoint, shell vertex and solid corner is collected, and any two within Tolerance of each other become one node. Two members are connected when, and only when, their geometry meets within that distance.

The same search attaches point loads, mass points, supports and the nodes named by a constraint.

SymptomLikely cause
A member carries no load, or the structure is a mechanismTolerance too small โ€” the members never met, and the model has more nodes than you think.
Assembly throws "โ€ฆ is not part of the model"A load or support has no node within tolerance.
Distinct nodes have silently merged; a short member has vanishedTolerance too large.

Check the node count in Model View with Node IDs turned on before trusting any result.

๐Ÿ’ก Two supports on one node โ€‹

Two supports can land on the same node: the same point given twice, or two points within Tolerance of each other. Assemble makes them one support that holds every direction any of them holds. OpenSees would do the same, after a warning in the log for each direction fixed a second time. With one support, the node also gets one row in Reaction Forces, not one per support, so the rows add up to the load.

Assemble shows a remark when it does this. If the supports held different directions, the remark also says which directions the node is held in. Stacking supports on purpose, such as one for Tx and another for Tz, gives the same result as a single support holding both.

Skewed supports and spring supports are never merged. Each one acts on its own, and side by side they share the load.

๐Ÿ’ก Degrees of freedom โ€‹

A node gets 6 DOF if any beam or shell touches it, and 3 DOF if only solids do. This is why:

  • A brick sharing a node with a beam transfers force but no moment.
  • Moments on a point load and the rotational terms of a mass point are dropped at a 3 DOF node.

๐Ÿ’ก What happens next โ€‹

Assemble โ”€โ”€โ–บ Model View            (check it)
         โ”œโ”€โ”€โ–บ Run Analysis          (static or transient)
         โ”œโ”€โ”€โ–บ Natural Vibration     (modes and periods)
         โ””โ”€โ”€โ–บ Serialize             (write the .tcl and read it yourself)

The model that comes back out of an analysis component is the same model with results attached โ€” which is why the Results components take an AlpacaModel rather than a separate result object.