! Do static analysis of a cantilever truss that looks like:
   
 1__2__3__4
 | /| /| /|
 |/_|/_|/_|
 
The truss is attached vertically and horizontally at node 1 top,
  and attached only horizontally at node 1 bottom.
There are bounds on the allowed tensile and compressive stress
on each member.
We want to maximize the load that can be carried at node n bottom;

! Keywords: Truss design, Statics, Stress analysis;

!    The SETS-based model. To see the equivalent scalar model, 
  click on: Solver | Generate | Display;
SETS:
! The set of vertical slices and associated forces;
 vslice : fvrt, ftop, fbot, fdiag;
ENDSETS
DATA: !Parameters; H = 4; ! Length of each horizontal member; V = 3; ! Length of each vertical member; vslice = 1..4; ! The set of vertical slices; fmax = 370; ! Tension limit on each member; fmin = -350; ! Compression limit; ENDDATA ! Definition of variables: For j = 1, 2, ..., n: fvrt(j) = tension on vertical member at slice j, < 0 implies compression. For j = 1, 2, ..., n-1: ftop( j) = tension on the horizontal top member slice j, fbot( j) = tension on the horizontal bottom member of slice j, fdiag(j) = tension on the diagonal member in slice j, ; n = @size( vslice); ! number of vertical members; theta = @ATAN2( H, V); ! The angle between the bottom horizontal leg and the diagonal; ! The truss has 2*n nodes. For each node, there are two equations enforcing: horizontal forces net to 0, and vertical forces net to 0; ! for slice 1, top; ! Horizontal forces at top node of 1 must be =; [TOPH1] ftop0 = ftop(1); ! vertical forces at top of node 1 must be =; [TOPV1] fvrt0 = fvrt(1); ! horizontal forces at bottom of 1; [BOTH1] fbot0 = fbot(1) + fdiag(1)*@COS( theta); @free( fbot0); ! Allow for a compressive force; ! vertical forces at bottom of 1; [BOTV1] fvrt(1) = - fdiag(1)*@SIN( theta); ! At intermediate nodes; @FOR( vslice( j) | j #gt# 1 #and# j #lt# n: ! Horizontal forces at top of j; [TOPH] ftop( j-1) + fdiag(j-1)*@COS(theta) = ftop(j); ! vertical forces at top of j; [TOPV] fvrt(j) = -fdiag(j-1)*@SIN(theta); ! horizontal forces at bottom of j; [BOTH] fbot(j) + fdiag(j)*@COS(theta) = fbot(j-1); ! vertical forces at bottom of j; [BOTV] fvrt(j) = - fdiag(j)*@SIN( theta); ); ! For final, rightmost slice; ! horizontal forces at top of n; [TOPHN] ftop( n-1) + fdiag(n-1)*@COS(theta) = 0; ftop( n) = 0; ! Member does not exist; fdiag( n) = 0; !Member does not exist; ! vertical forces at top of n; [TOPVN] fvrt(n) = - fdiag(n-1)*@SIN(theta); ! horizontal forces at bottom of n; [BOTHN] fbot(n-1) = 0; fbot( n) = 0; !Member does not exist; ! vertical forces at bottom of n; [BOTVN] fvrt( n) = load; ! Tension and compression limits; @FOR( vslice( j): @BND( fmin, ftop( j), fmax); @BND( fmin, fbot( j), fmax); @BND( fmin, fdiag( j), fmax); @BND( fmin, fvrt( j), fmax); ); ! Maximize the load we can carry; MAX = load;