โปรแกรมคอมพิวเตอร์เบื้องต้นสำหรับวิเคราะห์โครงข้อหมุน โดยใช้วิธีรวมสติฟเนสโดยตรง Basic Computer Program for Truss Analysis by Direct Stiffness Method |
Program TrussAnalysis;
Uses Crt;
Const
MaxNode = 50;
MaxMat = 5;
MaxMem = 25;
Head = 1;
Tail = 2;
MaxSup = 15;
MaxLoad = 2*MaxNode;
Var
NumN : Integer; {Number of Nodes}
NumEq : Integer;
NumM : Integer; {Number of Members}
NMat : Integer; {Number of Materials}
NSup : Integer; {Number of Support Nodes}
NumLN : Integer; {Number of Loaded Nodes}
{Input Variables}
X, Y : Array[1..MaxNode] of Real;
Elas : Array[1..MaxMat] of Real;
NodeM : Array[1..MaxMem,Head..Tail] of Integer;
Area : Array[1..MaxMem] of Real;
TypeM : Array[1..MaxMem] of Byte;
NRx, NRy : Array[1..MaxSup] of Byte;
P : Array[1..MaxLoad] of Real;
{Compute Variables}
Rx, Ry : Array[1..MaxNode] of Real;
Length, Cx, Cy : Array[1..MaxMem] of Real;
Kgbl : Array[1..MaxLoad,1..MaxLoad] of Real;
D : Array[1..MaxLoad] of Real;
S : Array[1..MaxMem] of Real;
{**************** Input **************}
Procedure ControlData;
{Input Control Data}
Begin
ClrScr;
Write(\'Number of Nodes : \'); ReadLn(NumN);
NumEq := 2*NumN;
Write(\'Number of Members : \'); ReadLn(NumM);
Write(\'Number of Materials : \'); ReadLn(NMat);
Write(\'Number of Support Nodes : \'); ReadLn(NSup);
Write(\'Number of Loaded Nodes : \'); ReadLn(NumLN);
End;
Procedure NodeCoordinates;
{Input Node Coordinates}
Var I : Byte;
Begin
For I := 1 to NumN Do
Begin
ClrScr;
WriteLn(\'Node \',I);
Write(\'X = \'); ReadLn(X[I]);
Write(\'Y = \'); ReadLn(Y[I]);
End;
End;
Procedure Material;
{Input Material Data}
Var I : Byte;
Begin
For I := 1 to NMat Do
Begin
ClrScr;
WriteLn(\'Material Number \',I);
Write(\'Modulas of Elasticity = \');
ReadLn(Elas[I]);
End;
End;
Procedure Member;
{Input Member Data}
Var I : Byte;
Begin
For I := 1 to NumM Do
Begin
ClrScr;
WriteLn(\'Member \',I);
Write(\'Head Node = \'); ReadLn(NodeM[I,Head]);
Write(\'Tail Node = \'); ReadLn(NodeM[I,Tail]);
Write(\'Area = \'); ReadLn(Area[I]);
If NMat = 1 Then
TypeM[I] := 1
Else
Begin
Write(\'Material Number = \'); ReadLn(TypeM[I]);
End;
End;
End;
Procedure SupRestraints;
{Input Support Restraints}
Var
I, J : Byte;
Ch : Char;
Begin
For I := 1 to NSup Do
Begin
ClrScr;
Write(\'Support Node Number : \'); ReadLn(J);
Write(\'Roller or Hinge (R or H) : \');
ReadLn(Ch);
If Upcase(Ch) = \'R\' Then
Begin
NRx[J] := 0; NRy[J] := 1;
End Else
If Upcase(Ch) = \'H\' Then
Begin
NRx[J] := 1; NRy[J] := 1;
End;
End;
End;
Procedure NodeLoads;
{Input Node Loads}
Var
I, J : Integer;
Begin
For I := 1 to NumEq Do P[I] := 0;
For I := 1 to NumLN Do
Begin
ClrScr;
Write(\'Load Node Number : \'); ReadLn(J);
Write(\'X force = \'); ReadLn(P[2*J-1]);
Write(\'Y force = \'); ReadLn(P[2*J]);
End;
End;
Procedure InputData;
Begin
ControlData;
NodeCoordinates;
Material;
Member;
SupRestraints;
NodeLoads;
End;
{**************** Input **************}
{*************** Compute *************}
Procedure InitialReaction;
{Initialize Reaction Array}
Var I : Integer;
Begin
For I := 1 to NumN Do
Begin
If (NRx[I] = 1) And (P[2*I-1] <> 0) Then
Rx[I] := -P[2*I-1]
Else
Rx[I] := 0;
If (NRy[I] = 1) And (P[2*I] <> 0) Then
Ry[I] := -P[2*I]
Else
Ry[I] := 0;
End;
End;
Procedure MemLenghtsandDirectCos;
{Compute Member Lenghts and Direction Cosines}
Var
I : Integer;
J1, J2 : Integer;
XL, YL : Real;
Begin
For I := 1 to NumM Do
Begin
J1 := NodeM[I,Head];
J2 := NodeM[I,Tail];
XL := X[J2]-X[J1];
YL := Y[J2]-Y[J1];
Length[I] := Sqrt(Sqr(XL)+Sqr(YL));
Cx[I] := XL/Length[I];
Cy[I] := YL/Length[I];
End;
End;
Procedure UnresGlobal;
{Generate Unrestrained Global Stiffness Matrix}
Var
I, J : Integer;
J1, J2 : Integer;
Aeol, XX, YY, XY : Real;
J12M1, J12, J22M1, J22 : Integer;
Begin
For I := 1 to NumEq Do
Begin
For J := 1 to NumEq Do
Kgbl[I,J] := 0;
End;
For I := 1 to NumM Do
Begin
J1 := NodeM[I,Head];
J2 := NodeM[I,Tail];
J := TypeM[I];
AEoL := Area[I]*Elas[J]/Length[I];
XX := AEoL*Sqr(Cx[I]);
YY := AEoL*Sqr(Cy[I]);
XY := AEoL*Cx[I]*Cy[I];
J12M1 := 2*J1-1;
J12 := 2*J1;
J22M1 := 2*J2-1;
J22 := 2*J2;
Kgbl[J12M1,J12M1] := Kgbl[J12M1,J12M1]+XX;
Kgbl[J12M1,J12] := Kgbl[J12M1,J12]+XY;
Kgbl[J12M1,J22M1] := Kgbl[J12M1,J22M1]-XX;
Kgbl[J12M1,J22] := Kgbl[J12M1,J22]-XY;
Kgbl[J12,J12M1] := Kgbl[J12,J12M1]+XY;
Kgbl[J12,J12] := Kgbl[J12,J12]+YY;
Kgbl[J12,J22M1] := Kgbl[J12,J22M1]-XY;
Kgbl[J12,J22] := Kgbl[J12,J22]-YY;
Kgbl[J22M1,J12M1] := Kgbl[J22M1,J12M1]-XX;
Kgbl[J22M1,J12] := Kgbl[J22M1,J12]-XY;
Kgbl[J22M1,J22M1] := Kgbl[J22M1,J22M1]+XX;
Kgbl[J22M1,J22] := Kgbl[J22M1,J22]+XY;
Kgbl[J22,J12M1] := Kgbl[J22,J12M1]-XY;
Kgbl[J22,J12] := Kgbl[J22,J12]-YY;
Kgbl[J22,J22M1] := Kgbl[J22,J22M1]+XY;
Kgbl[J22,J22] := Kgbl[J22,J22]+YY;
End;
End;