import matplotlib.pyplot as plt import torch import numpy as np from slientruss3d.truss import Truss from slientruss3d.type import SupportType, MemberType from slientruss3d.plot import TrussPlotter def TestPlot(truss): # -------------------- Global variables -------------------- # Files settings: TEST_FILE_NUMBER = 25 TEST_LOAD_CASE = 0 TEST_INPUT_FILE = f"./data/bar-{TEST_FILE_NUMBER}_output_{TEST_LOAD_CASE}.json" TEST_PLOT_SAVE_PATH = f"./plot/bar-{TEST_FILE_NUMBER}_plot_{TEST_LOAD_CASE}.png" # Truss dimension setting: TRUSS_DIMENSION = 3 # Figure layout settings: IS_SAVE_PLOT = False # Whether to save truss figure or not. IS_EQUAL_AXIS = True # Whether to use actual aspect ratio in the truss figure or not. IS_PLOT_STRESS = True # If True, the color of each displaced member gives expression to [stress]. Otherwise, [force magnitude]. MAX_SCALED_DISPLACEMENT = 15 # Scale the max value of all dimensions of displacements. MAX_SCALED_FORCE = 50 # Scale the max value of all dimensions of force arrows. POINT_SIZE_SCALE_FACTOR = 1 # Scale the default size of joint point in the truss figure. ARROW_SIZE_SCALE_FACTOR = 1 # Scale the default size of force arrow in the truss figure. # ---------------------------------------------------------- # Truss object: # truss = Truss(dim=TRUSS_DIMENSION) # You could directly read the output .json file. # truss.LoadFromJSON(TEST_INPUT_FILE, isOutputFile=True) # Show or save the structural analysis result figure: TrussPlotter(truss, isEqualAxis=IS_EQUAL_AXIS, isPlotStress=IS_PLOT_STRESS, maxScaledDisplace=MAX_SCALED_DISPLACEMENT, maxScaledForce=MAX_SCALED_FORCE, pointScale=POINT_SIZE_SCALE_FACTOR, arrowScale=ARROW_SIZE_SCALE_FACTOR).Plot(IS_SAVE_PLOT, TEST_PLOT_SAVE_PATH) def Truss10bar(A, E, Rho): # -------------------- Global variables -------------------- TEST_OUTPUT_FILE = f"./test_output.json" TRUSS_DIMENSION = 2 # ---------------------------------------------------------- # Truss object: truss = Truss(dim=TRUSS_DIMENSION) init_truss = truss # Truss settings: joints = [(0, 0), (360, 0), (720, 0), (0, 360), (360, 360), (720, 360) ] supports = [SupportType.PIN, SupportType.NO, SupportType.NO, SupportType.PIN, SupportType.NO, SupportType.NO, ] forces = [(1, (0, -1e5)), (2, (0, -1e5))] members = [(0, 1), (0, 4), (1, 2), (1, 3), (1, 4), (1, 5), (2, 4), (2, 5), (3, 4), (4, 5) ] # memberType : Member type which contain the information about # 1) cross-sectional area, # 2) Young's modulus, # 3) density of this member. # Read data in this [.py]: for joint, support in zip(joints, supports): truss.AddNewJoint(joint, support) for jointID, force in forces: truss.AddExternalForce(jointID, force) index = 0 for jointID0, jointID1 in members: # Default: 0.1, 1e7, 1 memberType = MemberType(A[index].item(), 10000000.0, 0.1) if (E != None) & (Rho!=None): memberType = MemberType(A[index].item(), E[index].item(), Rho[index].item()) elif (E != None) & (Rho==None): memberType = MemberType(A[index].item(), E[index].item(), 0.1) elif (E == None) & (Rho!=None): memberType = MemberType(A[index].item(), 10000000.0, Rho[index].item()) truss.AddNewMember(jointID0, jointID1, memberType) index += 1 # Do direct stiffness method: truss.Solve() # Dump all the structural analysis results into a .json file: # truss.DumpIntoJSON(TEST_OUTPUT_FILE) # Get result of structural analysis: displace, forces, stress, resistance = truss.GetDisplacements(), truss.GetInternalForces(), truss.GetInternalStresses(), truss.GetResistances() return displace, forces, stress, resistance, truss, truss.weight def Truss25bar(A, E, Rho): # -------------------- Global variables -------------------- TEST_OUTPUT_FILE = f"./test_output.json" TRUSS_DIMENSION = 3 # ---------------------------------------------------------- # Truss object: truss = Truss(dim=TRUSS_DIMENSION) init_truss = truss # Truss settings: joints = [(62.5, 100, 200), (137.5, 100, 200), (62.5, 137.5, 100), (137.5, 137.5, 100), (137.5, 62.5, 100), (62.5, 62.5, 100), (0, 200, 0), (200, 200, 0), (200, 0, 0), (0, 0, 0) ] supports = [SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.PIN, SupportType.PIN, SupportType.PIN, SupportType.PIN ] forces = [(0, (1000, 20000, -5000)), (1, (0, -20000, -5000)), (2, (500, 0, 0)), (5, (500, 0, 0)), ] members = [(0, 1), (0, 3), (1, 2), (0, 4), (1, 5), (0, 2), (0, 5), (1, 3), (1, 4), (2, 5), (3, 4), (2, 3), (4, 5), (2, 9), (5, 6), (3, 8), (4, 7), (2, 7), (3, 6), (5, 8), (4, 9), (2, 6), (3, 7), (4, 8), (5, 9), ] # memberType : Member type which contain the information about # 1) cross-sectional area, # 2) Young's modulus, # 3) density of this member. # Read data in this [.py]: for joint, support in zip(joints, supports): truss.AddNewJoint(joint, support) for jointID, force in forces: truss.AddExternalForce(jointID, force) index = 0 for jointID0, jointID1 in members: # Default: 0.1, 1e7, .1 memberType = MemberType(A[index].item(), 3e7, .283) if (E != None) & (Rho!=None): memberType = MemberType(A[index].item(), E[index].item(), Rho[index].item()) elif (E != None) & (Rho==None): memberType = MemberType(A[index].item(), E[index].item(), .283) elif (E == None) & (Rho!=None): memberType = MemberType(A[index].item(), 3e7, Rho[index].item()) # memberType = MemberType(A[index].item(), 1e7, .1) truss.AddNewMember(jointID0, jointID1, memberType) index += 1 # Do direct stiffness method: truss.Solve() # Dump all the structural analysis results into a .json file: # truss.DumpIntoJSON(TEST_OUTPUT_FILE) # Get result of structural analysis: displace, forces, stress, resistance = truss.GetDisplacements(), truss.GetInternalForces(), truss.GetInternalStresses(), truss.GetResistances() return displace, forces, stress, resistance, truss, truss.weight def Truss47bar(A, E, Rho, version): # -------------------- Global variables -------------------- TEST_OUTPUT_FILE = f"./test_output.json" TRUSS_DIMENSION = 2 # ---------------------------------------------------------- # Truss object: truss = Truss(dim=TRUSS_DIMENSION) init_truss = truss # Truss settings: joints = [(-60, 0), (60, 0), (-60, 120), (60, 120), (-60, 240), (60, 240), (-60, 360), (60, 360), (-30, 420), (30, 420), (-30, 480), (30, 480), (-30, 540), (30, 540), (-90, 570), (90, 570), (-150, 600), (-90, 600), (-30, 600), (30, 600), (90, 600), (150, 600)] supports = [SupportType.PIN, SupportType.PIN, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO] forces = [(16, (6000, -14000)), (21, (6000, -14000))] if version == 1: forces = [(16, (6000, -14000)), (21, (6000, -14000))] elif version == 2: forces = [(16, (6000, -14000))] elif version == 3: forces = [(21, (6000, -14000))] members = [(0, 2), (0, 3), (1, 2), (1, 3), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5), (4, 6), (4, 7), (5, 6), (5, 7), (6, 7), (6, 8), (6, 9), (7, 8), (7, 9), (8, 9), (8, 10), (8, 11), (9, 10), (9, 11), (10, 11), (10, 12), (10, 13), (11, 12), (11, 13), (12, 13), (12, 14), (12, 18), (12, 19), (13, 18), (13, 19), (13, 15), (14, 16), (14, 17), (14, 18), (15, 19), (15, 20), (15, 21), (16, 17), (17, 18), (18, 19), (19, 20), (20, 21)] # memberType : Member type which contain the information about # 1) cross-sectional area, # 2) Young's modulus, # 3) density of this member. # Read data in this [.py]: for joint, support in zip(joints, supports): truss.AddNewJoint(joint, support) for jointID, force in forces: truss.AddExternalForce(jointID, force) index = 0 for jointID0, jointID1 in members: # memberType = MemberType(A[index].item(), 300000000.0, 0.3) # Default: 0.1, 300000000.0, 0.3 memberType = MemberType(A[index].item(), 300000000.0, 0.3) if (E != None) & (Rho!=None): memberType = MemberType(A[index].item(), E[index].item(), Rho[index].item()) elif (E != None) & (Rho==None): memberType = MemberType(A[index].item(), E[index].item(), 0.3) elif (E == None) & (Rho!=None): memberType = MemberType(A[index].item(), 300000000.0, Rho[index].item()) truss.AddNewMember(jointID0, jointID1, memberType) index += 1 # Do direct stiffness method: truss.Solve() # Dump all the structural analysis results into a .json file: # truss.DumpIntoJSON(TEST_OUTPUT_FILE) # Get result of structural analysis: displace, stress, resistance = truss.GetDisplacements(), truss.GetInternalStresses(), truss.GetResistances() return displace, stress, resistance, truss, truss.weight def Truss120bar(A, E, Rho): # -------------------- Global variables -------------------- TEST_OUTPUT_FILE = f"./test_output.json" TRUSS_DIMENSION = 3 # ---------------------------------------------------------- # Truss object: truss = Truss(dim=TRUSS_DIMENSION) init_truss = truss # Truss settings: joints = [ (0.0, 0.0, 275.59), (273.26, 0.0, 230.31), (236.65010183813573, 136.62999999999997, 230.31), (136.62999999999997, 236.65010183813573, 230.31), (0.0, 273.26, 230.31), (-136.62999999999997, 236.65010183813573, 230.31), (-236.65010183813573, 136.62999999999997, 230.31), (-273.26, 0.0, 230.31), (-236.65010183813573, -136.62999999999997, 230.31), (-136.62999999999997, -236.65010183813573, 230.31), (0.0, -273.26, 230.31), (136.62999999999997, -236.65010183813573, 230.31), (236.65010183813573, -136.62999999999997, 230.31), (492.12, 0.0, 118.11), (475.3514176333763, 127.37002847585251, 118.11), (426.18842171039796, 246.05999999999997, 118.11), (347.9813891575237, 347.9813891575237, 118.11), (246.05999999999997, 426.18842171039796, 118.11), (127.37002847585251, 475.3514176333763, 118.11), (0.0, 492.12, 118.11), (-127.37002847585251, 475.3514176333763, 118.11), (-246.05999999999997, 426.18842171039796, 118.11), (-347.9813891575237, 347.9813891575237, 118.11), (-426.18842171039796, 246.05999999999997, 118.11), (-475.3514176333763, 127.37002847585251, 118.11), (-492.12, 0.0, 118.11), (-475.3514176333763, -127.37002847585251, 118.11), (-426.18842171039796, -246.05999999999997, 118.11), (-347.9813891575237, -347.9813891575237, 118.11), (-246.05999999999997, -426.18842171039796, 118.11), (-127.37002847585251, -475.3514176333763, 118.11), (0.0, -492.12, 118.11), (127.37002847585251, -475.3514176333763, 118.11), (246.05999999999997, -426.18842171039796, 118.11), (347.9813891575237, -347.9813891575237, 118.11), (426.18842171039796, -246.05999999999997, 118.11), (475.3514176333763, -127.37002847585251, 118.11), (625.59, 0.0, 0.0), (541.7768323535071, 312.79499999999996, 0.0), (312.79499999999996, 541.7768323535071, 0.0), (0.0, 625.59, 0.0), (-312.79499999999996, 541.7768323535071, 0.0), (-541.7768323535071, 312.79499999999996, 0.0), (-625.59, 0.0, 0.0), (-541.7768323535071, -312.79499999999996, 0.0), (-312.79499999999996, -541.7768323535071, 0.0), (0.0, -625.59, 0.0), (312.79499999999996, -541.7768323535071, 0.0), (541.7768323535071, -312.79499999999996, 0.0) ] supports = [ SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.PIN, SupportType.PIN, SupportType.PIN, SupportType.PIN, SupportType.PIN, SupportType.PIN, SupportType.PIN, SupportType.PIN, SupportType.PIN, SupportType.PIN, SupportType.PIN, SupportType.PIN ] # print(len(joints)) # print(len(supports)) forces = [ (0, (0.0, 0.0, -13490.0)), (1, (0.0, 0.0, -6744.0)), (2, (0.0, 0.0, -6744.0)), (3, (0.0, 0.0, -6744.0)), (4, (0.0, 0.0, -6744.0)), (5, (0.0, 0.0, -6744.0)), (6, (0.0, 0.0, -6744.0)), (7, (0.0, 0.0, -6744.0)), (8, (0.0, 0.0, -6744.0)), (9, (0.0, 0.0, -6744.0)), (10, (0.0, 0.0, -6744.0)), (11, (0.0, 0.0, -6744.0)), (12, (0.0, 0.0, -6744.0)), (13, (0.0, 0.0, -6744.0)), (14, (0.0, 0.0, -2248.0)), (15, (0.0, 0.0, -2248.0)), (16, (0.0, 0.0, -2248.0)), (17, (0.0, 0.0, -2248.0)), (18, (0.0, 0.0, -2248.0)), (19, (0.0, 0.0, -2248.0)), (20, (0.0, 0.0, -2248.0)), (21, (0.0, 0.0, -2248.0)), (22, (0.0, 0.0, -2248.0)), (23, (0.0, 0.0, -2248.0)), (24, (0.0, 0.0, -2248.0)), (25, (0.0, 0.0, -2248.0)), (26, (0.0, 0.0, -2248.0)), (27, (0.0, 0.0, -2248.0)), (28, (0.0, 0.0, -2248.0)), (29, (0.0, 0.0, -2248.0)), (30, (0.0, 0.0, -2248.0)), (31, (0.0, 0.0, -2248.0)), (32, (0.0, 0.0, -2248.0)), (33, (0.0, 0.0, -2248.0)), (34, (0.0, 0.0, -2248.0)), (35, (0.0, 0.0, -2248.0)), (36, (0.0, 0.0, -2248.0)) ] members = [ (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (0, 10), (0, 11), (0, 12), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), (10, 11), (11, 12), (12, 1), (1, 13), (2, 15), (3, 17), (4, 19), (5, 21), (6, 23), (7, 25), (8, 27), (9, 29), (10, 31), (11, 33), (12, 35), (1, 14), (2, 14), (2, 16), (3, 16), (3, 18), (4, 18), (4, 20), (5, 20), (5, 22), (6, 22), (6, 24), (7, 24), (7, 26), (8, 26), (8, 28), (9, 28), (9, 30), (10, 30), (10, 32), (11, 32), (11, 34), (12, 34), (12, 36), (1, 36), (13, 14), (14, 15), (15, 16), (16, 17), (17, 18), (18, 19), (19, 20), (20, 21), (21, 22), (22, 23), (23, 24), (24, 25), (25, 26), (26, 27), (27, 28), (28, 29), (29, 30), (30, 31), (31, 32), (32, 33), (33, 34), (34, 35), (35, 36), (36, 13), (13, 37), (15, 38), (17, 39), (19, 40), (21, 41), (23, 42), (25, 43), (27, 44), (29, 45), (31, 46), (33, 47), (35, 48), (14, 37), (14, 38), (16, 38), (16, 39), (18, 39), (18, 40), (20, 40), (20, 41), (22, 41), (22, 42), (24, 42), (24, 43), (26, 43), (26, 44), (28, 44), (28, 45), (30, 45), (30, 46), (32, 46), (32, 47), (34, 47), (34, 48), (36, 48), (36, 37) ] # memberType : Member type which contain the information about # 1) cross-sectional area, # 2) Young's modulus, # 3) density of this member. # Read data in this [.py]: for joint, support in zip(joints, supports): truss.AddNewJoint(joint, support) for jointID, force in forces: truss.AddExternalForce(jointID, force) index = 0 for jointID0, jointID1 in members: # memberType = MemberType(A[index].item(), 30450000, 0.288) # print(A.shape) memberType = MemberType(A[index].item(), 30450000, 0.288) if (E != None) & (Rho!=None): memberType = MemberType(A[index].item(), E[index].item(), Rho[index].item()) elif (E != None) & (Rho==None): memberType = MemberType(A[index].item(), E[index].item(), 0.288) elif (E == None) & (Rho!=None): memberType = MemberType(A[index].item(), 30450000, Rho[index].item()) truss.AddNewMember(jointID0, jointID1, memberType) index += 1 # Do direct stiffness method: truss.Solve() # Dump all the structural analysis results into a .json file: # truss.DumpIntoJSON(TEST_OUTPUT_FILE) # Get result of structural analysis: displace, forces, stress, resistance = truss.GetDisplacements(), truss.GetInternalForces(), truss.GetInternalStresses(), truss.GetResistances() return displace, forces, stress, resistance, truss, truss.weight def Truss72bar_4forces(A, E, Rho): # -------------------- Global variables -------------------- TEST_OUTPUT_FILE = f"./test_output.json" TRUSS_DIMENSION = 3 # ---------------------------------------------------------- # Truss object: truss = Truss(dim=TRUSS_DIMENSION) init_truss = truss # Truss settings: joints = [ (0.0, 0.0, 0.0), (120.0, 0.0, 0.0), (120.0, 120.0, 0.0), (0.0, 120.0, 0.0), (0.0, 0.0, 60.0), (120.0, 0.0, 60.0), (120.0, 120.0, 60.0), (0.0, 120.0, 60.0), (0.0, 0.0, 120.0), (120.0, 0.0, 120.0), (120.0, 120.0, 120.0), (0.0, 120.0, 120.0), (0.0, 0.0, 180.0), (120.0, 0.0, 180.0), (120.0, 120.0, 180.0), (0.0, 120.0, 180.0), (0.0, 0.0, 240.0), (120.0, 0.0, 240.0), (120.0, 120.0, 240.0), (0.0, 120.0, 240.0) ] supports = supports = [ SupportType.PIN, SupportType.PIN, SupportType.PIN, SupportType.PIN, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO ] forces = [ (0, (0.0, 0.0, 0.0)), (1, (0.0, 0.0, 0.0)), (2, (0.0, 0.0, 0.0)), (3, (0.0, 0.0, 0.0)), (4, (0.0, 0.0, 0.0)), (5, (0.0, 0.0, 0.0)), (6, (0.0, 0.0, 0.0)), (7, (0.0, 0.0, 0.0)), (8, (0.0, 0.0, 0.0)), (9, (0.0, 0.0, 0.0)), (10, (0.0, 0.0, 0.0)), (11, (0.0, 0.0, 0.0)), (12, (0.0, 0.0, 0.0)), (13, (0.0, 0.0, 0.0)), (14, (0.0, 0.0, 0.0)), (15, (0.0, 0.0, 0.0)), (16, (0.0, 0.0, -5000.0)), (17, (0.0, 0.0, -5000.0)), (18, (0.0, 0.0, -5000.0)), (19, (0.0, 0.0, -5000.0)) ] members = [ (0, 4), (1, 5), (2, 6), (3, 7), (1, 4), (0, 5), (1, 6), (2, 5), (2, 7), (3, 6), (0, 7), (3, 4), (4, 5), (5, 6), (6, 7), (7, 4), (4, 6), (5, 7), (4, 8), (5, 9), (6, 10), (7, 11), (5, 8), (4, 9), (5, 10), (6, 9), (6, 11), (7, 10), (4, 11), (7, 8), (8, 9), (9, 10), (10, 11), (11, 8), (8, 10), (9, 11), (8, 12), (9, 13), (10, 14), (11, 15), (9, 12), (8, 13), (9, 14), (10, 13), (10, 15), (11, 14), (8, 15), (11, 12), (12, 13), (13, 14), (14, 15), (15, 12), (12, 14), (13, 15), (12, 16), (13, 17), (14, 18), (15, 19), (13, 16), (12, 17), (13, 18), (14, 17), (14, 19), (15, 18), (12, 19), (15, 16), (16, 17), (17, 18), (18, 19), (19, 16), (16, 18), (17, 19) ] # memberType : Member type which contain the information about # 1) cross-sectional area, # 2) Young's modulus, # 3) density of this member. # Read data in this [.py]: for joint, support in zip(joints, supports): truss.AddNewJoint(joint, support) for jointID, force in forces: truss.AddExternalForce(jointID, force) index = 0 for jointID0, jointID1 in members: # memberType = MemberType(A[index].item(), 10000000.0, 0.1) memberType = MemberType(A[index].item(), 10000000.0, 0.1) if (E != None) & (Rho!=None): memberType = MemberType(A[index].item(), E[index].item(), Rho[index].item()) elif (E != None) & (Rho==None): memberType = MemberType(A[index].item(), E[index].item(), 0.1) elif (E == None) & (Rho!=None): memberType = MemberType(A[index].item(), 10000000.0, Rho[index].item()) truss.AddNewMember(jointID0, jointID1, memberType) index += 1 # Do direct stiffness method: truss.Solve() # Dump all the structural analysis results into a .json file: # truss.DumpIntoJSON(TEST_OUTPUT_FILE) # Get result of structural analysis: displace, forces, stress, resistance = truss.GetDisplacements(), truss.GetInternalForces(), truss.GetInternalStresses(), truss.GetResistances() return displace, forces, stress, resistance, truss, truss.weight def Truss72bar_single(A, E, Rho): # -------------------- Global variables -------------------- TEST_OUTPUT_FILE = f"./test_output.json" TRUSS_DIMENSION = 3 # ---------------------------------------------------------- # Truss object: truss = Truss(dim=TRUSS_DIMENSION) init_truss = truss # Truss settings: joints = [ (0.0, 0.0, 0.0), (120.0, 0.0, 0.0), (120.0, 120.0, 0.0), (0.0, 120.0, 0.0), (0.0, 0.0, 60.0), (120.0, 0.0, 60.0), (120.0, 120.0, 60.0), (0.0, 120.0, 60.0), (0.0, 0.0, 120.0), (120.0, 0.0, 120.0), (120.0, 120.0, 120.0), (0.0, 120.0, 120.0), (0.0, 0.0, 180.0), (120.0, 0.0, 180.0), (120.0, 120.0, 180.0), (0.0, 120.0, 180.0), (0.0, 0.0, 240.0), (120.0, 0.0, 240.0), (120.0, 120.0, 240.0), (0.0, 120.0, 240.0) ] supports = [ SupportType.PIN, SupportType.PIN, SupportType.PIN, SupportType.PIN, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO, SupportType.NO ] forces = [ (0, (0.0, 0.0, 0.0)), (1, (0.0, 0.0, 0.0)), (2, (0.0, 0.0, 0.0)), (3, (0.0, 0.0, 0.0)), (4, (0.0, 0.0, 0.0)), (5, (0.0, 0.0, 0.0)), (6, (0.0, 0.0, 0.0)), (7, (0.0, 0.0, 0.0)), (8, (0.0, 0.0, 0.0)), (9, (0.0, 0.0, 0.0)), (10, (0.0, 0.0, 0.0)), (11, (0.0, 0.0, 0.0)), (12, (0.0, 0.0, 0.0)), (13, (0.0, 0.0, 0.0)), (14, (0.0, 0.0, 0.0)), (15, (0.0, 0.0, 0.0)), (16, (5000.0, 5000.0, -5000.0)), (17, (0.0, 0.0, 0.0)), (18, (0.0, 0.0, 0.0)), (19, (0.0, 0.0, 0.0)) ] members = [ (0, 4), (1, 5), (2, 6), (3, 7), (1, 4), (0, 5), (1, 6), (2, 5), (2, 7), (3, 6), (0, 7), (3, 4), (4, 5), (5, 6), (6, 7), (7, 4), (4, 6), (5, 7), (4, 8), (5, 9), (6, 10), (7, 11), (5, 8), (4, 9), (5, 10), (6, 9), (6, 11), (7, 10), (4, 11), (7, 8), (8, 9), (9, 10), (10, 11), (11, 8), (8, 10), (9, 11), (8, 12), (9, 13), (10, 14), (11, 15), (9, 12), (8, 13), (9, 14), (10, 13), (10, 15), (11, 14), (8, 15), (11, 12), (12, 13), (13, 14), (14, 15), (15, 12), (12, 14), (13, 15), (12, 16), (13, 17), (14, 18), (15, 19), (13, 16), (12, 17), (13, 18), (14, 17), (14, 19), (15, 18), (12, 19), (15, 16), (16, 17), (17, 18), (18, 19), (19, 16), (16, 18), (17, 19) ] # memberType : Member type which contain the information about # 1) cross-sectional area, # 2) Young's modulus, # 3) density of this member. # Read data in this [.py]: for joint, support in zip(joints, supports): truss.AddNewJoint(joint, support) for jointID, force in forces: truss.AddExternalForce(jointID, force) index = 0 for jointID0, jointID1 in members: # memberType = MemberType(A[index].item(), 10000000.0, 0.1) memberType = MemberType(A[index].item(), 10000000.0, 0.1) if (E != None) & (Rho!=None): memberType = MemberType(A[index].item(), E[index].item(), Rho[index].item()) elif (E != None) & (Rho==None): memberType = MemberType(A[index].item(), E[index].item(), 0.1) elif (E == None) & (Rho!=None): memberType = MemberType(A[index].item(), 10000000.0, Rho[index].item()) truss.AddNewMember(jointID0, jointID1, memberType) index += 1 # Do direct stiffness method: truss.Solve() # Dump all the structural analysis results into a .json file: # truss.DumpIntoJSON(TEST_OUTPUT_FILE) # Get result of structural analysis: displace, stress, resistance = truss.GetDisplacements(), truss.GetInternalStresses(), truss.GetResistances() return displace, stress, resistance, truss, truss.weight def Truss942bar(A, E, Rho): # -------------------- Global variables -------------------- TEST_OUTPUT_FILE = f"./test_output.json" TRUSS_DIMENSION = 3 # ---------------------------------------------------------- # Truss object: truss = Truss(dim=TRUSS_DIMENSION) init_truss = truss # Truss settings: joints = [ [24.5, 24.5, 312.0], [38.5, 24.5, 312.0], [24.5, 38.5, 312.0], [38.5, 38.5, 312.0], [24.5, 24.5, 300.0], [38.5, 24.5, 300.0], [24.5, 38.5, 300.0], [38.5, 38.5, 300.0], [24.5, 24.5, 288.0], [38.5, 24.5, 288.0], [24.5, 38.5, 288.0], [38.5, 38.5, 288.0], [24.5, 24.5, 276.0], [38.5, 24.5, 276.0], [24.5, 38.5, 276.0], [38.5, 38.5, 276.0], [24.5, 24.5, 264.0], [38.5, 24.5, 264.0], [24.5, 38.5, 264.0], [38.5, 38.5, 264.0], [24.5, 24.5, 252.0], [38.5, 24.5, 252.0], [24.5, 38.5, 252.0], [38.5, 38.5, 252.0], [21.6005, 21.6005, 240.0], [31.5, 17.5, 240.0], [41.3995, 21.6005, 240.0], [17.5, 31.5, 240.0], [45.5, 31.5, 240.0], [21.6005, 41.3995, 240.0], [31.5, 45.5, 240.0], [41.3995, 41.3995, 240.0], [21.6005, 21.6005, 228.0], [31.5, 17.5, 228.0], [41.3995, 21.6005, 228.0], [17.5, 31.5, 228.0], [45.5, 31.5, 228.0], [21.6005, 41.3995, 228.0], [31.5, 45.5, 228.0], [41.3995, 41.3995, 228.0], [21.6005, 21.6005, 216.0], [31.5, 17.5, 216.0], [41.3995, 21.6005, 216.0], [17.5, 31.5, 216.0], [45.5, 31.5, 216.0], [21.6005, 41.3995, 216.0], [31.5, 45.5, 216.0], [41.3995, 41.3995, 216.0], [21.6005, 21.6005, 204.0], [31.5, 17.5, 204.0], [41.3995, 21.6005, 204.0], [17.5, 31.5, 204.0], [45.5, 31.5, 204.0], [21.6005, 41.3995, 204.0], [31.5, 45.5, 204.0], [41.3995, 41.3995, 204.0], [21.6005, 21.6005, 192.0], [31.5, 17.5, 192.0], [41.3995, 21.6005, 192.0], [17.5, 31.5, 192.0], [45.5, 31.5, 192.0], [21.6005, 41.3995, 192.0], [31.5, 45.5, 192.0], [41.3995, 41.3995, 192.0], [21.6005, 21.6005, 180.0], [31.5, 17.5, 180.0], [41.3995, 21.6005, 180.0], [17.5, 31.5, 180.0], [45.5, 31.5, 180.0], [21.6005, 41.3995, 180.0], [31.5, 45.5, 180.0], [41.3995, 41.3995, 180.0], [21.6005, 21.6005, 168.0], [31.5, 17.5, 168.0], [41.3995, 21.6005, 168.0], [17.5, 31.5, 168.0], [45.5, 31.5, 168.0], [21.6005, 41.3995, 168.0], [31.5, 45.5, 168.0], [41.3995, 41.3995, 168.0], [21.6005, 21.6005, 156.0], [31.5, 17.5, 156.0], [41.3995, 21.6005, 156.0], [17.5, 31.5, 156.0], [45.5, 31.5, 156.0], [21.6005, 41.3995, 156.0], [31.5, 45.5, 156.0], [41.3995, 41.3995, 156.0], [7.0, 24.5, 144.0], [11.1199, 11.1199, 144.0], [24.5, 7.0, 144.0], [38.5, 7.0, 144.0], [51.8801, 11.1199, 144.0], [56.0, 24.5, 144.0], [7.0, 38.5, 144.0], [11.1199, 51.8801, 144.0], [24.5, 56.0, 144.0], [38.5, 56.0, 144.0], [51.8801, 51.8801, 144.0], [56.0, 38.5, 144.0], [7.0, 24.5, 132.0], [11.1199, 11.1199, 132.0], [24.5, 7.0, 132.0], [38.5, 7.0, 132.0], [51.8801, 11.1199, 132.0], [56.0, 24.5, 132.0], [7.0, 38.5, 132.0], [11.1199, 51.8801, 132.0], [24.5, 56.0, 132.0], [38.5, 56.0, 132.0], [51.8801, 51.8801, 132.0], [56.0, 38.5, 132.0], [7.0, 24.5, 120.0], [11.1199, 11.1199, 120.0], [24.5, 7.0, 120.0], [38.5, 7.0, 120.0], [51.8801, 11.1199, 120.0], [56.0, 24.5, 120.0], [7.0, 38.5, 120.0], [11.1199, 51.8801, 120.0], [24.5, 56.0, 120.0], [38.5, 56.0, 120.0], [51.8801, 51.8801, 120.0], [56.0, 38.5, 120.0], [7.0, 24.5, 108.0], [11.1199, 11.1199, 108.0], [24.5, 7.0, 108.0], [38.5, 7.0, 108.0], [51.8801, 11.1199, 108.0], [56.0, 24.5, 108.0], [7.0, 38.5, 108.0], [11.1199, 51.8801, 108.0], [24.5, 56.0, 108.0], [38.5, 56.0, 108.0], [51.8801, 51.8801, 108.0], [56.0, 38.5, 108.0], [7.0, 24.5, 96.0], [11.1199, 11.1199, 96.0], [24.5, 7.0, 96.0], [38.5, 7.0, 96.0], [51.8801, 11.1199, 96.0], [56.0, 24.5, 96.0], [7.0, 38.5, 96.0], [11.1199, 51.8801, 96.0], [24.5, 56.0, 96.0], [38.5, 56.0, 96.0], [51.8801, 51.8801, 96.0], [56.0, 38.5, 96.0], [7.0, 24.5, 84.0], [11.1199, 11.1199, 84.0], [24.5, 7.0, 84.0], [38.5, 7.0, 84.0], [51.8801, 11.1199, 84.0], [56.0, 24.5, 84.0], [7.0, 38.5, 84.0], [11.1199, 51.8801, 84.0], [24.5, 56.0, 84.0], [38.5, 56.0, 84.0], [51.8801, 51.8801, 84.0], [56.0, 38.5, 84.0], [7.0, 24.5, 72.0], [11.1199, 11.1199, 72.0], [24.5, 7.0, 72.0], [38.5, 7.0, 72.0], [51.8801, 11.1199, 72.0], [56.0, 24.5, 72.0], [7.0, 38.5, 72.0], [11.1199, 51.8801, 72.0], [24.5, 56.0, 72.0], [38.5, 56.0, 72.0], [51.8801, 51.8801, 72.0], [56.0, 38.5, 72.0], [7.0, 24.5, 60.0], [11.1199, 11.1199, 60.0], [24.5, 7.0, 60.0], [38.5, 7.0, 60.0], [51.8801, 11.1199, 60.0], [56.0, 24.5, 60.0], [7.0, 38.5, 60.0], [11.1199, 51.8801, 60.0], [24.5, 56.0, 60.0], [38.5, 56.0, 60.0], [51.8801, 51.8801, 60.0], [56.0, 38.5, 60.0], [7.0, 24.5, 48.0], [11.1199, 11.1199, 48.0], [24.5, 7.0, 48.0], [38.5, 7.0, 48.0], [51.8801, 11.1199, 48.0], [56.0, 24.5, 48.0], [7.0, 38.5, 48.0], [11.1199, 51.8801, 48.0], [24.5, 56.0, 48.0], [38.5, 56.0, 48.0], [51.8801, 51.8801, 48.0], [56.0, 38.5, 48.0], [7.0, 24.5, 36.0], [11.1199, 11.1199, 36.0], [24.5, 7.0, 36.0], [38.5, 7.0, 36.0], [51.8801, 11.1199, 36.0], [56.0, 24.5, 36.0], [7.0, 38.5, 36.0], [11.1199, 51.8801, 36.0], [24.5, 56.0, 36.0], [38.5, 56.0, 36.0], [51.8801, 51.8801, 36.0], [56.0, 38.5, 36.0], [7.0, 24.5, 24.0], [11.1199, 11.1199, 24.0], [24.5, 7.0, 24.0], [38.5, 7.0, 24.0], [51.8801, 11.1199, 24.0], [56.0, 24.5, 24.0], [7.0, 38.5, 24.0], [11.1199, 51.8801, 24.0], [24.5, 56.0, 24.0], [38.5, 56.0, 24.0], [51.8801, 51.8801, 24.0], [56.0, 38.5, 24.0], [7.0, 24.5, 12.0], [11.1199, 11.1199, 12.0], [24.5, 7.0, 12.0], [38.5, 7.0, 12.0], [51.8801, 11.1199, 12.0], [56.0, 24.5, 12.0], [7.0, 38.5, 12.0], [11.1199, 51.8801, 12.0], [24.5, 56.0, 12.0], [38.5, 56.0, 12.0], [51.8801, 51.8801, 12.0], [56.0, 38.5, 12.0], [7.0, 24.5, 0.0], [11.1199, 11.1199, 0.0], [24.5, 7.0, 0.0], [38.5, 7.0, 0.0], [51.8801, 11.1199, 0.0], [56.0, 24.5, 0.0], [7.0, 38.5, 0.0], [11.1199, 51.8801, 0.0], [24.5, 56.0, 0.0], [38.5, 56.0, 0.0], [51.8801, 51.8801, 0.0], [56.0, 38.5, 0.0] ] supports = [] for ii in range(244-12): supports.append(SupportType.NO) for ii in range(12): supports.append(SupportType.PIN) forces = [ (0, (1.5, -1.0, -3.0)), (1, (-1.0, -1.0, -3.0)), (2, (1.5, -1.0, -3.0)), (3, (-1.0, 1.0, -3.0)), (4, (1.5, -1.0, -3.0)), (5, (-1.0, -1.0, -3.0)), (6, (1.5, -1.0, -3.0)), (7, (-1.0, 1.0, -3.0)), (8, (1.5, -1.0, -3.0)), (9, (-1.0, -1.0, -3.0)), (10, (1.5, -1.0, -3.0)), (11, (-1.0, 1.0, -3.0)), (12, (1.5, -1.0, -3.0)), (13, (-1.0, -1.0, -3.0)), (14, (1.5, -1.0, -3.0)), (15, (-1.0, 1.0, -3.0)), (16, (1.5, -1.0, -3.0)), (17, (-1.0, -1.0, -3.0)), (18, (1.5, -1.0, -3.0)), (19, (-1.0, 1.0, -3.0)), (20, (1.5, -1.0, -3.0)), (21, (-1.0, -1.0, -3.0)), (22, (1.5, -1.0, -3.0)), (23, (-1.0, 1.0, -3.0)), (24, (1.5, -1.0, -3.0)), (25, (0.0, -1.0, -3.0)), (26, (-1.0, -1.0, -3.0)), (27, (1.5, 0.0, -3.0)), (28, (-1.0, 0.0, -3.0)), (29, (1.5, 1.0, -3.0)), (30, (0.0, 1.0, -3.0)), (31, (-1.0, 1.0, -3.0)), (32, (1.5, -1.0, -6.0)), (33, (0.0, -1.0, -6.0)), (34, (-1.0, -1.0, -6.0)), (35, (1.5, 0.0, -6.0)), (36, (-1.0, 0.0, -6.0)), (37, (1.5, 1.0, -6.0)), (38, (0.0, 1.0, -6.0)), (39, (-1.0, 1.0, -6.0)), (40, (1.5, -1.0, -6.0)), (41, (0.0, -1.0, -6.0)), (42, (-1.0, -1.0, -6.0)), (43, (1.5, 0.0, -6.0)), (44, (-1.0, 0.0, -6.0)), (45, (1.5, 1.0, -6.0)), (46, (0.0, 1.0, -6.0)), (47, (-1.0, 1.0, -6.0)), (48, (1.5, -1.0, -6.0)), (49, (0.0, -1.0, -6.0)), (50, (-1.0, -1.0, -6.0)), (51, (1.5, 0.0, -6.0)), (52, (-1.0, 0.0, -6.0)), (53, (1.5, 1.0, -6.0)), (54, (0.0, 1.0, -6.0)), (55, (-1.0, 1.0, -6.0)), (56, (1.5, -1.0, -6.0)), (57, (0.0, -1.0, -6.0)), (58, (-1.0, -1.0, -6.0)), (59, (1.5, 0.0, -6.0)), (60, (-1.0, 0.0, -6.0)), (61, (1.5, 1.0, -6.0)), (62, (0.0, 1.0, -6.0)), (63, (-1.0, 1.0, -6.0)), (64, (1.5, -1.0, -6.0)), (65, (0.0, -1.0, -6.0)), (66, (-1.0, -1.0, -6.0)), (67, (1.5, 0.0, -6.0)), (68, (-1.0, 0.0, -6.0)), (69, (1.5, 1.0, -6.0)), (70, (0.0, 1.0, -6.0)), (71, (-1.0, 1.0, -6.0)), (72, (1.5, -1.0, -6.0)), (73, (0.0, -1.0, -6.0)), (74, (-1.0, -1.0, -6.0)), (75, (1.5, 0.0, -6.0)), (76, (-1.0, 0.0, -6.0)), (77, (1.5, 1.0, -6.0)), (78, (0.0, 1.0, -6.0)), (79, (-1.0, 1.0, -6.0)), (80, (1.5, -1.0, -6.0)), (81, (0.0, -1.0, -6.0)), (82, (-1.0, -1.0, -6.0)), (83, (1.5, 0.0, -6.0)), (84, (-1.0, 0.0, -6.0)), (85, (1.5, 1.0, -6.0)), (86, (0.0, 1.0, -6.0)), (87, (-1.0, 1.0, -6.0)), (88, (1.5, -1.0, -6.0)), (89, (1.5, -1.0, -6.0)), (90, (1.5, -1.0, -6.0)), (91, (-1.0, -1.0, -6.0)), (92, (-1.0, -1.0, -6.0)), (93, (-1.0, -1.0, -6.0)), (94, (1.5, 1.0, -6.0)), (95, (1.5, 1.0, -6.0)), (96, (1.5, 1.0, -6.0)), (97, (-1.0, 1.0, -6.0)), (98, (-1.0, 1.0, -6.0)), (99, (-1.0, 1.0, -6.0)), (100, (1.5, -1.0, -9.0)), (101, (1.5, -1.0, -9.0)), (102, (1.5, -1.0, -9.0)), (103, (-1.0, -1.0, -9.0)), (104, (-1.0, -1.0, -9.0)), (105, (-1.0, -1.0, -9.0)), (106, (1.5, 1.0, -9.0)), (107, (1.5, 1.0, -9.0)), (108, (1.5, 1.0, -9.0)), (109, (-1.0, 1.0, -9.0)), (110, (-1.0, 1.0, -9.0)), (111, (-1.0, 1.0, -9.0)), (112, (1.5, -1.0, -9.0)), (113, (1.5, -1.0, -9.0)), (114, (1.5, -1.0, -9.0)), (115, (-1.0, -1.0, -9.0)), (116, (-1.0, -1.0, -9.0)), (117, (-1.0, -1.0, -9.0)), (118, (1.5, 1.0, -9.0)), (119, (1.5, 1.0, -9.0)), (120, (1.5, 1.0, -9.0)), (121, (-1.0, 1.0, -9.0)), (122, (-1.0, 1.0, -9.0)), (123, (-1.0, 1.0, -9.0)), (124, (1.5, -1.0, -9.0)), (125, (1.5, -1.0, -9.0)), (126, (1.5, -1.0, -9.0)), (127, (-1.0, -1.0, -9.0)), (128, (-1.0, -1.0, -9.0)), (129, (-1.0, -1.0, -9.0)), (130, (1.5, 1.0, -9.0)), (131, (1.5, 1.0, -9.0)), (132, (1.5, 1.0, -9.0)), (133, (-1.0, 1.0, -9.0)), (134, (-1.0, 1.0, -9.0)), (135, (-1.0, 1.0, -9.0)), (136, (1.5, -1.0, -9.0)), (137, (1.5, -1.0, -9.0)), (138, (1.5, -1.0, -9.0)), (139, (-1.0, -1.0, -9.0)), (140, (-1.0, -1.0, -9.0)), (141, (-1.0, -1.0, -9.0)), (142, (1.5, 1.0, -9.0)), (143, (1.5, 1.0, -9.0)), (144, (1.5, 1.0, -9.0)), (145, (-1.0, 1.0, -9.0)), (146, (-1.0, 1.0, -9.0)), (147, (-1.0, 1.0, -9.0)), (148, (1.5, -1.0, -9.0)), (149, (1.5, -1.0, -9.0)), (150, (1.5, -1.0, -9.0)), (151, (-1.0, -1.0, -9.0)), (152, (-1.0, -1.0, -9.0)), (153, (-1.0, -1.0, -9.0)), (154, (1.5, 1.0, -9.0)), (155, (1.5, 1.0, -9.0)), (156, (1.5, 1.0, -9.0)), (157, (-1.0, 1.0, -9.0)), (158, (-1.0, 1.0, -9.0)), (159, (-1.0, 1.0, -9.0)), (160, (1.5, -1.0, -9.0)), (161, (1.5, -1.0, -9.0)), (162, (1.5, -1.0, -9.0)), (163, (-1.0, -1.0, -9.0)), (164, (-1.0, -1.0, -9.0)), (165, (-1.0, -1.0, -9.0)), (166, (1.5, 1.0, -9.0)), (167, (1.5, 1.0, -9.0)), (168, (1.5, 1.0, -9.0)), (169, (-1.0, 1.0, -9.0)), (170, (-1.0, 1.0, -9.0)), (171, (-1.0, 1.0, -9.0)), (172, (1.5, -1.0, -9.0)), (173, (1.5, -1.0, -9.0)), (174, (1.5, -1.0, -9.0)), (175, (-1.0, -1.0, -9.0)), (176, (-1.0, -1.0, -9.0)), (177, (-1.0, -1.0, -9.0)), (178, (1.5, 1.0, -9.0)), (179, (1.5, 1.0, -9.0)), (180, (1.5, 1.0, -9.0)), (181, (-1.0, 1.0, -9.0)), (182, (-1.0, 1.0, -9.0)), (183, (-1.0, 1.0, -9.0)), (184, (1.5, -1.0, -9.0)), (185, (1.5, -1.0, -9.0)), (186, (1.5, -1.0, -9.0)), (187, (-1.0, -1.0, -9.0)), (188, (-1.0, -1.0, -9.0)), (189, (-1.0, -1.0, -9.0)), (190, (1.5, 1.0, -9.0)), (191, (1.5, 1.0, -9.0)), (192, (1.5, 1.0, -9.0)), (193, (-1.0, 1.0, -9.0)), (194, (-1.0, 1.0, -9.0)), (195, (-1.0, 1.0, -9.0)), (196, (1.5, -1.0, -9.0)), (197, (1.5, -1.0, -9.0)), (198, (1.5, -1.0, -9.0)), (199, (-1.0, -1.0, -9.0)), (200, (-1.0, -1.0, -9.0)), (201, (-1.0, -1.0, -9.0)), (202, (1.5, 1.0, -9.0)), (203, (1.5, 1.0, -9.0)), (204, (1.5, 1.0, -9.0)), (205, (-1.0, 1.0, -9.0)), (206, (-1.0, 1.0, -9.0)), (207, (-1.0, 1.0, -9.0)), (208, (1.5, -1.0, -9.0)), (209, (1.5, -1.0, -9.0)), (210, (1.5, -1.0, -9.0)), (211, (-1.0, -1.0, -9.0)), (212, (-1.0, -1.0, -9.0)), (213, (-1.0, -1.0, -9.0)), (214, (1.5, 1.0, -9.0)), (215, (1.5, 1.0, -9.0)), (216, (1.5, 1.0, -9.0)), (217, (-1.0, 1.0, -9.0)), (218, (-1.0, 1.0, -9.0)), (219, (-1.0, 1.0, -9.0)), (220, (1.5, -1.0, -9.0)), (221, (1.5, -1.0, -9.0)), (222, (1.5, -1.0, -9.0)), (223, (-1.0, -1.0, -9.0)), (224, (-1.0, -1.0, -9.0)), (225, (-1.0, -1.0, -9.0)), (226, (1.5, 1.0, -9.0)), (227, (1.5, 1.0, -9.0)), (228, (1.5, 1.0, -9.0)), (229, (-1.0, 1.0, -9.0)), (230, (-1.0, 1.0, -9.0)), (231, (-1.0, 1.0, -9.0)) ] members = [ (0, 3), (1, 2), (0, 1), (2, 3), (0, 2), (1, 3), (4, 5), (6, 7), (4, 6), (5, 7), (1, 5), (0, 4), (3, 7), (2, 6), (5, 9), (4, 8), (7, 11), (6, 10), (1, 4), (0, 5), (1, 7), (3, 5), (3, 6), (2, 7), (0, 6), (2, 4), (5, 8), (4, 9), (5, 11), (7, 9), (7, 10), (6, 11), (6, 8), (4, 10), (8, 9), (10, 11), (8, 10), (9, 11), (12, 13), (14, 15), (12, 14), (13, 15), (16, 17), (18, 19), (16, 18), (17, 19), (9, 13), (8, 12), (11, 15), (10, 14), (13, 17), (12, 16), (15, 19), (16, 18), (17, 21), (16, 20), (19, 23), (18, 22), (8, 13), (9, 12), (9, 15), (11, 13), (11, 14), (10, 15), (10, 12), (8, 14), (12, 17), (13, 16), (13, 19), (15, 17), (15, 18), (14, 19), (14, 16), (12, 18), (16, 21), (17, 20), (17, 23), (19, 21), (19, 22), (18, 23), (18, 20), (16, 22), (20, 21), (22, 23), (20, 22), (21, 23), (21, 24), (20, 26), (21, 31), (23, 26), (23, 29), (22, 31), (22, 24), (20, 29), (21, 26), (20, 24), (23, 31), (22, 29), (21, 25), (20, 25), (21, 28), (23, 28), (23, 30), (22, 30), (22, 27), (20, 27), (24, 25), (25, 26), (24, 27), (27, 29), (29, 30), (30, 31), (26, 28), (28, 31), (32, 33), (33, 34), (32, 35), (35, 37), (37, 38), (38, 39), (34, 36), (36, 39), (24, 32), (26, 34), (29, 37), (31, 39), (32, 40), (34, 42), (37, 45), (39, 47), (24, 33), (25, 32), (25, 34), (26, 33), (27, 32), (24, 35), (26, 36), (28, 34), (28, 39), (31, 36), (31, 38), (30, 39), (30, 37), (29, 38), (29, 35), (27, 37), (32, 41), (33, 40), (33, 42), (34, 41), (34, 44), (36, 42), (36, 47), (39, 44), (39, 46), (38, 47), (38, 45), (37, 46), (37, 43), (35, 45), (35, 40), (32, 43), (25, 33), (27, 35), (30, 38), (28, 36), (33, 41), (35, 43), (38, 46), (36, 44), (40, 41), (41, 42), (40, 43), (42, 44), (43, 45), (45, 46), (46, 47), (44, 47), (48, 49), (49, 50), (48, 51), (50, 52), (51, 53), (53, 54), (54, 55), (52, 55), (42, 50), (40, 48), (45, 53), (47, 55), (48, 56), (50, 58), (53, 61), (55, 63), (40, 49), (41, 48), (41, 50), (42, 49), (42, 52), (44, 50), (44, 55), (47, 52), (47, 54), (46, 55), (46, 53), (45, 54), (45, 51), (43, 53), (43, 48), (40, 51), (48, 57), (49, 56), (49, 58), (50, 57), (50, 60), (52, 58), (52, 63), (55, 60), (55, 62), (54, 63), (54, 61), (53, 62), (53, 59), (51, 61), (51, 56), (48, 59), (41, 49), (43, 51), (44, 52), (46, 54), (49, 57), (51, 59), (52, 60), (54, 62), (56, 57), (57, 58), (56, 59), (58, 60), (59, 61), (60, 63), (61, 62), (62, 63), (64, 65), (65, 66), (64, 67), (66, 68), (67, 69), (68, 71), (69, 70), (70, 71), (72, 73), (73, 74), (72, 75), (74, 76), (75, 77), (76, 79), (77, 78), (78, 79), (56, 64), (58, 66), (61, 69), (63, 71), (64, 72), (66, 74), (69, 77), (71, 79), (72, 80), (74, 82), (77, 85), (79, 87), (56, 65), (57, 64), (57, 66), (58, 65), (58, 68), (60, 66), (60, 71), (63, 68), (63, 70), (62, 71), (62, 69), (61, 70), (61, 67), (59, 69), (59, 64), (56, 67), (64, 73), (65, 72), (65, 74), (66, 73), (66, 76), (68, 74), (68, 79), (71, 76), (71, 78), (70, 79), (70, 77), (69, 78), (69, 75), (67, 77), (67, 72), (64, 75), (72, 81), (73, 80), (73, 82), (74, 81), (74, 84), (76, 82), (76, 87), (79, 84), (79, 86), (78, 87), (78, 85), (77, 86), (77, 83), (75, 85), (75, 80), (72, 83), (57, 65), (59, 67), (60, 68), (62, 70), (65, 73), (67, 75), (68, 76), (70, 78), (73, 81), (75, 83), (76, 84), (78, 86), (80, 81), (81, 82), (80, 83), (82, 84), (83, 85), (84, 87), (85, 86), (86, 87), (80, 89), (82, 92), (85, 95), (87, 98), (81, 89), (81, 92), (84, 92), (84, 98), (83, 95), (83, 89), (86, 95), (86, 98), (82, 91), (80, 90), (82, 93), (87, 99), (80, 88), (85, 94), (85, 96), (87, 97), (81, 91), (81, 90), (83, 88), (83, 94), (84, 93), (84, 99), (86, 96), (86, 97), (89, 90), (91, 92), (88, 89), (92, 93), (94, 95), (95, 96), (97, 98), (98, 99), (101, 102), (103, 104), (100, 101), (104, 105), (106, 107), (107, 108), (109, 110), (110, 111), (90, 91), (88, 94), (93, 99), (96, 97), (102, 103), (100, 106), (105, 111), (108, 109), (89, 101), (92, 104), (95, 107), (98, 110), (101, 113), (104, 116), (107, 119), (110, 122), (92, 103), (91, 104), (89, 102), (90, 101), (88, 101), (89, 100), (92, 105), (93, 104), (99, 110), (98, 111), (98, 109), (97, 110), (96, 107), (95, 108), (95, 106), (94, 107), (101, 114), (102, 113), (101, 112), (100, 113), (103, 116), (104, 115), (104, 117), (105, 116), (111, 122), (110, 123), (110, 121), (109, 122), (108, 119), (107, 120), (107, 118), (106, 119), (90, 102), (91, 103), (96, 108), (97, 109), (88, 100), (94, 106), (93, 105), (99, 111), (102, 114), (103, 115), (108, 120), (109, 121), (100, 112), (106, 118), (105, 117), (111, 123), (90, 103), (91, 102), (96, 109), (97, 108), (88, 106), (94, 100), (93, 111), (99, 105), (102, 115), (103, 114), (108, 121), (109, 120), (105, 123), (111, 117), (100, 118), (106, 112), (112, 113), (113, 114), (115, 116), (116, 117), (118, 119), (119, 120), (121, 122), (122, 123), (124, 125), (125, 126), (127, 128), (128, 129), (130, 131), (131, 132), (133, 134), (134, 135), (136, 137), (137, 138), (139, 140), (140, 141), (142, 143), (143, 144), (145, 146), (146, 147), (114, 115), (120, 121), (112, 118), (117, 123), (126, 127), (132, 133), (124, 130), (129, 135), (138, 139), (144, 145), (136, 142), (141, 147), (113, 125), (116, 128), (119, 131), (122, 134), (125, 137), (128, 140), (131, 143), (134, 146), (137, 149), (140, 152), (143, 155), (146, 158), (112, 125), (113, 124), (113, 126), (114, 125), (115, 128), (116, 127), (116, 129), (117, 128), (118, 131), (119, 130), (119, 132), (120, 131), (121, 134), (122, 133), (122, 135), (123, 134), (124, 137), (125, 136), (125, 138), (126, 137), (127, 140), (128, 139), (128, 141), (129, 140), (130, 143), (131, 142), (131, 144), (132, 143), (133, 146), (134, 145), (134, 147), (135, 146), (136, 149), (137, 148), (137, 150), (138, 149), (139, 152), (140, 151), (140, 153), (141, 152), (142, 155), (143, 154), (143, 156), (144, 155), (145, 158), (146, 157), (146, 159), (147, 158), (114, 126), (115, 127), (120, 132), (121, 133), (112, 124), (118, 130), (117, 129), (123, 135), (126, 138), (127, 139), (132, 144), (133, 145), (124, 136), (130, 142), (129, 141), (135, 147), (138, 150), (139, 151), (144, 156), (145, 157), (136, 148), (142, 154), (141, 153), (147, 159), (114, 127), (115, 126), (120, 133), (121, 132), (112, 130), (118, 124), (117, 135), (123, 129), (126, 139), (127, 138), (132, 145), (133, 144), (124, 142), (130, 136), (129, 147), (135, 141), (138, 151), (139, 150), (144, 157), (145, 156), (136, 154), (142, 148), (141, 153), (147, 153), (148, 149), (149, 150), (151, 152), (152, 153), (154, 155), (155, 156), (157, 158), (158, 159), (160, 161), (161, 162), (163, 164), (164, 165), (166, 167), (167, 168), (169, 170), (170, 171), (172, 173), (173, 174), (175, 176), (176, 177), (178, 179), (179, 180), (181, 182), (182, 183), (150, 151), (156, 157), (148, 154), (153, 159), (162, 163), (168, 169), (160, 166), (165, 171), (174, 175), (180, 181), (172, 178), (177, 183), (149, 161), (152, 164), (155, 167), (158, 170), (161, 173), (164, 176), (167, 179), (170, 182), (173, 185), (176, 188), (179, 191), (182, 194), (148, 161), (149, 160), (149, 162), (150, 161), (151, 164), (152, 163), (152, 165), (153, 164), (154, 167), (155, 166), (155, 168), (156, 167), (157, 170), (158, 169), (158, 171), (159, 170), (160, 173), (161, 172), (161, 174), (162, 173), (163, 176), (164, 175), (164, 177), (165, 176), (166, 179), (167, 178), (167, 180), (168, 179), (169, 182), (170, 181), (170, 183), (171, 182), (172, 185), (173, 184), (173, 186), (174, 185), (175, 188), (176, 187), (176, 189), (177, 188), (178, 191), (179, 190), (179, 192), (180, 191), (181, 194), (182, 193), (182, 195), (183, 194), (150, 162), (151, 163), (156, 168), (157, 169), (148, 160), (154, 166), (153, 165), (159, 171), (162, 174), (163, 175), (168, 180), (169, 181), (160, 172), (166, 178), (165, 177), (171, 183), (174, 186), (175, 187), (180, 192), (181, 193), (172, 184), (178, 190), (177, 189), (183, 195), (150, 163), (151, 162), (156, 169), (157, 168), (148, 166), (154, 160), (153, 171), (159, 165), (162, 175), (163, 174), (168, 181), (169, 180), (160, 178), (166, 172), (165, 183), (171, 177), (174, 187), (175, 186), (180, 193), (180, 192), (172, 190), (178, 184), (177, 195), (183, 189), (184, 185), (185, 186), (187, 188), (188, 189), (190, 191), (191, 192), (193, 194), (194, 195), (196, 197), (197, 198), (199, 200), (200, 201), (202, 203), (203, 204), (205, 206), (206, 207), (208, 209), (209, 210), (211, 212), (212, 213), (214, 215), (215, 216), (217, 218), (218, 219), (186, 187), (192, 193), (184, 190), (189, 195), (198, 199), (204, 205), (196, 202), (201, 207), (210, 211), (216, 217), (208, 214), (213, 219), (185, 197), (188, 200), (191, 203), (194, 206), (197, 209), (200, 212), (203, 215), (206, 218), (209, 221), (212, 224), (215, 227), (218, 230), (184, 197), (185, 196), (185, 198), (186, 197), (187, 200), (188, 199), (188, 201), (189, 200), (190, 203), (191, 202), (191, 204), (192, 203), (193, 206), (194, 205), (194, 207), (195, 206), (196, 209), (197, 208), (197, 210), (198, 209), (199, 212), (200, 211), (200, 213), (201, 212), (202, 215), (203, 214), (203, 216), (204, 215), (205, 218), (206, 217), (206, 219), (207, 218), (208, 221), (209, 220), (209, 222), (210, 221), (211, 224), (212, 223), (212, 225), (213, 224), (214, 227), (215, 226), (215, 228), (216, 227), (217, 230), (218, 229), (218, 231), (219, 230), (186, 198), (187, 199), (192, 204), (193, 205), (184, 196), (190, 202), (189, 201), (195, 207), (198, 210), (199, 211), (204, 216), (205, 217), (196, 208), (202, 214), (201, 213), (207, 219), (210, 222), (211, 223), (216, 228), (217, 229), (208, 220), (214, 226), (213, 225), (219, 231), (186, 199), (187, 198), (192, 205), (193, 204), (184, 202), (190, 196), (189, 207), (195, 201), (198, 211), (199, 210), (204, 217), (205, 216), (196, 214), (202, 208), (201, 219), (207, 213), (210, 223), (211, 222), (216, 229), (217, 228), (208, 220), (214, 226), (213, 225), (219, 231), (220, 221), (221, 222), (223, 224), (224, 225), (226, 227), (227, 228), (229, 230), (230, 231), (222, 223), (228, 229), (220, 226), (225, 231), (221, 233), (224, 236), (227, 239), (230, 242), (222, 233), (220, 233), (223, 236), (225, 236), (226, 239), (228, 239), (229, 242), (231, 242), (221, 234), (221, 232), (224, 235), (224, 237), (227, 238), (227, 240), (230, 241), (230, 243), (222, 234), (223, 235), (228, 240), (229, 241), (220, 232), (226, 238), (225, 237), (231, 243), (222, 235), (223, 234), (228, 241), (229, 240), (220, 238), (226, 232), (225, 243), (231, 237) ] # memberType : Member type which contain the information about # 1) cross-sectional area, # 2) Young's modulus, # 3) density of this member. # Read data in this [.py]: for joint, support in zip(joints, supports): truss.AddNewJoint(joint, support) for jointID, force in forces: truss.AddExternalForce(jointID, force) index = 0 for jointID0, jointID1 in members: # memberType = MemberType(A[index].item(), 10000.0, 0.1) memberType = MemberType(A[index].item(), 10000.0, 0.1) if (E != None) & (Rho!=None): memberType = MemberType(A[index].item(), E[index].item(), Rho[index].item()) elif (E != None) & (Rho==None): memberType = MemberType(A[index].item(), E[index].item(), 0.1) elif (E == None) & (Rho!=None): memberType = MemberType(A[index].item(), 10000.0, Rho[index].item()) truss.AddNewMember(jointID0, jointID1, memberType) index += 1 # Do direct stiffness method: truss.Solve() # Dump all the structural analysis results into a .json file: # truss.DumpIntoJSON(TEST_OUTPUT_FILE) # Get result of structural analysis: displace, stress, resistance = truss.GetDisplacements(), truss.GetInternalStresses(), truss.GetResistances() return displace, stress, resistance, truss, truss.weight ########################################################################################## ########################################################################################## ########################################################################################## ########################################################################################## ########################################################################################## def Truss10D_Scaling(X): assert torch.is_tensor(X) and X.size(1) == 10, "Input must be an n-by-10 PyTorch tensor." X_scaled = X * (35-0.1) + 0.1 return X_scaled def Truss25D_Scaling(X): assert torch.is_tensor(X) and X.size(1) == 25, "Input must be an n-by-25 PyTorch tensor." X_scaled = X * (10-0.31) + 0.31 return X_scaled def Truss72D_Scaling(X): assert torch.is_tensor(X) and X.size(1) == 72, "Input must be an n-by-72 PyTorch tensor." X_scaled = X * (10-0.1) + 0.1 return X_scaled def Truss120D_Scaling(X): assert torch.is_tensor(X) and X.size(1) == 120, "Input must be an n-by-120 PyTorch tensor." X_scaled = X * (20-0.775) + 0.775 return X_scaled def Truss360D_Scaling(X): assert torch.is_tensor(X) and X.size(1) == 360, "Input must be an n-by-120 PyTorch tensor." X_scaled = torch.zeros(X.shape) X_scaled[:,:120] = X[:,:120] * (20-0.775) + 0.775 X_scaled[:,120:240] = X[:,120:240] * (5e4-1e3) + 1e3 X_scaled[:,240:360] = X[:,240:360] * (0.3-0.05) + 0.05 return X_scaled def Truss10D(A): assert torch.is_tensor(A) and A.size(1) == 10, "Input must be an n-by-10 PyTorch tensor." E = None Rho = None n = A.size(0) fx = torch.zeros(n,1) # 10 bar stress constraints, 4 displacement constraints gx = torch.zeros(n,14) for ii in range(n): displace, _, stress, _, _, weights = Truss10bar(A[ii,:], None, None) if (E != None) & (Rho!=None): displace, _, stress, _, _, weights = Truss10bar(A[ii,:], E[ii,:], Rho[ii,:]) elif (E != None) & (Rho==None): displace, _, stress, _, _, weights = Truss10bar(A[ii,:], E[ii,:], None) elif (E == None) & (Rho!=None): displace, _, stress, _, _, weights = Truss10bar(A[ii,:], None, Rho[ii,:]) fx[ii,0] = -weights # Negate for maximizing optimization for ss in range(10): gx[ii,ss] = abs(stress[ss]) - 25000 gx[ii,10] = max(abs(displace[1][0]), abs(displace[1][1])) - 2 gx[ii,11] = max(abs(displace[2][0]), abs(displace[2][1])) - 2 gx[ii,12] = max(abs(displace[4][0]), abs(displace[4][1])) - 2 gx[ii,13] = max(abs(displace[5][0]), abs(displace[5][1])) - 2 return gx, fx def Truss25D(A): assert torch.is_tensor(A) and A.size(1) == 25, "Input must be an n-by-25 PyTorch tensor." E = None Rho = None n = A.size(0) fx = torch.zeros(n,1) # 25 bar stress constraints, 6 displacement constraints gx = torch.zeros(n,31) for ii in range(n): displace, _, stress, _, _, weights = Truss25bar(A[ii,:], None, None) if (E != None) & (Rho!=None): displace, _, stress, _, _, weights = Truss25bar(A[ii,:], E[ii,:], Rho[ii,:]) elif (E != None) & (Rho==None): displace, _, stress, _, _, weights = Truss25bar(A[ii,:], E[ii,:], None) elif (E == None) & (Rho!=None): displace, _, stress, _, _, weights = Truss25bar(A[ii,:], None, Rho[ii,:]) fx[ii,0] = -weights # Negate for maximizing optimization # Max stress less than 40ksi (34809) for ss in range(25): gx[ii,ss] = abs(stress[ss]) - 34809 # Max displacement in x and y direction less than .4 inches for dd in range(6): # print(displace[dd]) gx[ii,25+dd] = max(abs(displace[dd][0]), abs(displace[dd][1])) - 0.039 return gx, fx def Truss72D_4forces(A): assert torch.is_tensor(A) and A.size(1) == 72, "Input must be an n-by-72 PyTorch tensor." E = None Rho = None n = A.size(0) fx = torch.zeros(n,1) # 72 bar stress constraints, 4 displacement constraints gx = torch.zeros(n,76) for ii in range(n): displace, _, stress, _, _, weights = Truss72bar_4forces(A[ii,:], None, None) if (E != None) & (Rho!=None): displace, _, stress, _, _, weights = Truss72bar_4forces(A[ii,:], E[ii,:], Rho[ii,:]) elif (E != None) & (Rho==None): displace, _, stress, _, _, weights = Truss72bar_4forces(A[ii,:], E[ii,:], None) elif (E == None) & (Rho!=None): displace, _, stress, _, _, weights = Truss72bar_4forces(A[ii,:], None, Rho[ii,:]) fx[ii,0] = -weights # Negate for maximizing optimization # Max stress less than 25000 for ss in range(72): gx[ii,ss] = abs(stress[ss]) - 25000 # Max displacement in x and y direction less than .25 inches # print(displace[16], displace[17], displace[18], displace[19]) gx[ii,72] = max(abs(displace[16][0]), abs(displace[16][1])) - 0.25 gx[ii,73] = max(abs(displace[17][0]), abs(displace[17][1])) - 0.25 gx[ii,74] = max(abs(displace[18][0]), abs(displace[18][1])) - 0.25 gx[ii,75] = max(abs(displace[19][0]), abs(displace[19][1])) - 0.25 return gx, fx def Truss120D(A): assert torch.is_tensor(A) and A.size(1) == 120, "Input must be an n-by-120 PyTorch tensor." E = None Rho = None n = A.size(0) fx = torch.zeros(n,1) # 120 bar stress constraints, 1 displacement constraints gx = torch.zeros(n,121) for ii in range(n): # print(ii) # print(A[ii,:].shape) displace, _, stress, _, _, weights = Truss120bar(A[ii,:], None, None) if (E != None) & (Rho!=None): displace, _, stress, _, _, weights = Truss120bar(A[ii,:], E[ii,:], Rho[ii,:]) elif (E != None) & (Rho==None): displace, _, stress, _, _, weights = Truss120bar(A[ii,:], E[ii,:], None) elif (E == None) & (Rho!=None): displace, _, stress, _, _, weights = Truss120bar(A[ii,:], None, Rho[ii,:]) fx[ii,0] = -weights # Negate for maximizing optimization # Max stress less than 34800 for ss in range(120): gx[ii,ss] = abs(stress[ss]) - 34800 # Max displacement in x and y direction less than MAX_DIST = 0 for dd in range(len(displace)): if max(displace[dd]) > MAX_DIST: MAX_DIST = max(abs(displace[dd])) gx[ii,120] = MAX_DIST - 0.1969 return gx, fx def Truss360D(X): assert torch.is_tensor(X) and X.size(1) == 360, "Input must be an n-by-120 PyTorch tensor." A = X[:,:120] E = X[:,120:240] Rho = X[:,240:360] n = A.size(0) fx = torch.zeros(n,1) # 120 bar stress constraints, 1 displacement constraints gx = torch.zeros(n,121) for ii in range(n): # print(ii) # print(A[ii,:].shape) displace, _, stress, _, _, weights = Truss120bar(A[ii,:], E[ii,:], Rho[ii,:]) # if (E != None) & (Rho!=None): # displace, _, stress, _, _, weights = Truss120bar(A[ii,:], E[ii,:], Rho[ii,:]) # elif (E != None) & (Rho==None): # displace, _, stress, _, _, weights = Truss120bar(A[ii,:], E[ii,:], None) # elif (E == None) & (Rho!=None): # displace, _, stress, _, _, weights = Truss120bar(A[ii,:], None, Rho[ii,:]) fx[ii,0] = -weights # Negate for maximizing optimization # Max stress less than 34800 for ss in range(120): gx[ii,ss] = abs(stress[ss]) - 34800 # gx[ii,ss] = abs(stress[ss]) - 34800 # Max displacement in x and y direction less than MAX_DIST = 0 for dd in range(len(displace)): if max(displace[dd]) > MAX_DIST: MAX_DIST = max(abs(displace[dd])) gx[ii,120] = MAX_DIST - 0.1969 return gx, fx