Version 1.0

SE-TEDS is the canonical format for representing structural engineering project data in a way that is complete (no information loss), compact (60–82% fewer tokens than standard formats), human-readable (engineers can validate it without tooling), and LLM-parseable (no special pre-processing required).

Always read this skill fully before generating, modifying, or interpreting any structural model data. Every block, field, and convention defined here is mandatory unless marked as optional.

Core Principles — Apply All Six Together

1. Symbolic Identifiers — Every entity uses a short alphanumeric ID. Never repeat descriptive labels at reference sites. One label per entity, declared once.

  • Nodes: N1, N2, … Materials: M1, M2, … Sections: S1, S2, …
  • Elements: E1, E2, … Load cases: LC1, LC2, … Combinations: CB1, CB2, …
  • Groups: GN_ prefix for node groups, GE_ prefix for element groups

2. Comma-Separated Values (CSV) — All tabular data uses | as column separator. One header row per block (prefix #). No JSON objects, no repeated keys.

3. Inline Units Declaration — Declare units once in [HEADER]. Never repeat units on individual values. Local exceptions use parenthetical suffix: 9.81(m/s2).

4. Hierarchical Block Structure — Named blocks in fixed order: [HEADER][DEFAULTS][NODES][GROUPS][MATERIALS][SECTIONS][ELEMENTS][JOINTS][DIAPHRAGMS][LOAD_CASES][COMBINATIONS][LOADS][RESULTS]

5. Sparse Encoding of Defaults — Only write fields that differ from the declared default. Empty comma-separated cells and omitted optional fields inherit the default.

6. Normalised Float Precision — Round all floats to 4 significant figures unless higher precision is explicitly required (e.g., seismic mass). Never write full double-precision output like 4.500000000000000e+00; write 4.500.

File Header

Every SE-TEDS file begins with [HEADER]. All fields are mandatory unless marked (optional).

[HEADER]
schema_version:1.0
project:<project_name_no_spaces>
revision:Rev-01
date:YYYY-MM-D
author:<name>                            # (optional)
units:<force>,<length>,<temperature>
  # Supported force:  kN,N,tf,kip,lb
  # Supported length: m,cm,,mm, ft,in
  # Supported temp:   C,F,K
axes:X=<dir>;Y=<dir>;Z=<dir>
gravity:<scalar>
num_dof:6

Example:

[HEADER]
schema_version:1.0
project:Tower_A_RC_Frame
revision:Rev-03
date:2025-04-10
units:kN,m,C
axes:X=East;Y=North;Z=Up
gravity:9.81
num_dof:6

Defaults Block

Declare all model-wide defaults here. Downstream blocks omit any field whose value matches the declared default.

[DEFAULTS]
element_releases:fixed-fixed
element_angle:0.0
mass_source:load_cases LC1(1.0) LC2(0.30)
design_code:<code_identifier>
mesh_size:auto
diaphragm:none
self_weight:included  
self_weight_mult=1.0

Nodes Block

Standard Format

[NODES]
ID,X,Y,Z,m_x,m_y,m_z
N1,0,0,0,0,0
N2,5,0.1,0,0,0.2
N8,0,0,7.2,12.5,12.5
  • m_x/y/z: lumped nodal mass in force/g units.
  • Use ## for inline comments on the same row, # alone for full-line comments.

Cylindrical Coordinates (optional suffix)

ID,R,Theta,Z
N201(cyl),8,0.2,0
N202(cyl),8,30.5,0
  • R: Radious
  • Theta: Angle
  • Z: Elevation

Grid Generation Block (use for regular column grids)

Declare a grid instead of listing every node when the geometry is regular. The parser expands it into the full node table automatically.

[GRID]
X_spaces:0,5.0,10.0,15.0
Y_spaces:0,6.0,12.0
Z_spaces:0,3.5,7.0,10.5,14.0,17.5
ID_prefix:N
ID_start:1
# Generates N1 through N72 automatically
  • N: Node (e.g.: N5 is Node 5)

Groups Block

Define named subsets of nodes and elements for use in load assignments and results.

[GROUPS]
#name:members
GN_BASE:N1-N20
GN_FLOOR1:N21-N60
GN_ROOF:N101-N120
GN_CORES:N5,N10,N15,N20
GE_COLS_L1:E1-E20
GE_BEAMS_L1:E21-E60
GE_SLABS_L1:E200-E280
GE_COLS_ALL:GE_COLS_L1,GE_COLS_L2,GE_COLS_L3
GE_RC_COLS:sec=S40-S43
GE_STEEL:sec=S1-S7

Range syntax: N1-N20 (inclusive). Space-separated lists for non-contiguous IDs.

  • sec= filter selects all elements assigned to a given section range, so for instance, S40-S43 are

Materials Block

Steel

[MATERIALS]
#ID,class,name,E,nu,G,rho,fy,fu,alpha
M1,STEEL,A992-Gr50,200000,0.30,76923,7.85,345,448,12e-6
M2,STEEL,A36,200000,0.30,76923,7.85,250,400,12e-6
# Units: E, G in MPa; rho in t/m3; fy, fu in MPa; alpha in 1/°C
# G is auto-computed as E/(2(1+nu)) if omitted

Concrete

#ID,class,name,fck,fctm,Ec,rho,nu,alpha,behavior
M4,CONCRETE,C25/30,25,2.56,31000,2.50,0.20,10e-6,LIN
M5,CONCRETE,C30/37,30,2.90,32837,2.50,0.20,10e-6,LIN
M6,CONCRETE,C40/50,40,3.51,35000,2.50,0.20,10e-6,MAN-P
# behavior tokens: LIN | MAN-P (Mander parabolic) | PK (Popovics-Kent)
# Ec auto-computed from fck per code formula if omitted

Nonlinear behavior sub-block — required immediately after any row with a non-LIN behavior token:

M6,CONCRETE,C40/50,40,3.51,35000,2.50,0.20,10e-6,MAN-P
  behavior.fco     = 40.0    # unconfined peak stress (MPa)
  behavior.eco     = 0.002   # strain at peak stress
  behavior.fcc     = 52.0    # confined peak stress (MPa)
  behavior.ecc     = 0.0035  # strain at confined peak
  behavior.ecu     = 0.012   # ultimate strain (confined)
  behavior.Esec    = auto    # secant modulus; auto = fcc/ecc
  behavior.tension = NO      # ignore tensile strength

Rebar

#ID,class,name,E,fy,fu,eps_sh,eps_u,rho
M10,REBAR,GR60,200000,420,620,0.008,0.090,7.85
M11,REBAR,GR40,200000,280,420,0.010,0.120,7.85
# eps_sh: strain hardening onset strain; eps_u: rupture strain

Timber (Orthotropic)

#ID,class,name,EL,ER,ET,GLR,GLT,GRT,rho
M15,TIMBER,Glulam24,12500,500,350,780,650,65,0.50
# L=grain axis, R=radial, T=tangential; axis mapping set in section definition

Material class tokens: STEEL | CONCRETE | REBAR | TIMBER | GENERIC

Sections Block

Steel — Catalogue (preferred for standard profiles)

[SECTIONS]
#ID,type,mat,designation,angle
S1,CATALOGUE,M1,W18X97,0
S2,CATALOGUE,M1,W21X101,0
S3,CATALOGUE,M3,HSS8X8X0.5,0
S4,CATALOGUE,M1,L6X6X0.5,45
# Designation resolved against built-in database: AISC,BS EN,DIN,JIS
# angle: local section rotation in degrees about longitudinal axis

Steel — Parametric Built-Up

# I-section:  I  h bf tf tw
S10,I,M1,I  h=600  bf=250  tf=20  tw=12
# Box:         BOX h b tf tw
S11,BOX,M3,BOX h=400 b=300 tf=16 tw=12
# Pipe (CHS):  PIPE OD t
S12,PIPE,M3,PIPE OD=219.1 t=8.0
# Cover-plated W-section
S13,COMPOUND,M1,W24X76 +CP b=250 t=20 at=TOPBOT
# Supported shapes: I | C | T | BOX | PIPE | PLATE | COMPOUND

Steel — Explicit Properties

#ID,type,mat,A,Iz,Iy,J,Wz,Wy,Av_z
S20,EXPLICIT,M1,148,1.42e5,4820,72,4720,770,58

Steel — Tapered / Stepped Members

# Linear taper
S30,TAPER,M1,I_end=S10  J_end=S11  interp=linear
# Stepped (segment=section@rel_start-rel_end)
S31,STEPPED,M1,seg1=S1@0.0-0.4  seg2=S2@0.4-0.7  seg3=S1@0.7-1.0

Reinforced Concrete — Rectangular Column

#ID,type,conc,rebar,B,H,cover,reinf_notation
S40,RC_RECT,M5,M10,500,500,40,8T25+4T20
S41,RC_RECT,M5,M10,600,600,40,12T28
# Reinforcement notation: <qty>T<dia> for deformed bar, <qty>R<dia> for plain bar
# Multiple groups separated by +
# Total rho auto-computed by parser

Reinforced Concrete — Beam

#ID,type,conc,rebar,B,H,cover,top,bot,links
S50,RC_BEAM,M4,M10,300,600,35,3T20,4T25,T10@150
S51,RC_BEAM,M4,M10,300,700,35,2T20,5T25,T10@125

Reinforced Concrete — T-Beam

#ID,type,conc,rebar,bw,H,bf,hf,cover,top,bot,links
S55,RC_TBEAM,M5,M10,300,700,900,150,35,2T20,5T25,T10@150
# bw=web width, bf=effective flange width, hf=slab thickness

Reinforced Concrete — Circular Column

#ID,type,conc,rebar,D,cover,long_reinf,ties
S60,RC_CIRC,M5,M10,600,50,12T25,T10@100
S61,RC_CIRC,M6,M10,800,50,16T28,T12@100

Reinforced Concrete — Slab

#ID,type,conc,rebar,thick,cover,reinf_x,reinf_y
S70,RC_SLAB,M4,M10,200,25,T12@200,T12@200
S71,RC_SLAB,M4,M10,250,25,T16@150,T16@150

Reinforced Concrete — Flat Slab

#ID,type,conc,rebar,thick,cv,col_x,col_y,mid_x,mid_y
S75,RC_FLAT_SLB,M5,M10,280,30,T20@125,T20@125,T12@200,T12@200

Design Parameters (append as key=value tags to any RC section row)

S40,RC_RECT,M5,M10,500,500,40,8T25+4T20  fire=R120 exp=XC2 DCM=Y
# fire=<rating>  exp=<exposure_class>  DCM=Y/N (ductility class medium)

RC section type tokens: RC_RECT | RC_BEAM | RC_TBEAM | RC_CIRC | RC_SLAB | RC_FLAT_SLB

Elements Block

Frame Elements

[ELEMENTS]
#ID,class,iNode,jNode,sec,angle,rel_i,rel_j
E1,FRAME,N1,N6,S40,,
E3,FRAME,N6,N7,S50,,
E5,FRAME,N3,N8,S41,90,
E6,FRAME,N4,N9,S41,,Mz,Mz
  # E6: moment-pinned at both ends about local z
E7,FRAME,N5,N10,S42,,,My Mz
  # E7: moment-released at J-end about both local axes
  • angle: local section rotation in degrees about element local x-axis. Default = 0.
  • rel_i / rel_j: space-separated DOF labels to release. Tokens: Fx Fy Fz Mx My Mz. Empty = fully fixed (default).

Shell Elements

#ID,class,N1,N2,N3,N4,sec,type
E200,SHELL,N21,N22,N27,N26,S70,thin
E300,SHELL,N40,N41,N46,,S71,thin
  # E300 is triangular — N4 omitted
# type tokens: thin | thick (Mindlin)
#ID,class,iNode,jNode,type,properties
E500,LINK,N1,N1',SPRING,Kz=50000  Kx=5000  Ky=5000
E501,LINK,N2,N2',ISOLATOR,Kv=200000 Kh=2000  Qd=0.10W
E502,LINK,N10,N11,GAP,open_dist=5mm  Kc=1e8
E503,LINK,N20,N21,DAMPER,C=1500  exp=0.50
# N1' notation indicates master-slave offset node
# type tokens: SPRING | ISOLATOR | GAP | DAMPER

Rigid End Offsets (optional block)

[OFFSETS]
#elem,i_dx,i_dy,i_dz,j_dx,j_dy,j_dz
E1,0,0,0.25,0,0,0.25
E3,0.30,0,0,0.30,0,0

Joints Block

Supports

[JOINTS]
#node,type,Ux,Uy,Uz,Rx,Ry,Rz,angle
N1,SUPPORT,1,1,1,1,1,1
  # 1 = restrained, 0 = free, numeric = spring stiffness
N3,SUPPORT,1,1,1,0,0,0
  # Pinned support — all translations fixed, rotations free
N4,SUPPORT,1,0,1,0,0,0
  # Roller in Y direction
N5,SUPPORT,5e4,5e4,1e5,0,0,0
  # Spring support — translational springs (kN/m), rotations free

# Shortcut keywords (expands to the patterns above):
GN_BASE,FIXED,,,,,,
N50,PINNED,,,,,,
N51,ROLLER_X,,,,,,
# Supported shortcuts: FIXED | PINNED | ROLLER_X | ROLLER_Y | ROLLER_Z

Semi-Rigid Connections

#node,elem,type,Krx,Kry,Krz
N15,E12,SEMI_RIGID,,,25000
# Moment-rotation stiffness in kNm/rad; empty = fully fixed

Diaphragms

[DIAPHRAGMS]
#name,master,slaves,DOFs
DPH_L1,N100,GN_FLOOR1,Ux Uy Rz
DPH_L2,N101,GN_FLOOR2,Ux Uy Rz
DPH_ROOF,N102,GN_ROOF,Ux Uy Rz

Load Cases Block

[LOAD_CASES]
#ID,type,label,self_wt,multiplier
LC1,DEAD,Dead_Permanent,YES,1.0
LC2,DEAD,Dead_Superimposed,NO,1.0
LC3,LIVE,Live_Office,NO,1.0
LC4,LIVE,Live_Roof,NO,1.0
LC5,WIND,Wind_X+,NO,1.0
LC6,WIND,Wind_X-,NO,1.0
LC7,WIND,Wind_Y+,NO,1.0
LC8,WIND,Wind_Y-,NO,1.0
LC9,SEISMIC,Seismic_RSA_X,NO,1.0
LC10,SEISMIC,Seismic_RSA_Y,NO,1.0
LC11,THERMAL,Thermal_Summer,NO,1.0
LC12,NOTIONAL,Notional_X+,NO,1.0
# Type tokens: DEAD,LIVE,WIND,SEISMIC,THERMAL,NOTIONAL,MOVING

Seismic Sub-Block (required for SEISMIC type cases)

[SEISMIC]
LC9.spectrum  : code=ASCE7-22  Ss=1.20  S1=0.55  SiteClass=D
LC9.direction : X  ecc=0.05
LC9.modes     : 12  CQC  missing_mass=YES
LC9.scaling   : Vt_min=0.85*Vbase

LC10.spectrum : same_as=LC9
LC10.direction: Y  ecc=0.05
LC10.modes    : 12  CQC  missing_mass=YES

-–

Combinations Block

Explicit Table

Each column header corresponds to a load case ID. Factor - means the load case does not participate in that combination (sparse encoding).

[COMBINATIONS]
# type: U=ULS | S=SLS | A=ALS | F=FIRE
#ID,type,label,LC1,LC2,LC3,LC4,LC5,LC6,LC9
CB1,U,1.4DL,1.4,1.4,-,-,-,-,-
CB2,U,1.2DL+1.6LL,1.2,1.2,1.6,1.6,-,-,-
CB3,U,1.2DL+1.0LL+1.6W,1.2,1.2,1.0,-,1.6,-,-
CB4,U,1.2DL+1.0LL-1.6W,1.2,1.2,1.0,-,-,1.6,-
CB5,U,0.9DL+1.6W+,0.9,0.9,-,-,1.6,-,-
CB6,U,1.2DL+1.0LL+EQX,1.2,1.2,1.0,-,-,-,1.0
CB7,S,1.0DL+1.0LL,1.0,1.0,1.0,-,-,-,-
CB8,S,1.0DL+0.3LL+1.0W,1.0,1.0,0.3,-,1.0,-,-
CB9,A,1.0DL+0.5LL+1.0EQ,1.0,1.0,0.5,-,-,-,1.0

Auto-Generation (use for code-compliant models)

[COMBINATIONS]
auto_code : ASCE7-22  importance=II  seismic_sdc=D
# Parser generates all required LRFD combinations including seismic Section 12.4
# Supported codes: ASCE7-22 | EN1990 | NTC2018 | NBC2015 | AS/NZS1170

-–

Loads Block

Point Loads on Nodes

[LOADS]
#case,node,Fx,Fy,Fz,Mx,My,Mz
LC2,N8,-,-,-150,-,-,-
LC2,N12,-,-,-220,-,-,-
LC5,N25,85,-,-,-,-,-
# Negative Fz = downward (in -Z gravity convention)
# Dash = zero load on that DOF (sparse)

Distributed Loads on Frame Elements

#case,elem/group,type,csys,dir,w1,w2,d1,d2
LC2,E3,UNIFORM,GLOBAL,Z,-15.0,,
LC3,GE_BEAMS_L1,UNIFORM,GLOBAL,Z,-8.50,,
LC2,E4,TRAPEZOIDAL,GLOBAL,Z,-12.0,-5.0,
LC5,GE_COLS_ALL,UNIFORM,GLOBAL,X,2.40,,
LC3,E7,POINT_SPAN,LOCAL,Y,-45.0,,2.5
  # POINT_SPAN: concentrated load at distance d1 from I-end
LC11,GE_STEEL,THERMAL,-,-,dT=35,,
  # THERMAL: uniform temperature change in declared temp units
# type tokens: UNIFORM | TRAPEZOIDAL | TRIANGULAR | POINT_SPAN | THERMAL
# csys tokens: GLOBAL,LOCAL

Area Loads on Shell Elements

#case,elem/group,type,dir,p,face
LC2,GE_SLABS_L1,PRESSURE,GLOBAL_Z,-4.80,TOP
LC3,GE_SLABS_L1,PRESSURE,GLOBAL_Z,-3.00,TOP
LC5,E300-E350,PRESSURE,GLOBAL_X,1.20,BOTH
LC1,GE_SLABS_L1,SELF_WT,-,auto
# face tokens: TOP | BOTTOM | BOTH

Wind Profile (storey-level lateral forces)

[WIND_PROFILE]
#case,group,Fx,Fy,Mz
LC5,GN_FLOOR1,85.0,-,-
LC5,GN_FLOOR2,140.0,-,-
LC5,GN_FLOOR3,185.0,-,-
LC5,GN_ROOF,220.0,-,-

Moving Loads

[MOVING_LOADS]
#case,path,vehicle,lanes,increment
LC13,PATH_LANE1,HL-93,1,0.5m

[LANE_PATHS]
PATH_LANE1: E1 E2 E3 E4 E5 E6

-–

Results Block

Store results as design envelopes (max/min + governing combination), never as full station-by-station force diagrams. Use dash for effects that are not critical.

Member Force Envelopes

[RESULTS]
[FRAME_ENVELOPES]
#elem,combo,Nmax,Nmin,Vymax,Vymin,Vzmax,Vzmin,Mymax,Mymin,Mzmax,Mzmin
E1,CB2,-850.0,-1240,45.0,-38.0,-,-,-,-,185.0,-210.0
E3,CB3,12.0,-25.0,88.0,-92.0,-,-,340.0,-280,15.0,-12.0
# Units: kN for forces, kNm for moments
# Governing combo annotates the row

Node Displacement Envelopes

[DISP_ENVELOPES]
#node,combo,Ux_max,Ux_min,Uy_max,Uy_min,Uz_max,Uz_min
N8,CB7,22.5,-19.8,18.3,-15.6,-4.2,-12.8
# Units: mm

Support Reaction Envelopes

[REACTION_ENVELOPES]
#node,combo,Rxmax,Rxmin,Rymax,Rymin,Rzmax,Rzmin
N1,CB2,280.0,-85.0,210.0,-62.0,1850.0,420.0
# Units: kN

Storey Drift and Beam Deflection

[DRIFT_SUMMARY]
#storey,combo,driftratio_X,driftratio_Y,limit
L1,CB8,1/450,1/520,1/400
L2,CB8,1/380,1/430,1/400
  # ALERT: L2 drift_X marginally exceeds limit

[DEFLECTION_SUMMARY]
#elem,combo,dmax_mm,dallow_mm,L_mm,ratio
E3,CB7,18.5,20.8,5000,L/270

Utilisation Ratios (primary block for design review queries)

[UTILISATION]
#elem,section,UR_max,check,combo,status
E1,S40,0.82,PM_interact,CB6,OK
E3,S50,0.91,Vy_shear,CB2,OK
E5,S41,1.03,PM_interact,CB9,FAIL
E7,S42,0.74,Mz_flexure,CB3,OK
# status: OK | FAIL | WARN (WARN = 0.95 ≤ UR < 1.00)
# check tokens: PM_interact | Vy_shear | Vz_shear | Mz_flexure | My_flexure
#,axial_tens,axial_comp,torsion,stability,deflection,drift

-–

Comment and Annotation Conventions

# Full-line comment — ignored by parser
## Inline end-of-row comment — must come after all data fields
  # Indented comment — used for sub-block explanations
# ALERT: flag for conditions requiring engineer attention
# WARN:  non-critical advisory note

-–

Token Efficiency Checklists

Before Writing Any Block

  • [ ] Are all IDs using the short symbolic format (N1, M2, S3, E4, LC5, CB6)?
  • [ ] Are floats rounded to 4 significant figures?
  • [ ] Are units declared in [HEADER] and not repeated on individual values?
  • [ ] Is the [GRID] block applicable instead of listing every node?
  • [ ] Can auto_code replace an explicit [COMBINATIONS] table?

Before Writing Loads

  • [ ] Are loads assigned to element groups rather than individual element IDs wherever the load is uniform across a group?
  • [ ] Are dashes used for zero-load DOFs rather than writing 0?

Before Writing Results

  • [ ] Are results stored as envelopes (max/min + combo) rather than full output tables?
  • [ ] Are dash characters used for non-critical force components?
  • [ ] Is [UTILISATION] populated for all designed elements?

-–

Block Ordering Summary

[HEADER]          ← mandatory, always first
[DEFAULTS]        ← mandatory, always second
[NODES] or [GRID] ← geometry backbone
[GROUPS]          ← optional but strongly recommended for regular models
[MATERIALS]       ← all material classes in order: STEEL, CONCRETE, REBAR, TIMBER
[SECTIONS]        ← steel first, then RC, in ascending ID order
[ELEMENTS]        ← FRAME first, then SHELL, then LINK
[OFFSETS]         ← optional, immediately after [ELEMENTS]
[JOINTS]          ← supports, then semi-rigid connections
[DIAPHRAGMS]      ← optional, after [JOINTS]
[LOAD_CASES]      ← all cases before any combinations
[SEISMIC]         ← optional sub-block, immediately after [LOAD_CASES]
[COMBINATIONS]    ← or auto_code single line
[LOADS]           ← point, distributed, area, then profile blocks
[WIND_PROFILE]    ← optional, after [LOADS]
[MOVING_LOADS]    ← optional, after [WIND_PROFILE]
[RESULTS]         ← optional; omit if model has not been analysed yet
  [FRAME_ENVELOPES]
  [DISP_ENVELOPES]
  [REACTION_ENVELOPES]
  [DRIFT_SUMMARY]
  [DEFLECTION_SUMMARY]
  [UTILISATION]   ← load this block first when answering design review queries

-–

Quick Reference — All Tokens

Category Tokens
Material classes STEEL CONCRETE REBAR TIMBER GENERIC
Concrete behavior LIN MAN-P PK
Section types (steel) CATALOGUE I C T BOX PIPE PLATE COMPOUND TAPER STEPPED EXPLICIT
Section types (RC) RC_RECT RC_BEAM RC_TBEAM RC_CIRC RC_SLAB RC_FLAT_SLB
Element classes FRAME SHELL LINK SOLID
Shell type thin thick
Link type SPRING ISOLATOR GAP DAMPER
DOF release labels Fx Fy Fz Mx My Mz
Support shortcuts FIXED PINNED ROLLER_X ROLLER_Y ROLLER_Z
Load case types DEAD LIVE WIND SEISMIC THERMAL NOTIONAL MOVING
Combination types U S A F
Load types UNIFORM TRAPEZOIDAL TRIANGULAR POINT_SPAN PRESSURE SELF_WT THERMAL
Load csys GLOBAL LOCAL
Shell face TOP BOTTOM BOTH
Design status OK FAIL WARN
UR check tokens PM_interact Vy_shear Vz_shear Mz_flexure My_flexure axial_tens axial_comp torsion stability deflection drift