Saturday, November 7, 2009

STRUCTURAL ANALYSIS

Structural Analysis (Engineering), a determination of stresses and strains in a given structure.

Below is one of the structural analysis programs created by the author.
Truss Analysis 2d v.1 ESF ,2D analysis created on 14 June 2001 using QBasic program.

The following are the Qbasic code for Truss Analysis 2d v.1 ESF created by the Author:

10 CLS
20 KEY OFF
21 PRINT
22 PRINT "TRUSS ANALYSIS v.1 created on 14 June 2001 by ERNEL SOLIS FILIPINAS"
25 PRINT
30 INPUT "Enter no. of joints"; noj
40 INPUT "Enter no. of member"; nom
60 REDIM jdat(noj, 5), mdat(nom, 4), ndf(noj, 2), mcode(nom, 4)

99 rent = 1
100 FOR i = 1 TO noj
110 PRINT : PRINT "Joint no. "; i
120 INPUT "Enter the x-coordinate, (mm)"; jdat(i, 1)
130 INPUT "Enter the y-coordinate, (mm)"; jdat(i, 2)
140 PRINT "Joint type 1 - Hinge 2 - x roller 3 - y roller 4 - free"
150 INPUT jdat(i, 3)
160 INPUT "Enter horizontal load (KN)"; jdat(i, 4)
170 INPUT "Enter vertical load (KN)"; jdat(i, 5)
175 INPUT "Do you want to re-enter [Y/N] "; reent$
176 IF UCASE$(reent$) = "Y" THEN INPUT "What joint no. "; rent: IF rent > i THEN GOTO 175 ELSE i = rent: GOTO 110
180 NEXT i

199 rent = 1
200 FOR i = 1 TO nom
210 PRINT : PRINT "Member no. "; i
220 INPUT "Near end joint "; mdat(i, 1)
230 INPUT "Far end joint "; mdat(i, 2)
240 INPUT "Cross sectional area (mm) "; mdat(i, 3)
250 INPUT "Modulus of Elasticity (GPa) "; mdat(i, 4)
255 INPUT "Do you want to re-enter [Y/N] "; reent$
256 IF UCASE$(reent$) = "Y" THEN INPUT "What member no. "; rent: IF rent > i THEN GOTO 255 ELSE i = rent: GOTO 210
260 NEXT i

270 CLS : PRINT : PRINT TAB(27); "STRUCTURAL INFORMATION": PRINT
271 PRINT TAB(28); "NUMBER OF JOINTS = "; noj
272 PRINT TAB(28); "NUMBER OF MEMBER = "; nom
273 PRINT : PRINT TAB(31); "JOINTS INPUT DATA": PRINT
274 PRINT "", "JOINT NO.", "X-COORD.", "Y-COORD.", "JOINT TYPE": PRINT
275 FOR i = 1 TO noj
276 PRINT "", i, jdat(i, 1), jdat(i, 2), jdat(i, 3)
277 NEXT i
278 PRINT : INPUT "press enter to continue"; resp$: CLS : PRINT : PRINT TAB(31); "MEMBER INPUT DATA": PRINT
279 PRINT "", "MEMBER NO.", "NEAR END", "FAR END", "AREA (mm)": PRINT
280 FOR i = 1 TO nom
281 PRINT "", i, mdat(i, 1), mdat(i, 2), mdat(i, 3)
282 NEXT i: PRINT
283 PRINT : INPUT "press enter to continue"; resp$: CLS : PRINT : PRINT TAB(31); "LOAD INPUT DATA": PRINT
284 PRINT "", "JOINT NO.", "HOR'L LOAD", "VERT LOAD": PRINT
285 FOR i = 1 TO noj
286 PRINT "", i, jdat(i, 4), jdat(i, 5)
287 NEXT i

300 tdof = 0
310 FOR i = 1 TO noj
320 IF jdat(i, 3) = 1 THEN ndf(i, 1) = 0: ndf(i, 2) = 0: GOTO 370
330 IF jdat(i, 3) = 2 THEN ndf(i, 1) = tdof + 1: ndf(i, 2) = 0: tdof = tdof + 1: GOTO 370
350 IF jdat(i, 3) = 3 THEN ndf(i, 1) = 0: ndf(i, 2) = tdof + 1: tdof = tdof + 1: GOTO 370
360 IF jdat(i, 3) = 4 THEN ndf(i, 1) = tdof + 1: ndf(i, 2) = tdof + 2: tdof = tdof + 2: GOTO 370
370 NEXT i
400 FOR i = 1 TO nom
410 mcode(i, 1) = ndf(mdat(i, 1), 1)
420 mcode(i, 2) = ndf(mdat(i, 1), 2)
430 mcode(i, 3) = ndf(mdat(i, 2), 1)
440 mcode(i, 4) = ndf(mdat(i, 2), 2)
450 NEXT i

451 PRINT : INPUT "press enter to continue"; resp$: CLS : PRINT : PRINT " TDOF = "; tdof, "", " MEMBER CODE "
452 PRINT " MEM. NO.", "X-NEAR END", "Y-NEAR END", "X-FAR END", "Y-FAR END": PRINT
453 FOR i = 1 TO nom
454 PRINT " "; i, mcode(i, 1), mcode(i, 2), mcode(i, 3), mcode(i, 4)
455 NEXT i
456 PRINT

500 REDIM ksys(tdof, tdof), k(4, 4), mprop(nom, 3)
510 FOR i = 1 TO nom
520 x1 = jdat(mdat(i, 1), 1)
530 y1 = jdat(mdat(i, 1), 2)
540 x2 = jdat(mdat(i, 2), 1)
550 y2 = jdat(mdat(i, 2), 2)
560 Ln = SQR((x2 - x1) ^ 2 + (y2 - y1) ^ 2)
570 cosine = (x2 - x1) / Ln
580 sine = (y2 - y1) / Ln
590 AEL = mdat(i, 3) * mdat(i, 4) / Ln
600 mprop(i, 1) = AEL: mprop(i, 2) = cosine: mprop(i, 3) = sine
610 k(1, 1) = AEL * cosine * cosine
620 k(1, 2) = AEL * cosine * sine
630 k(1, 3) = -k(1, 1)
640 k(1, 4) = -k(1, 2)
650 k(2, 2) = AEL * sine * sine
660 k(2, 3) = -k(1, 2)
670 k(2, 4) = -k(2, 2)
680 k(3, 3) = k(1, 1)
690 k(3, 4) = k(1, 2)
700 k(4, 4) = k(2, 2)

710 PRINT : INPUT "press enter to continue"; resp$: CLS : PRINT
720 PRINT " For member "; i
730 PRINT " x1 ="; x1, "x2 ="; x2, "y1 ="; y1, "y2 ="; y2, "ln = "; Ln
740 PRINT " AE/L = "; AEL, " cosine ="; cosine, "sine ="; sine

800 FOR i1 = 1 TO 4
810 i2 = mcode(i, i1)
820 IF i2 = 0 THEN GOTO 890
830 FOR j1 = i1 TO 4
840 j2 = mcode(i, j1)
850 IF j2 = 0 THEN GOTO 880
860 IF i2 > j2 THEN t = t2: t2 = j2: j2 = t
870 ksys(i2, j2) = ksys(i2, j2) + k(i1, j1)
880 NEXT j1
890 NEXT i1
900 NEXT i

901 PRINT : INPUT "press enter to continue"; resp$: CLS : PRINT : l = 0
902 PRINT TAB(20); "stiffness system matrix": PRINT
903 FOR i = 1 TO tdof
904 FOR j = l + 1 TO tdof
905 PRINT TAB(20); "for k "; i; " "; j; " = "; ksys(i, j)
906 NEXT j
907 l = l + 1
908 NEXT i
909 PRINT : INPUT "press enter to continue"; resp$: CLS

910 REDIM qsys(tdof)
920 FOR i = 1 TO noj
930 FOR j = 1 TO 2
940 IF ndf(i, j) <> 0 THEN qsys(ndf(i, j)) = jdat(i, j + 3)
950 NEXT j
960 NEXT i

1130 REDIM u(tdof, tdof): REDIM y(tdof): REDIM dsys(tdof)
1187 l = 1
1190 FOR i = 1 TO tdof
1200 FOR j = l TO tdof
1210 IF i = j THEN GOTO 2000
1220 sm = 0
1230 FOR k = 1 TO tdof - 1
1240 sm = sm + u(k, i) * u(k, j)
1250 NEXT k
1260 u(i, j) = (ksys(i, j) - sm) / u(i, i): PRINT "u"; i; " "; j; " is "; u(i, j)
1270 NEXT j
1280 l = l + 1: NEXT i
1300 FOR i = 1 TO tdof
1310 sm = 0
1320 FOR k = 1 TO tdof - 1
1330 sm = sm + u(k, i) * y(k)
1340 NEXT k
1345 IF u(i, i) = 0 THEN CLS : PRINT : PRINT : PRINT TAB(20); "Your system is not Stable": END
1350 y(i) = (qsys(i) - sm) / u(i, i): PRINT "y"; i; " is "; y(i): PRINT : INPUT " press enter to continue"; resp$
1360 NEXT i
1370 FOR i = tdof TO 1 STEP -1
1380 sm = 0
1390 FOR k = i + 1 TO tdof
1400 sm = sm + u(i, k) * dsys(k)
1410 NEXT k
1420 dsys(i) = (y(i) - sm) / u(i, i)
1430 NEXT i
1435 CLS : COLOR 7
1510 FOR i = 1 TO tdof
1520 PRINT " THE VALUE OF D ("; i; ") IS "; dsys(i);
1530 NEXT i
1535 GOTO 2100
1540 END
2000 sm = 0
2010 FOR k = 1 TO tdof - 1
2020 sm = sm + u(k, i) * u(k, i)
2030 NEXT k
2040 u(i, i) = SQR(ksys(i, i) - sm): PRINT "u"; i; " "; i; " is "; u(i, i)
2050 GOTO 1270

2100 REDIM mfor(nom), r(4), d(nom, 4), mdis(nom)
2110 FOR i = 1 TO nom
2120 FOR j = 1 TO 4
2130 IF mcode(i, j) = 0 THEN d(i, j) = 0 ELSE d(i, j) = dsys(mcode(i, j))
2140 NEXT j
2150 mdis(i) = ((d(i, 3) - d(i, 1)) * mprop(i, 2) + ((d(i, 4) - d(i, 2)) * mprop(i, 3)))
2155 mfor(i) = mprop(i, 1) * mdis(i)
2160 NEXT i

2161 PRINT : PRINT : INPUT "press enter to continue"; resp$: CLS : PRINT
2162 PRINT TAB(20); "member forces & displacement": PRINT
2263 PRINT "", "mem.no", "mem.force", "mem.disp.": PRINT
2264 FOR i = 1 TO nom
2265 PRINT "", i, mfor(i), mdis(i)
2266 NEXT i

2171 PRINT : INPUT "press enter to continue"; resp$: CLS : PRINT
2172 PRINT TAB(25); "displacement": PRINT
2273 PRINT " mem.no", "dx1", "dy1", "dx2", "dy2": PRINT
2274 FOR i = 1 TO nom
2275 PRINT " "; i, d(i, 1), d(i, 2), d(i, 3), d(i, 4)
2276 NEXT i

2300 REDIM re(noj, 2), red(noj, 2)
2310 FOR i = 1 TO nom
2320 r(1) = -mfor(i) * mprop(i, 2)
2330 r(2) = -mfor(i) * mprop(i, 3)
2340 r(3) = -r(1)
2350 r(4) = -r(2)
2360 FOR j = 1 TO 4
2370 IF mcode(i, j) = 0 THEN IF j < 3 THEN re(mdat(i, 1), j) = r(j) + re(mdat(i, 1), j) ELSE re(mdat(i, 2), j - 2) = r(j) + re(mdat(i, 2), j - 2)
2410 NEXT j
2500 NEXT i
2510 FOR i = 1 TO nom
2520 FOR j = 1 TO 4
2530 IF mcode <> 0 THEN GOTO 2580
2540 IF j < 3 THEN red(mdat(i, 1), j) = re(mdat(i, 1), j) - jdat(mdat(i, 1), j + 3)
2550 IF j > 2 THEN red(mdat(i, 2), j - 2) = re(mdat(i, 2), j - 2) - jdat(mdat(i, 2), j + 1)
2580 NEXT j
2590 NEXT i

2600 PRINT : INPUT "press enter to continue"; resp$: CLS : PRINT
2700 PRINT TAB(20); "Reaction due to displacement": PRINT
2705 PRINT "", "1 = x reaction", "2 = y reaction": PRINT
2710 PRINT "", "joint no.", "react.no.", "reaction": PRINT
2720 FOR i = 1 TO nom
2730 FOR j = 1 TO 4
2740 IF mcode(i, j) = 0 THEN IF j < 3 THEN PRINT " ", mdat(i, 1), j, re(mdat(i, 1), j) ELSE PRINT " ", mdat(i, 2), j - 2, re(mdat(i, 2), j - 2)
2750 NEXT j
2760 NEXT i

2761 PRINT : INPUT "press enter to continue"; resp$: CLS : PRINT
2762 PRINT TAB(15); "Reaction due to displacement & load": PRINT
2763 PRINT "", "1 = x reaction", "2 = y reaction": PRINT
2764 PRINT "", "joint no.", "react.no.", "reaction": PRINT
2765 FOR i = 1 TO nom
2766 FOR j = 1 TO 4
2767 IF mcode(i, j) = 0 THEN IF j < 3 THEN PRINT " ", mdat(i, 1), j, red(mdat(i, 1), j) ELSE PRINT " ", mdat(i, 2), j - 2, red(mdat(i, 2), j - 2)
2768 NEXT j
2769 NEXT i

2770 PRINT : INPUT "Do you want to print the result [Y/N] "; prnt$
2780 IF UCASE$(prnt$) = "Y" THEN GOTO 3000
2790 IF UCASE$(prnt$) = "" THEN GOTO 2770
2800 PRINT : INPUT "Do you want to start again [Y/N] "; strt$
2900 IF UCASE$(strt$) = "Y" THEN GOTO 10
2999 END

3000 CLS : REDIM name$(30), title$(50)
3010 INPUT "Enter name of structural engineer"; name$
3020 INPUT "Enter title of project"; title$
3030 LPRINT : LPRINT "Structural Engineer: "; name$
3040 LPRINT "Title: "; title$

3270 LPRINT : LPRINT : LPRINT : LPRINT TAB(27); "STRUCTURAL INFORMATION": LPRINT
3271 LPRINT TAB(28); "NUMBER OF JOINTS = "; noj
3272 LPRINT TAB(28); "NUMBER OF MEMBER = "; nom
3273 LPRINT : LPRINT : LPRINT TAB(31); "JOINTS INPUT DATA": LPRINT
3274 LPRINT "", "JOINT NO.", "X-COORD.", "Y-COORD.", "JOINT TYPE": LPRINT
3275 FOR i = 1 TO noj
3276 LPRINT "", i, jdat(i, 1), jdat(i, 2), jdat(i, 3)
3277 NEXT i
3278 LPRINT : LPRINT : LPRINT TAB(31); "MEMBER INPUT DATA": LPRINT
3279 LPRINT "", "MEMBER NO.", "NEAR END", "FAR END", "AREA (mm)": LPRINT
3280 FOR i = 1 TO nom
3281 LPRINT "", i, mdat(i, 1), mdat(i, 2), mdat(i, 3)
3282 NEXT i
3283 LPRINT : LPRINT : LPRINT TAB(31); "LOAD INPUT DATA": LPRINT
3284 LPRINT "", "JOINT NO.", "HOR'L LOAD", "VERT LOAD": LPRINT
3285 FOR i = 1 TO noj
3286 LPRINT "", i, jdat(i, 4), jdat(i, 5)
3287 NEXT i

3351 LPRINT : LPRINT : LPRINT " TDOF = "; tdof, "", " MEMBER CODE "
3352 LPRINT " MEM. NO.", "X-NEAR END", "Y-NEAR END", "X-FAR END", "Y-FAR END": LPRINT
3353 FOR i = 1 TO nom
3354 LPRINT " "; i, mcode(i, 1), mcode(i, 2), mcode(i, 3), mcode(i, 4)
3355 NEXT i

3610 LPRINT : LPRINT
3620 LPRINT TAB(20); "member forces & displacement": LPRINT
3630 LPRINT "", "mem.no", "mem.force", "mem.disp.": LPRINT
3640 FOR i = 1 TO nom
3650 LPRINT "", i, mfor(i), mdis(i)
3660 NEXT i

3700 LPRINT : LPRINT
3701 LPRINT TAB(20); "Reaction due to displacement": LPRINT
3705 LPRINT "", "1 = x reaction", "2 = y reaction": LPRINT
3710 LPRINT "", "joint no.", "react.no.", "reaction": LPRINT
3720 FOR i = 1 TO nom
3730 FOR j = 1 TO 4
3740 IF mcode(i, j) = 0 THEN IF j < 3 THEN LPRINT " ", mdat(i, 1), j, re(mdat(i, 1), j) ELSE LPRINT " ", mdat(i, 2), j - 2, re(mdat(i, 2), j - 2)
3750 NEXT j
3760 NEXT i

3761 LPRINT : LPRINT
3762 LPRINT TAB(15); "Reaction due to displacement & load": LPRINT
3763 LPRINT "", "1 = x reaction", "2 = y reaction": LPRINT
3764 LPRINT "", "joint no.", "react.no.", "reaction": LPRINT
3765 FOR i = 1 TO nom
3766 FOR j = 1 TO 4
3767 IF mcode(i, j) = 0 THEN IF j < 3 THEN LPRINT " ", mdat(i, 1), j, red(mdat(i, 1), j) ELSE LPRINT " ", mdat(i, 2), j - 2, red(mdat(i, 2), j - 2)
3768 NEXT j
3769 NEXT i


3800 GOTO 2800
4000 END

No comments: