Add a plate or slab
add_plate_surfaceAdd a meshed plate/shell surface (slab, wall, deck, panel) to a FERS model. You give the corner points; the tool creates the boundary nodes, optionally the full edge-node grid with a support, and appends the PlateSurface to model.plate_surfaces. The SOLVER meshes it at solve time — never author plate_elements for a surface yourself. Load it with add_load kind:"plate_pressure" (surface_id), not with distributed_loads.
MESHING DECIDES WHETHER YOUR MODEL IS CORRECT. The mesher only ever creates NODES and PLATE ELEMENTS: it never splits members and never adds supports, so a plate connects to the rest of the structure ONLY through nodes it shares by exact coordinate. (1) Leave the mesh unset and the surface becomes TWO TRIANGLES spanning the corners — it still solves and reactions still equal q x A, so nothing looks wrong; this tool rejects that instead. (2) A supported or member-connected EDGE only exists where a node sits at an exact mesh-grid coordinate: structured meshing has predictable positions so edge_support can pre-create them, unstructured/Delaunay does not, so edge_support with unstructured meshing is rejected. (3) If a beam runs along a plate edge, split that beam into segments ending on the grid, or the plate hangs off its two end nodes only (measured 4.2x too flexible, beam moment 2.5x too low) with no warning.
THEORY — THE ENGINE DEFAULT IS WRONG FOR THIN PLATES. PlateTheory "Auto" is resolved unconditionally to Mindlin (the OpenAPI text claiming otherwise is stale). Mindlin (DSG3) shear-locks: on a simply-supported square slab at span/thickness 80 the centre-deflection error was -86.1% / -55.2% / -8.1% / -0.4% at 4x4 / 8x8 / 16x16 / 32x32, where Kirchhoff (DKT, rewritten and patch-test-exact in 0.2.44) gave -5.5% / -1.4% / -0.3% / -0.03%. So: span/thickness >= 20 -> "kirchhoff"; span/thickness < 10 -> "mindlin" plus a fine mesh (it correctly adds the ~10% shear deflection Kirchhoff misses). theory:"auto" (the default) makes that choice from the SMALLER IN-PLANE DIMENSION of your boundary (not its shortest edge, which collapses the moment an edge carries intermediate nodes) and tells you which it picked and why.
BOUNDARY POINTS: give the ring OPEN. A closing point that repeats the first is dropped for you (and said so in the notes); any other repeated point is refused, because coincident points collapse onto one node and leave boundary_node_ids with a duplicate id — measured, that solves with no error, balances the load to exactly q x A, and is 513% wrong on deflection.
ALSO TRUE OF EVERY PLATE: plates carry NO self-weight (enable_self_weight loops over members only) — add density x thickness x g as a pressure. Plates contribute NO geometric stiffness, so alpha_cr from a model where plate stability governs is unconservative. behavior "membrane" does not remove bending stiffness, it scales it by 1e-6, so an out-of-plane load on a membrane plate returns absurd deflections rather than an error. Boundary point ORDER sets the element normal and therefore the sign of mx/my/mxy. Keep total model nodes under ~2000: the engine allocates a dense (7 x nodes)^2 block and aborts above that with a raw wasm trap, so both meshers are rejected here once the projected node count crosses it (Delaunay produces ~1.7 nodes per target_size^2 of area, measured, so target_size 0.1 on a 4 m x 4 m slab is already fatal).
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Label for the surface. | |
| model | No | Stringified FERS model JSON | |
| offset | No | Offset of the plate mid-surface, metres. | |
| theory | No | auto (default: picks from span/thickness) | kirchhoff (best for thin plates) | mindlin (shear-flexible but coarse-mesh stiff) | engine_auto. | |
| behavior | No | shell (default) | membrane. | |
| model_ref | No | Handle from stash_model, used INSTEAD of `model`. Avoids sending the whole document on every step; the tool returns the same handle back. | |
| thickness | No | Plate thickness in metres. Required, > 0. | |
| surface_id | No | Overwrite this surface id instead of allocating a new one. | |
| divisions_u | No | Structured mesh divisions along the first edge. Use >= 8 for Kirchhoff, >= 16-32 for Mindlin. | |
| divisions_v | No | Divisions along the other edge. Omit one and it is inferred from the edge-length ratio. | |
| material_id | No | Existing model.materials id. Defaults to the first material. | |
| mesh_method | No | auto | structured | unstructured (Delaunay — required for openings). | |
| plane_state | No | plane_stress (default) | plane_strain. | |
| target_size | No | Element edge length for the unstructured mesher, in metres. | |
| edge_support | No | none (default) | pinned | fixed — supports the generated perimeter nodes. | |
| corner_points | No | JSON array of [x,y,z] corner points forming an OPEN planar ring (do not repeat the first point). At least 3; exactly 4 for the structured mesher. Give this OR boundary_node_ids. | |
| element_shape | No | auto | triangle | quad. | |
| classification | No | Free-text group name. | |
| edge_support_id | No | Reuse an existing nodal_supports id for the edge. | |
| boundary_node_ids | No | JSON array of EXISTING node ids to hang the plate off, e.g. [1,3,8,6]. | |
| local_x_direction | No | [x,y,z] setting the plate's local axes, which fix the sign and meaning of mx/my/mxy. Defaults to the first edge. | |
| stiffness_modifier_shear | No | Multiplier on shear stiffness. | |
| stiffness_modifier_bending | No | Multiplier on bending stiffness (0.5 doubles deflection). | |
| stiffness_modifier_membrane | No | Multiplier on membrane stiffness. |