FCS Slabs, Ribs, and Orthotropic Panels

Shell and slab modelling with integrated ribs, orthotropic material definitions, and roof/wall panel properties.

1. Standard Shell (Isotropic Slab)

material {matConcrete} linear E 30.0e9 ni 0.2 rho 2500
thickness 1 material {matConcrete} t 0.20       # 200 mm slab

shell {s1} area {a1} thickness 1

The thickness keyword assigns a cross-section (material + plate thickness) to a shell element. The implicit index is used if only one thickness is defined.

2. ThicknessSection Class

In parametric models use ThicknessSection to bundle material and geometry:

thicknessIsotropic1 := ThicknessSection{
    Geometry := ThicknessIsotropic{
        Material  := matConcrete,
        Thickness := 0.20
    }
}

shell {s1} area {a1} thickness (thicknessIsotropic1)

This pattern is used by all HBC-2 parametric templates.

3. Orthotropic Panels

Corrugated or sandwich panels (wall panels, roof panels, floor decking) are modelled as orthotropic shells. Their effective stiffness properties are stored in a JSON resource file and loaded at runtime with Fcm.ResourceReader.

Loading orthotropy data from JSON

# list of stiffness objects, each with a "Name" field
orthotropyList := Fcm.ResourceReader.ReadJsonAsDynamicObjectArray("OrthotropyFcs.json")
orthotropyByName := name => orthotropyList.FindOrDefault(o => o.Name == name, {})

# pick a specific panel type by name
StiffnessParameters := orthotropyByName("GSI_wp_4_ga_8")
Orthotropy          := {}

thicknessOrthotropic := ThicknessSection{
    Geometry := ThicknessOrthotropic{
        Orthotropy,
        StiffnessParameters
    }
}

Inline named parameter override

thicknessRoofPanel := ThicknessSection{
    Geometry := ThicknessOrthotropic{
        Orthotropy,
        StiffnessParameters = orthotropyByName("GSI_rp_ga_24")
    }
}

Using the orthotropic thickness

shell {sPanel} area {aRoof} thickness (thicknessOrthotropic)

Source files

4. Rib-Z (Cold-Formed Rib on Slab)

A rib-Z is a cold-formed Z-section beam that bears on the underside of a concrete slab (or on a roof panel). The rib beam mesh uses HangingNodes to connect to the slab shell mesh (see 15-MESH-CONNECTIVITY.md).

Rib beam declaration

res := Resources{}

ribBeam := BeamStandard(GCS.Rx(0)){
    beamCss  := res.cssLib.sectionGsiRibChannel,
    LcsAlpha := 90*Unit.deg,    # rotate LCS 90° so Z points vertically
    MirrorCssY := False,
    MirrorCssZ := False,
    MirrorLcsZ := False,
    Ecc := {Y:=0.0, Z:=0}
}

Combining rib + slab with HangingNodes

# slab layer
mesh_layer {mlSlab} name "Slab"
shell {sSlab} area {aSlab} thickness 1 layer {mlSlab}

# rib layer
mesh_layer {mlRib} name "Rib"
beam  {bRib}  curve {cRib} xsection {csRib} layer {mlRib}

# connect: ribs are hanging on slab
Mesh.ConnectRules = Fcs.Mesh.ConnectRules{
    Rules = [
        Fcs.Mesh.ConnectRules.HangingNodes{
            HangingEntities    = Fcs.Assembly.AllBeams,
            SupportingEntities = Fcs.Assembly.AllShells,
            GlueDistance       = 0.2
        }
    ]
}

Source files

5. Mesh Options for Shell Models

model_shell3d                               # activate 3-D shell solver
Mesh.WeldNodes         := True             # merge coincident nodes
Mesh.ElementSize       := 0.2             # global target element size (m)
Mesh.DefaultElementType2D := Fcs.Mesh.Element.Quadrilateral   # or Triangle

model_shell3d must appear before the mesh/analysis directives to activate the 3-D plate/shell solver.

6. Plate 2-D (In-Plane / Plane Stress)

For pure in-plane problems use model_plate2d instead of model_shell3d:

model_plate2d
material {m1} linear E 210e9 ni 0.3 rho 7850
thickness 1 material 1 t 0.01
shell {s1} area {a1} thickness 1

Source files

7. Rotated Orthotropy Direction

For skew panels or when the corrugation direction is not aligned with the global X axis:

# rotate the orthotropy axes 30° around the shell normal
thicknessRotated := ThicknessSection{
    Geometry := ThicknessOrthotropic{
        Orthotropy = { Angle := 30 * Unit.deg },
        StiffnessParameters
    }
}

Source files

8. Quick Reference

# --- Isotropic slab ---
thickness 1 material {matC30} t 0.20
shell {s} area {a} thickness 1

# --- Orthotropic panel from JSON library ---
orthoList  := Fcm.ResourceReader.ReadJsonAsDynamicObjectArray("OrthotropyFcs.json")
orthoByName := n => orthoList.FindOrDefault(o=>o.Name==n, {})
thkPanel := ThicknessSection{ Geometry:=ThicknessOrthotropic{
    Orthotropy, StiffnessParameters=orthoByName("GSI_wp_4_ga_8") }}
shell {sPanel} area {aRoof} thickness (thkPanel)

# --- Rib on slab ---
Mesh.ConnectRules = Fcs.Mesh.ConnectRules{
    Rules=[Fcs.Mesh.ConnectRules.HangingNodes{
        HangingEntities=Fcs.Assembly.AllBeams,
        SupportingEntities=Fcs.Assembly.AllShells,
        GlueDistance=0.2
    }]
}
model_shell3d

9. Relevant Test Folders

Folder Feature
new-SlabOrthotropy/ Orthotropic shells (isotropic, orthotropic, rotated, roof panel)
new-BenchmarkRibZ/ Cold-formed Z-rib test cases
new-SlabRib/ Slab + rib with HangingNodes
new-RoofPanelWithRibZ/ Roof panel + rib combination
test-ShellBeam-*/ (≈30 folders) Various shell-beam interaction
test-temelin3/ Large slab model
bug-SlabRib/ SlabRib edge-case bug reproductions
bug-ShearLockingQuad/ Quad integration pitfall