Analysis

Linear-static analyses transform a finite-element problem definition into a stable result snapshot.

Public entry points

The simplest form is the model convenience method:

result = model.solve()

The top-level function is equivalent:

from nusa import solve

result = solve(model)

For explicit analysis objects:

from nusa import LinearStaticAnalysis

analysis = LinearStaticAnalysis()
result = analysis.solve(model)

All three forms produce nusa.result.StaticResult.

Analysis stages

A linear-static solve performs the following high-level operations:

validate model topology
     |
     v
assemble global stiffness matrix
     |
     v
build applied-load and prescribed-displacement vectors
     |
     v
partition free and prescribed DOFs
     |
     v
solve the reduced linear system
     |
     v
compute K @ u and reactions
     |
     v
compute canonical element results
     |
     v
freeze a StaticResult snapshot

The global stiffness matrix, reduced matrix, right-hand side, and solver partition are internal analysis details. They are intentionally not stored as public solved state on Model.

Prescribed displacements

The analysis supports both zero and nonzero prescribed displacement values. For example:

model.add_constraint(n1, ux=0.0)
model.add_constraint(n3, ux=0.002)

The contribution of prescribed nonzero DOFs is included in the reduced-system right-hand side before solving the free DOFs.

Singular systems

A model that is not sufficiently constrained can produce a singular reduced system. NuSA checks the reduced system and raises an error rather than silently returning an invalid solution.

Typical causes include:

  • rigid-body modes;

  • missing supports;

  • disconnected nodes or elements;

  • invalid topology.

When this occurs, verify the physical constraints and element connectivity before changing numerical tolerances.

Fresh solve semantics

Each analysis assembles and solves the current problem definition from scratch. There is no persistent solved-state cache on Model.

This means the following is valid and produces two independent snapshots:

result1 = model.solve()

model.add_force(node, (20.0,))
result2 = model.solve()

result1 remains unchanged after the model is modified.

Supported analysis type

NuSA 0.4 currently exposes one public analysis type: linear static analysis. The separation between Model, Analysis, and Result is designed so future analysis types can be added without changing the meaning of nodes, elements, or the existing static-result contract.

API reference

Linear-static finite-element analysis orchestration.

class nusa.analysis.LinearStaticAnalysis[source]

Bases: object

Perform a small-displacement linear-static finite-element analysis.

Methods

solve(model)

Solve model and return an independent StaticResult.

solve(model)[source]

Solve model and return an independent StaticResult.

nusa.analysis.solve(model)[source]

Solve model using the default linear-static analysis.