Skip to main content

Calculation of effective cross-sectional properties of composite beams

Project description

PyPi doi pipeline status

BoxBeam

BoxBeam is a legacy Fortran-based beam calculation tool. It is compiled for Python using f2py.

Installation from source requires an active Fortran compiler (ifort, gfortran).

Downloading

Use GIT to get the latest code base. From the command line, use

git clone https://gitlab.dlr.de/fa_sw/boxbeam boxbeam

If you check out the repository for the first time, you have to initialize all submodule dependencies first. Execute the following from within the repository.

git submodule update --init --recursive

To update all refererenced submodules to the latest production level, use

git submodule foreach --recursive 'git pull origin $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'

Installation

BoxBeam can be installed from source using poetry. If you don't have poetry installed, run

pip install poetry --pre --upgrade

to install the latest version of poetry within your python environment. Use

poetry update

to update all dependencies in the lock file or directly execute

poetry install

to install all dependencies from the lock file. Last, you should be able to import BoxBeam as a python package.

import boxbeam

Example

Copy and paste the following text into a new python script to verify the local installation

import os, sys
import boxbeam as bbeam
 
from itertools import count, zip_longest
from operator import itemgetter
from collections import OrderedDict
import numpy as np

def toolInitiate(directory):
    #---INITIATE BOXBEAM VARIABLES
    bbeam.boxbeam.initialize()

    extendedLogFile = False
    newPath = directory#+'\\TestProfile.out'

    #setting control parameters for BOXBEAM
    bbeam.steuer.druck = extendedLogFile # extended log file
    bbeam.steuer.nurqer = False
    bbeam.steuer.klog = 11
    bbeam.steuer.kraeft = False # calculate nodal forces (utilization for FE applications)

    #---CHANGE THE NAME OF THE OUTPUT FILE TO THE ACTUAL CROSS SECTION NAME
    if extendedLogFile:
        for ffile, bbeamPathVar in zip(["boxbeam_results.out", 
                                        "boxbeam_test.out"], 
                                        ["csinfopath", 
                                         "vbinfopath"]):

            fullPathFfile = os.path.abspath(os.path.join(newPath, ffile))

            # 240 is the length of the character variable reserved
            # within FORTRAN to store the directory name
            if len(fullPathFfile) > 240:
                raise Exception("Path length of file %s to long!" % fullPathFfile)

            pathList = [""] * 240
            pathList[: len(fullPathFfile)] = list(fullPathFfile)

            if bbeamPathVar == "csinfopath":
                self.bbeam.path.csinfopath = np.array(pathList,dtype="object")
            else:
                self.bbeam.path.vbinfopath = np.array(pathList,dtype="object")

def toolCalculate(capCount, webCount, cellCount, yi, zi, yk0, zk0, yklk, zklk, ig1, ig2, iak, ia, 
                    webExtensionalStiffness, webShearStiffness, webRefPlaneDist, webThickness,webDensity):
    #---ASSIGN GURT DATA
    bbeam.gurt.ig = capCount
    
    #---ASSIGN GURT COORDINATES
    variableList = np.zeros(bbeam.restr.maxgu-bbeam.gurt.ig).tolist()
    bbeam.gurt.yi = yi + variableList
    bbeam.gurt.zi = zi + variableList
    
    #---ASSIGN GURT MATERIAL INFORMATION WITHIN BOXBEAM
    bbeam.gurt.bi = np.zeros(bbeam.restr.maxgu)
    bbeam.gurt.myi = np.zeros(bbeam.restr.maxgu)

    #---ASSIGN BOXBEAM WAND DATA
    bbeam.wand.kw = webCount
    
    #---ASSIGN WAND COORDINATES
    variableList = np.zeros(bbeam.restr.maxwa-len(yk0)).tolist()
    bbeam.wand.yk0 = yk0 + variableList
    bbeam.wand.yklk = yklk + variableList
    bbeam.wand.zk0 = zk0 + variableList
    bbeam.wand.zklk = zklk + variableList
    
    #---ASSIGN WAND MATERIAL INFORMATION WITHIN BOXBEAM
    variableList = np.zeros(bbeam.restr.maxwa-bbeam.wand.kw).tolist()
    bbeam.wand.it = (5*np.ones(bbeam.wand.kw)).tolist()+variableList
    bbeam.wand.bk = webExtensionalStiffness+variableList
    bbeam.wand.gk = webShearStiffness+variableList
    bbeam.wand.rhok = webDensity+variableList
    bbeam.wand.e = webRefPlaneDist+variableList
    
    #---ASSIGN WAND TOPOLOGY WITHIN BOXBEAM
    bbeam.wand.th = webThickness+variableList
    bbeam.wand.ig1 = ig1+variableList
    bbeam.wand.ig2 = ig2+variableList

    #---ASSIGN BOXBEAM ZELLE DATA
    bbeam.zelle.az = cellCount
    variableList = np.zeros(bbeam.restr.maxze-bbeam.zelle.az).tolist()
    bbeam.zelle.iak = iak+variableList
    
    iaArrayTransposed = np.zeros((bbeam.restr.maxze, bbeam.restr.maxgu))
    for cellNumber in range(int(bbeam.restr.maxze)):
        if cellNumber < cellCount:
            iaArrayTransposed[cellNumber, :len(ia[cellNumber])] += ia[cellNumber]
    bbeam.zelle.ia = iaArrayTransposed.T

    #---ASSIGN BOXBEAM UNIFY LOADS
    for attrName, load in zip_longest(["qqx","qqy","qqz","qmx","qmy","qmz"], reactionForces):
        setattr(bbeam.spanug, attrName, load)

    #---EXECUTE BOXBEAM FOR CALCULATING THE CROSS SECTION PARAMETERS
    bbeam.boxbeam.getequivalentxsection()

    crossSectionParamNames = ['YS','ZS','YT','ZT','YMST','ZMST','YMSTAC','ZMSTAC','BX',
                                'ALPHA','DYYSTE','DZZSTE','DYY','DZZ','DZY','DT','M','IYYS','IZZS','IZYS','ITT']

    crossSectionParameters = {}
    for param in crossSectionParamNames:
        crossSectionParameters[param] = float(getattr(bbeam.quer, param.lower()))

    effectiveProps = OrderedDict([
                        ('EA',crossSectionParameters['BX']    ),
                        ('EIxx',crossSectionParameters['DYY'] ),
                        ('EIyy',crossSectionParameters['DZZ'] ),
                        ('GJ',crossSectionParameters['DT']    ),
                        ('YS',crossSectionParameters['YS']    ),
                        ('ZS',crossSectionParameters['ZS']    ),
                        ])


if __name__ == '__main__':

    #Specify folder where output files are to be stored
    runDir = os.path.join(os.getcwd(),"boxbeam")
    try:
        os.makedirs(runDir)
    except WindowsError: 
        pass

    #Tool specific limitations
    #maxCaps = 22 #variable specifying the maximum number of caps within a BoxBeam cross section - defined in bbeam.pyd
    #maxWebs = 31 #variable specifying the maximum number of walls within a BoxBeam cross section - defined in bbeam.pyd
    #maxCells = 10 #variable specifying the maximum number of cells within a BoxBeam cross section - defined in bbeam.pyd

#------------------------------------------------------------------------------------------------------------------------
# Initiation of boxbeam
#------------------------------------------------------------------------------------------------------------------------

    toolInitiate(runDir)

#------------------------------------------------------------------------------------------------------------------------
# Input for profile
#------------------------------------------------------------------------------------------------------------------------

    calcGeometry = False # If true the material data is set in a fashion, that the geometric properties (e.g. area moments of inertia) can be calculated.
    
    thickness1 = 1.25
    thickness2 = .375
    if calcGeometry:
        extensionalStiffness1 = 1.*thickness1
        extensionalStiffness2 = 1.*thickness2
        shearStiffness1 = 1.*thickness1
        shearStiffness2 = 1.*thickness2
        density1 = 1.*thickness1
        density2 = 1.*thickness2
        bbeam.steuer.nurqer = True

        #"qqx","qqy","qqz","qmx","qmy","qmz"
        reactionForces = [0., 0., 0., 0., 0., 0.]     
        
    else:
        extensionalStiffness1 = 7.3335e4*thickness1
        extensionalStiffness2 = 3.2232e4*thickness2
        shearStiffness1 = 1.7327e4*thickness1
        shearStiffness2 = 2.5012e4*thickness2
        density1 = 0.00158*thickness1
        density2 = 0.00158*thickness2

        #"qqx","qqy","qqz","qmx","qmy","qmz"
        reactionForces = [0., 0., 500., 0., -62500., 0.]        

    #---RETRIEVING POINT LOCATIONS AND TOPOLOGY
    yi,zi,yk0,zk0 = [],[],[],[]
    yklk, zklk, ig1, ig2 = [],[],[],[]
    iak = []
    ia = []
    
    webExtensionalStiffness = []
    webShearStiffness, webRefPlaneDist = [], []
    webThickness, webDensity = [],[]
    
    capExtensionalStiffness = []
    capMass = []

    #definition of simple profile
    capCount = 8 
    webCount = 9
    cellCount = 2
    
    yi = [55., 55., -225., 13., 13., 75., -75., 75.]
    zi = [12., -12., 0., 18., -18., 0., 16., 16.]
    yk0 = [55., 75., 55., 13., -75., -225., -75., 13., 13., 13.]
    zk0 = [12., 0., -12., -18., -16., 0., 16., 18., 18., 18.]
    yklk = [75., 55., 13., -75., -225., -75., 13., 55., 13., 13.] 
    zklk = [0., -12., -18., -16., 0., 16., 18., 12., -18., -18.]

    ig1 = [1, 6, 2, 5, 8, 3, 7, 4, 4]
    ig2 = [6, 2, 5, 8, 3, 7, 4, 1, 5]
    iak = [5, 5]
    ia = [[1, 6, 2, 5, 4], [5, 8, 3, 7, 4]]

    webExtensionalStiffness = [extensionalStiffness1]*(webCount-1)+[extensionalStiffness2]
    webShearStiffness = [shearStiffness1]*(webCount-1)+[shearStiffness2]
    webRefPlaneDist = [thickness1/2.]*(webCount-1)+[thickness2/2.]
    webThickness = [thickness1]*(webCount-1)+[thickness2]
    webDensity = [density1]*(webCount-1)+[density2]

#------------------------------------------------------------------------------------------------------------------------
# Assigning variables of boxbeam
# Executing boxbeam
# Retrieving results from boxbeam
#------------------------------------------------------------------------------------------------------------------------

    toolCalculate(
        capCount, webCount, cellCount, yi, zi, yk0, zk0, yklk, zklk, ig1, ig2, iak, ia, 
        webExtensionalStiffness, webShearStiffness, webRefPlaneDist, webThickness,webDensity
    )

Contact

Support

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

boxbeam-1.3.0.post1-cp311-cp311-win_amd64.whl (447.6 kB view details)

Uploaded CPython 3.11 Windows x86-64

boxbeam-1.3.0.post1-cp310-cp310-win_amd64.whl (447.4 kB view details)

Uploaded CPython 3.10 Windows x86-64

boxbeam-1.3.0.post1-cp39-cp39-win_amd64.whl (447.2 kB view details)

Uploaded CPython 3.9 Windows x86-64

boxbeam-1.3.0.post1-cp38-cp38-win_amd64.whl (446.7 kB view details)

Uploaded CPython 3.8 Windows x86-64

boxbeam-1.3.0.post1-cp37-cp37m-win_amd64.whl (447.9 kB view details)

Uploaded CPython 3.7m Windows x86-64

boxbeam-1.3.0.post1-cp36-cp36m-win_amd64.whl (446.6 kB view details)

Uploaded CPython 3.6m Windows x86-64

boxbeam-1.3.0.post1-cp35-cp35m-win_amd64.whl (444.7 kB view details)

Uploaded CPython 3.5m Windows x86-64

boxbeam-1.3.0.post1-cp27-cp27m-win_amd64.whl (443.5 kB view details)

Uploaded CPython 2.7m Windows x86-64

File details

Details for the file boxbeam-1.3.0.post1-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for boxbeam-1.3.0.post1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 e4d6b87bae855a65f2205c90c891adb7fe6c8e793b9aa9f9df3526568fb5a520
MD5 9ff397aa68eb90b89a39c6b4b8af582f
BLAKE2b-256 15125a2effd2c5e8d88cbb7a837bc05ce25c6f277742d470d8da7f5c3ba7015d

See more details on using hashes here.

File details

Details for the file boxbeam-1.3.0.post1-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for boxbeam-1.3.0.post1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 b31b15c9af0cb9958f0b9045e4320d39511ee9fbd18115a42d3e7bbba7d8e3e4
MD5 e50014a07669e147d03730e2f4a8ea9b
BLAKE2b-256 a88ec3558874d6e973f3038b0713dbbf2e58ae4361bb37218b131b2f14af8dfc

See more details on using hashes here.

File details

Details for the file boxbeam-1.3.0.post1-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for boxbeam-1.3.0.post1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 911d08934445adb087d77c3c83fee945091fdccf1038c087535467de34b152cd
MD5 8312dec6209411f7fd0a87d8025d2901
BLAKE2b-256 3715d25d65c4fcf546390abfc9eb3d22b55e6f6d5e6f0c9fd12dfdac254edf0c

See more details on using hashes here.

File details

Details for the file boxbeam-1.3.0.post1-cp38-cp38-win_amd64.whl.

File metadata

File hashes

Hashes for boxbeam-1.3.0.post1-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 2f1f56dc4146fec8661fb307a1be136bce02cc3c25e5ec7e7533023a0a3d2fb4
MD5 e2d31911785a28bf222c412732e0bad4
BLAKE2b-256 95e4aed5aed4982fda1b9e3eb621cfa08411ea471987280e34420d6c5cd51d29

See more details on using hashes here.

File details

Details for the file boxbeam-1.3.0.post1-cp37-cp37m-win_amd64.whl.

File metadata

File hashes

Hashes for boxbeam-1.3.0.post1-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 468775e5150c23c070f016481261a38dd520b030dbb8935f027f4942a4039d10
MD5 d7a9109a0ee0785ab2dda1a73219cce1
BLAKE2b-256 6c8d61df879efd7d9a035565b5c6e2b1d4b275d70610d86503cd47ae69112555

See more details on using hashes here.

File details

Details for the file boxbeam-1.3.0.post1-cp36-cp36m-win_amd64.whl.

File metadata

File hashes

Hashes for boxbeam-1.3.0.post1-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 20921acade850ed0078ad6b8ff1cf1b44c825a114f50815db773fe6a0730a58d
MD5 3c84bd63f672554be460dd7892d9aa97
BLAKE2b-256 2b1c51a448e87d17aaae0b07514767078c5e703efd34edcee762fcb34b184aa8

See more details on using hashes here.

File details

Details for the file boxbeam-1.3.0.post1-cp35-cp35m-win_amd64.whl.

File metadata

File hashes

Hashes for boxbeam-1.3.0.post1-cp35-cp35m-win_amd64.whl
Algorithm Hash digest
SHA256 d8b1ab0660e7c5949a1eda8a137a89f991f1a3905f09fd2ceaf9c7be695a9eeb
MD5 280b1d58b8c764a8c2b7a2f47a61b1ef
BLAKE2b-256 eb0f5ca83a87240723775416303fdb9002b60f237c1565d23d07fa0540c5ac31

See more details on using hashes here.

File details

Details for the file boxbeam-1.3.0.post1-cp27-cp27m-win_amd64.whl.

File metadata

File hashes

Hashes for boxbeam-1.3.0.post1-cp27-cp27m-win_amd64.whl
Algorithm Hash digest
SHA256 7aecf36fb58635b15e87de15d1fe2ddd65e05f9289d83f59f2458dd47b559cc0
MD5 4f4313a88b58c9aa965b5628a3fb0cc9
BLAKE2b-256 ec07c3f15ca40ed6b48b57f8c83854bf6a95ce999320b0d5928aec9708dc8473

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page