โปรแกรมคอมพิวเตอร์เบื้องต้นสำหรับวิเคราะห์โครงข้อหมุน โดยใช้วิธีรวมสติฟเนสโดยตรง อ่าน 4,264

โปรแกรมคอมพิวเตอร์เบื้องต้นสำหรับวิเคราะห์โครงข้อหมุน โดยใช้วิธีรวมสติฟเนสโดยตรง

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;

คะแนน:
ร่วมแสดงความคิดเห็น (Post Comment)