A 3D structural engineering finite element library for Python.

Overview

Simple Finite Element Analysis in Python

Build Status PyPI - Downloads GitHub code size in bytes GitHub last commit GitHub

An easy to use elastic 3D structural engineering finite element analysis library for Python.

Current Capabilities

  • 3D static analysis of elastic structures.
  • P-Δ analysis of frame type structures.
  • Member point loads, linearly varying distributed loads, and nodal loads are supported.
  • Classify loads by load case and create load combinations from load cases.
  • Produces shear, moment, and deflection results and diagrams for each member.
  • Tension-only and compression-only elements.
  • Spring elements: two-way, tension-only, and compression-only.
  • Spring supports: two-way and one-way.
  • Quadrilateral plate elements (MITC4 formulation).
  • Rectangular plate elements (based on a 12-term polynomial formulation).
  • Basic meshing algorithms for some common shapes and for openings in rectangular walls.
  • Reports support reactions.
  • Rendering of model geometry, supports, load cases, load combinations, and deformed shapes.
  • Generates PDF reports for models and model results.

Project Objectives

As I've gotten into the structural engineering profession, I've found there's a need for an easy to use open-source finite element package. I hope to help fill that need by prioritizing the following:

  1. Accuracy: There are no guarantees PyNite is error free, but accuracy and correctness are a priority. When bugs or errors are identified, top priority will be given to eliminate them. PyNite's code is frequently reviewed, and its output is tested against a suite of textbook problems with known solutions using continuous integration (CI) anytime a change to the code base is made. If you do happen to find an error, please report it as an issue.

  2. Simplicity: There are other finite element alternatives out there with many more capabilities, but they are often lacking in documentation, written in outdated languages, or require extensive knowledge of finite element theory and/or element formulations to use. PyNite is not intended to be the most technically advanced solver out there. Rather, the goal is to provide a robust yet simple general purpose package.

  3. Improvement: I plan to continue supporting PyNite for many years to come. There are a lot of pieces I'd like to add to PyNite going forward. There's a lot of potential to create extensions as well to solve all kinds of engineering problems. There are more problems to solve than I have time for, so some priorities will have to be made. The plan is to keep PyNite mainstream, adding core functionality first. Occasionally however I may just add what interests me at the time.

  4. Collaboration: The intent is to keep PyNite free and open source. This will encourage future development and contributions. Keeping it open source will allow anyone to inspect and improve the code it runs on. If you see an area you think you can help PyNite improve in you are encouraged to contribute. I'd like to get PyNite doing a lot more. Don't be offended if I'm a little slow to accept your contributions. FEA is a very technical subject and accuracy is extremely important to me. Sometimes I'm a little slow understanding both FEA and Python and it takes some time for me to comprehend what's being proposed. I also have a young family to take care of that takes first priority.

Support

Whether you just need help getting started with PyNite, or are looking to build something more complex, there are a few resources available:

  • The examples in the "Examples" folder in this repository cover a variety of simple problems. The comments in the examples provide additional guidance on how PyNite works.
  • The wiki in this repository provides basic guidance on how to use PyNite, although it has fallen behind the development of the program.
  • If you're looking for more direct guidance on using PyNite, or for help coding a project, I am available on a private consulting basis. You can reach out to me directly at [email protected] to discuss options.

Dependencies

PyNite depends on the following packages:

Required Dependencies

  • numpy: used for matrix algebra and dense matrix solver
  • scipy: used for sparse matrix solver to improve solution speed
  • matplotlib: used for plotting member diagrams
  • PrettyTable : used to format tabular output

Optional Dependencies

  • VTK: Used for visualization - Note that VTK is a little picky about which version of Python you are running. You must run a 64 bit installation of Python, rather than a 32 bit version. VTK is published by Kitware. I've noticed Kitware takes a little time updating VTK to be compatible anytime a new version of Python is released. If you're having trouble installing VTK, you can see which versions of Python are supported by visiting https://pypi.org/project/vtk/#files. VTK does not need to be installed if you don't plan to use the visualization tools built into PyNite.
  • PDFKit: Used for generating pdf reports. In order to generate pdf reports, PDFKit requires you to have wkhtmltopdf installed on your computer. This is a free program available for download at https://wkhtmltopdf.org/downloads.html. Once installed, you'll need to help PyNite find it. On Windows, this can be done by setting your PATH environment variable to include the path to "wkhtmltopdf.exe" after installation. For example, mine is installed at "C:\Program Files\wkhtmltopdf\bin"
  • IPython: Used for displaying screenshots from VTK.
  • jinja2: Used for templating reports into HTML prior to HTML-to-pdf conversion.
  • jupyterlab: Only needed if you want to view the derivations used to build PyNite.
  • sympy: Only needed if you want to view the derivations used to build PyNite.

What's New?

v0.0.52

  • Major bug fix for quadrilaterals. In-plane stiffnesses were 1/4 of what they should have been.
  • Added more unit testing for plates and quadrilaterals.
  • Fixed a bug where cylindrical quad meshes didn't calculate the number of quads that fit in the circumference correctly. This bug only affected models where the number was not explicitly specified.
  • Added plate/quad surface load validation to ensure loads are not added to ficticious plates/quads.
  • Improved the remove_duplicate_nodes method. It wasn't working properly for springs. It also now returns a list of the names of the nodes that were removed. Also added a docstring for this method.
  • Added the orphaned_nodes method that checks the model for orphaned nodes and returns a list of the names of orphaned nodes.

v0.0.51

  • Internal changes to some matrix operations. This was in response to Issue #102 where statics were not checking out for some 3D plate models.
  • Reduced stiffness of plate/quad element drilling degree of freedom. Again in response to Issue #102.

v0.0.50

  • Bug fix for cylindrical meshes.
  • Added tension/compression only support springs. This required some reworking of how support springs are implemented. See the "Beam on Elastic Foundation" example for an example of how to properly use support springs.
  • More PEP8 style changes. This shouldn't change the way you use the program. Some of the internal calls to function names still referenced the old function names. It was leading to deprecation warnings during runtime.
  • Fixed a divide by zero error for plotting contours on models with nodes not attached to plates/quads.

v0.0.49

  • Major speed boost. A lot of time was being wasted reading/writing to a SciPy lil_matrix format. The stiffness matrix is now assembled as a coo_format first, and then switched to lil format later on to facilitate slicing.
  • Refactored node names to match PEP8 style guide. Instead of iNode, jNode, etc. PyNite now uses i_node, j_node etc. This should only affect you if you were using the keyword arguments for node names.
  • Removed test modules from package distribution. These files were unnecessary for users to have installed on their computers.

v0.0.48 - Global Load Directions

  • Global load directions can now be used for member loads now. Use capital notation to apply the member load in the global X, Y, or Z direction (e.g. 'FX', 'MY', 'FZ'...). Use lower case notation to apply the member load in the member's local x, y, or z direction (e.g. 'Fx', 'My', 'Fz'...).
  • Bug fix for rendering models without plates/quads (special thanks to tamalone1 for this pull request!)

v0.0.47 - Bug Fix After Refactoring

  • Fixed a bug identified in Issue #98 caused by refactoring in v0.0.44.

v0.0.46 - Rendering Improvements

  • The size of the scalar bar for plate contours is now a little more predictable. It used to be based off of the window size. Now it only resizes when the window gets really small.
  • The user now has more control over screenshots. If a screenshot is requested, it will be captured when the user closes the render window.

v0.0.45 - Rectangular Mesh Openings

  • Openings can now be added to rectangular meshes. An example of a shear wall with openings has been added to the Examples folder to help you get started.

v0.0.44 - PEP8 Style Updates

  • Many method and function names have been renamed to match the PEP8 style guide for Python. For now PyNite is backwards compatible, but deprecation warnings have been implemented for function names that will be disappearing in a future release. If you see deprecation warnings when you run your code, it's recommended to move your code over to the new method and function names given in the deprecation warnings. This is a big change that will affect most users. I don't plan to make changes this big very often, but PyNite was getting large and complex enough that I had to do it now or never. When I started PyNite I didn't know much about Python coding styles. This change brings the code into better conformance with normal conventions in Python.
  • The ClearLoads method (delete_loads going forward) wasn't deleting plate and quad loads. Fixed this issue.

Example Projects

Here's a list of projects that run on PyNite:

Comments
  • Skewed Quads Not Producing Results

    Skewed Quads Not Producing Results

    Hi. First off, PyNite is a great project and i'm very excited to see the pace at which it is improving.

    Describe the bug Quad elements don't seem to produce a valid result if they're skewed from rectangular, but no interpreter errors are raised

    To Reproduce The below code produces a rectangular test grid in order to test out the quad functionality. It seems to work fine when i set the skew to zero (ie. all quads are rectangular), but as soon as the skew is non-zero all of the reactions and displacements become 'nan' and the displacement plot no longer correctly plots the quad displacements.

    Apologies as the code runs on my own fork, in which i've added element auto-naming (when 'None' is passed to the constructor function)...

    
    # Import 'FEModel3D' and 'Visualization' from 'PyNite'
    from PyNite import FEModel3D
    from PyNite import Visualization
    
    # Create a new model
    plate_test = FEModel3D()
    
    hplates=10
    vplates=20
    plate_dim=0.5
    skew=0.01
    
    # Create a test model with a grid of quad elements
    node_array=[]
    plate_array=[]
    support_nodes=[]
    for yi in range(vplates+1):
        y2=(yi+1)*plate_dim 
        
        current_row=[]
        current_row_plates=[]
        for xi in range(hplates+1):
            x2=(xi+1)*plate_dim * (1+yi*skew)
            
            current_row.append(plate_test.AddNode(None, x2, y2, 0))
            
            if (xi==2 or (xi>0 and xi % 8==0)) and (yi==2 or (yi>0 and yi % 8 ==0)):
                plate_test.DefineSupport(current_row[-1], True, True, True, False, False, False)
                support_nodes.append(current_row[-1])
            
            if yi>0 and xi>0:
                n1 = node_array[yi-1][xi-1]
                n2 = current_row[xi-1]
                n3 = current_row[xi]
                n4 = node_array[yi-1][xi]
                
                nq=plate_test.AddQuad(None,n1,n2,n3,n4,0.01,2e11,0.25)
    
                plate_test.AddQuadSurfacePressure(nq,1000)
                current_row_plates.append(nq)
                
                                          
        node_array.append(current_row)
        plate_array.append(current_row_plates)
            
    
    # # Analyze the model
    plate_test.Analyze()
    
    #Print critical node reactions
    for i,n in enumerate(support_nodes):
        print("Node",i,"reaction is",plate_test.GetNode(n).RxnFZ["Combo 1"])
      
    #Print node displacements
    i=0
    for row in node_array:
        for nd in row:
            print("Node",i,"displacement is",plate_test.GetNode(nd).DZ["Combo 1"])
            i+=1
    
    # # Render the model for viewing.
    Visualization.RenderModel(plate_test, text_height=0.05, deformed_scale=0.001, deformed_shape=False, color_map='dz', render_loads=True)
    
    
    bug 
    opened by bjhowie 22
  • 3D deformed shape

    3D deformed shape

    In order to obtaine 3D deformed shape, I've introduced axial deformation and axial translation in PyNite. I've defined two new functions in BeamSegZ.py:

    Cattura

    "Translation1" is defined in Member3D.py forsì SegmentsZ[0] and SegmentsZ[i].

    With these new functions, deformed shape of 2D frame shown in pull request Update Visualization.py #30 now it's correct.

    ssss

    There are some problems with axial distributed load (p1 and p2); I think because I have to add other terms (terms that includes p1 and p2) in Axial translation's formula. In this moment, using this formulation, with a simple supported beam with axial distributed load, I otained the follow axial translations:

    eee

    I've tried to understand formula used in Deflection function in BeamSegZ but I don't remeber how get terms who account for distributed load p1 and p2.

    Thaks for supporting!

    enhancement 
    opened by LcnGnd 16
  • Automatic subdivision of members with intermediate nodes

    Automatic subdivision of members with intermediate nodes

    I'd love to see functionality where the solver automatically recognizes the presence of an intermediate node within the length of a member, and internally divides the member into smaller sub-members. With that functionality, an intermediate framing member will behave correctly, without having to subdivide the member by hand. This functionality is really nice to have in commercial solvers.

    enhancement 
    opened by trevdna 10
  • Cannot Import PyNite

    Cannot Import PyNite

    Hi,

    I just installed PyNite with pip.

    Installation ended correctly.

    But when I want to use it, if I type "import pynite", I get "No module named 'PyNite'".

    Other imports such as "import numpy" or whatever work just fine.

    I work with WinPython-64-bit-3.6.0.1.Qt5.

    opened by Corentin1985 9
  • End reaction fix + option for orienting beams

    End reaction fix + option for orienting beams

    I'm still trying to get my head around the maths of it, but:

    1. A mechanism for orientating beams by specifying a reference point in the beam's ZX-plane.
    2. Don't create the transformation matrix, T(), more than once.
    3. I think T() needs to be transposed when transforming back to the global coordinate frame.
    opened by FJFranklin 9
  • Analysis Optimisations

    Analysis Optimisations

    Hi,

    I've been putting PyNite through its paces recently and it seems to be holding up really well, so congrats on creating such a robust FEA solver. I have a few ideas for improvements i'd like to raise for discussion:

    1. The Scipy sparse solver doesnt appear to throw an exception when the input stiffness matrix is singular, it simply prints a warning. This isn't ideal for the operation of PyNite, where we want to be able to catch this condition to resolve the instability. I'm not too familiar with Scipy so not sure if there's a way to force it to throw an exception with a singular input matrix, but as a work around maybe PyNite could check the first element in the returned displacement Matrix and if it is 'NaN' then raise the exception manually
    2. The solver is very slow for large models with multiple load combinations. The reason for this seems to be that the stiffness matrix is regenerated (and more critically, re-inversed) for each load combination. For linear models (no tension/compression only elements) this seems entirely unnecessry, the stiffness matrix should be able to be generated once, then re-used for every load combination. As an even further optimisation, the stiffness matrix could be pre-inversed then just multiplied with the force matrix for each load combo
    3. The above point is not possible for non-linear models however as a thought, potentially the full stiffness matrix could be generated once then just have the stiffness components for the inactive compression/tension only elements subtracted in each iteration/load combo. Unsure what sort of performance increase this would provide as you'd still have to do the matrix inversion in each iteration.

    Would be interested to hear your thoughts on the above.

    Happy to contribute some code, but I am not particularly familiar with the implementation specifics of the matrix operations I've discussed.

    enhancement 
    opened by bjhowie 8
  • Bug: AISC 2nd Order Benchmark Check doesn't return the expected values

    Bug: AISC 2nd Order Benchmark Check doesn't return the expected values

    Description: The calculated values for the moment and deflection do not match the expected values printed at the end.

    To Reproduce: Steps to reproduce the behavior:

    1. Run Testing & Debuging/AISC 2nd Order Benchmark Check.py
    2. See value mismatch in the console output.

    Output Displayed:

    PyNite Calculated Moment:  -99.99499999998429
    PyNite Calculated Displacement:  7.944827586205967
    AISC Benchmark Problem Moment:  435.6165910296658
    AISC Benchmark Problem Displacement:  40.27399092355989
    
    bug 
    opened by tamalone1 8
  • Nodal displacements specified by user - settlement of a support

    Nodal displacements specified by user - settlement of a support

    I introduced the possibility to apply support's settlements and nodal displacements/rotations at a free node. Because of this new feature, solving method is changed because partioning of matrix K and vectors P and FER is needed. I hope you like my work and you take it into account for PyNiteFEA develope.

    Thanks!

    opened by LcnGnd 8
  • Nodal displacements specified by user - settlement of a support

    Nodal displacements specified by user - settlement of a support

    I would like to introduce settlement of a support or, in general, the possibility to choose a nodal displacement. Pratically it rappresents a new load for the model, but it rappresent also a non homogeneus boundary condition.

    Could you give me some suggestions (guidelines)?

    enhancement 
    opened by LcnGnd 8
  • running pynite without scipy

    running pynite without scipy

    Dear Craig and hello everyone,

    as described in FEModel3D, scipy is used to make pynite work faster with a huge amount of nodes. It would be great, if there is a possibility to use pynite without scipy also. Pynite allows to pass sparse=False as argument to the function analyze in FEModel3D:

    truss.analyze(check_statics=False, sparse=False)

    Anyway: Scipy is still imported in FEModel3D.py Furthermore coo_matrix and lil_matrix is is called in the code afterwards. Would it be possible to make conditionals in order to avoid to load and to use scipy? (I would like to make a simple add-on for pynite in blender 3D. When running blender 3D on linux, it is possible to use pip in order to install additional modules to blender python. When switching to other operating systems, this would be a limitation. But maybe someone has also another idea how to make this work.)

    Thanks for your answers in advance!

    Greetings, Chris

    opened by psychomiller 7
  • Quad Issues

    Quad Issues

    Quads still seem to have some issues when they are not aligned with the global coordinate system. Currently working on a fix to the element formulation.

    bug 
    opened by JWock82 7
  • Possible code reorganisation

    Possible code reorganisation

    Hi Craig,

    I can see the code for assembling and solving FE are all written in FEModel3D.py. It might be beneficial to have the solution part of the code written in a separate script to maintain the code tidy if more functionalities are added (different nonlinear solvers, dynamic solver, etc) in the future.

    BR Roger

    enhancement 
    opened by roger1017 1
  • Model Fails Statics Checks

    Model Fails Statics Checks

    Sorry to come again with problems and not solutions, but i'm having some trouble with a proof-of-concept lateral stability model that i have been trying to analyse with PyNite. It is a model of an RC building core and shear wall, with some rigid members connecting the two to represent the rigid floor diaphragm.

    The model runs fine, and the stress plots on the quad elements look good, but the model fails statics checks. The global reactions are larger than the sum of the applied forces. The 'check_statics' function built in to the 'analyze' method confirms this.

    Any thoughts on what could be causing this?

    The code to generate the model is complex so i've pickled the model and attached it in a zip file below:

    stability_test.zip

    I have subclassed PyNite.FEModel3D so you'll need to use the below code to read the model.

    import pickle
    
    infile = ...
    
    class customUnpickler(pickle.Unpickler):
        def find_class(self, module, name):
            if module == "Analysis.AnalysisBase":
                module = "PyNite.FEModel3D"
                name = "FEModel3D"
    
            return super().find_class(module, name)
        
    with open(infile,mode="rb") as f: model=customUnpickler(f).load()
    
    
    

    Also, i've noticed that Visualization._PrepContour fails when there are nodes in the model not connected to Quad or Plate elements. node.contour = sum(node.contour)/len(node.contour) results in a divide by zero error.

    help wanted program limitation 
    opened by bjhowie 23
  • Postprocessing - Code Checks

    Postprocessing - Code Checks

    I know it's a big one, but code checks would be useful for various material types: steel, concrete, timber, and masonry. Building a whole Excel spreadsheet to do it, then manually import the results into it, is complex and time-consuming.

    enhancement 
    opened by trevdna 1
  • Slender wall design

    Slender wall design

    First I just want to say I am very impressed with this project! I too have been writing/developing an FEA package currently as well. My primary use case is for doing tilt up/slender wall panel analysis design. After finding your project I am considering now just forking/contributing here. The main things that I see that would still need to be implemented are:

    1. Support for self-weight of the finite elements. I could have missed this but I don't see any density functions etc.

    2. Extend the meshing routines to support quad/rect FE generations with voids/openings

    3. Support for Cracked sections/moment of inertias. Most of the design codes require assuming a fully cracked section. Therefore I think I would need to add a few new variables to allow some sort of coefficients to reduce the gross moment of inertia based purely off the section geometry.

    4. Composite Sections? The cracked moment of inertia is a function of reinforcement and axial load at the section. So I suppose I may also want to add support for maybe a "Reinforced Concrete" material and add some logic to modify the stiffness matrix based on this.

    5. Easy way to add line loads + eccentricity to the meshed structure and convert these to lumped nodal loads/moments at the individual FE plates.

    6. Second order analysis for geometric stiffness to handle the P-delta contribution to ultimate load moments.

    I am pretty sure I know how I would code most of these as for implementation but I am curious of your inputs if you have already implemented any of the above and I missed it. Or if you have any thoughts or see any fundamental issues to implementing these.

    Again great work and I wish I had found your library sooner!

    question 
    opened by qjones81 12
  • Orienting the support

    Orienting the support

    Hi Graig,

    Hope you are doing well and hope you remember me. I have released the standardsolver beam analysis and it is getting some good reviews. It is not very popular yet but I am spreading the message. Got some good reviews in Reddit.

    https://www.reddit.com/r/StructuralEngineering/comments/kgyzcr/free_beam_analysis_software/

    I am now working on building a similar calculation for 2D frame analysis.

    I have a feature request if it is possible.

    For nodal supports, they can be only aligned in global X, Y. Is there a way to specify an angle to them with respect to the global axis, For example, if you want to apply only lateral restrain to an inclined member and allow the member to move axially free, At present, it seems it is not possible from reading the wiki.

    image

    Regards Lino

    enhancement 
    opened by linokl 0
  • Plate3D non-uniform load

    Plate3D non-uniform load

    It will be usefull if Plate3D element can support non-uniform (trapezodial) loads. Is there any way to load Plate3D element non-uniformly that i can't see?

    enhancement 
    opened by eykaraduman 1
Releases(v0.0.68)
  • v0.0.68(Sep 14, 2022)

    Bug fix for member distributed loads on physical members. Added a unit test to check for this error going forward. This bug only affected physical members (new as of v0.0.67) that had distributed loads and internal nodes.

    Source code(tar.gz)
    Source code(zip)
  • v0.0.67(Sep 13, 2022)

    • Added physical members. Members now automatically detect internal nodes and subdivide themselves and their loads.
    • Refactoring: deprecated old method names for member results. You may now have some errors show up if you still try to get member results using the old method names.
    • Bug fix for P-Delta analysis. Global displacements were correct, but member internal forces were neglecting the geometric stiffness matrix. The impact of this bug was minimal, since the strain induced by correct global displacements was still being considered prior to this update. You should see a slight change to member P-Delta results.
    • Code simplification for P-Delta analysis.
    Source code(tar.gz)
    Source code(zip)
  • v0.0.66(Jul 30, 2022)

    • Code simplification and bug fix for merging duplicate nodes.
    • When nodes are merged, support conditions for the deleted node are now assigned to the remaining node.
    • Added a linear solver for faster analysis of simple models. If you don't need P-Delta analysis or tension/compression-only analysis this solver saves time by only assembling the global stiffness matrix once.
    Source code(tar.gz)
    Source code(zip)
  • v0.0.65(Mar 8, 2022)

    v0.0.65

    • Improved the merge_duplicate_nodes method. It seemed to be working, but it was hard to follow, and there may have been cases where it didn't work as expected. Simplified the code for this method to make it clear what it was doing, and to make it more efficient. Added comments explaining each step.
    • Screenshot size is now adjustable when rendering.
    • Fixed a bug for RectangleMesh where it could not be used repeatedly.
    • Refactoring: changed Name to name throughout code. For example, Node3D.Name is now Node3D.name.
    • Fixed obsolete method names that had not been updated.
    • Scalar bar text size can now be controlled. It had strange behavior before. It would change with the window size (until the window size was too small).
    • More work on the new Renderer class. This class is being built to give the user more control over the appearance and behavior of renderings.
    • Bug fix for nodal springs applied in the 'RY' and 'RZ' direction. Exceptions were being thrown in some cases.
    Source code(tar.gz)
    Source code(zip)
  • v0.0.64(Feb 4, 2022)

  • v0.0.63(Feb 4, 2022)

    v0.0.63

    • Fixed the add_mesh method. It was not working properly after version 0.0.62.
    • Made stability checks optional. Stability checks add significant solve time. If you are confident your model is stable, you can skip the stability check by toggling check_stability to False in your call to your analysis command. In the future I may move the stability check out of the analysis commands entirely and make it its own method. The analysis methods are getting complex and this check just adds to that complexity.
    Source code(tar.gz)
    Source code(zip)
  • v0.0.62(Feb 4, 2022)

    • PyNite now checks for nodal instabilities when analyzing a model. If nodal instabilities are found, PyNite will output the unstable nodes and directions to the console, and will throw an exception.
    • Added a method called rename to the FEModel3D class for quickly renaming all the nodes and elements in the model in sequential order.
    • Added a last_node and last_element attribute to the mesh class. These methods can be used to get the name of the last node or element in a mesh.
    • Improved the reliability of the add_mesh method. It now can handle adding meshes containing node and element names already defined in the model. It automatically resolves the duplicate names.
    Source code(tar.gz)
    Source code(zip)
  • v0.0.61(Jan 27, 2022)

  • v0.0.60(Jan 26, 2022)

    • Fixed a stubborn bug that wouldn't create openings if they didn't have a node inside them. This prevented openings from showing up in small meshes.
    • Added unit testing to help identify similar problems with mesh openings in the future.
    Source code(tar.gz)
    Source code(zip)
  • v0.0.59(Jan 26, 2022)

  • v0.0.58(Jan 26, 2022)

  • v0.0.57(Jan 26, 2022)

  • v0.0.56(Jan 26, 2022)

    • Bug fix for orthotropic rectangular plates. The stiffness was slightly off on rectangular plates in version 0.0.55. Prior versions were not affected. Version 0.0.55 was the latest version for less than 24 hours, so this bug shouldn't have affected most models users have built.
    • Added unit testing for in-plane (membrane) behavior, and stiffness modification factors to identify issues faster in the future. PyNite solutions matched theoretical solutions within 0.1% for uncracked sections, and within 2% for cracked sections. Very good performance for in-plane behavior.
    Source code(tar.gz)
    Source code(zip)
  • v0.0.55(Jan 25, 2022)

    • Added stiffness modification factors for rectangular plate and quarilateral elements. Orthotropic in-plane behavior can now be modeled. This can be used to model the cracked stiffness of concrete and masonry for in-plane loads. Exercise caution when using this feature. These factors only apply to in-plane stiffnesses in the element's local x and y directions. Out-of-plane stiffnesses are not modified. Ensure element local axes are aligned to the directions you want to apply the stiffness modifications to.
    • The arguments for many methods relating to rect plates and quads have been reorganized with the addition of the stiffness modification factors. With this update any plate/quad models you have will likely need to be updated.
    • Reformulated rectangular plate element in-plane (membrane) forces. These elements are now isoparametric just like the quad elements. This was done to make them orthotropic.
    • Improved docstrings for plates and quads.
    Source code(tar.gz)
    Source code(zip)
  • v0.0.54(Jan 6, 2022)

    • Bug fix for member point loads applied in a global direction. They were overriding the member end forces due to an ambiguous variable name.
    • Bug fix for rendering. Several variable names had underscores that didn't belong there. It was causing rendering errors. See version 0.0.53 notes for a full list of what's been changing with regard to rendering.
    Source code(tar.gz)
    Source code(zip)
  • v0.0.53(Dec 24, 2021)

    • scipy is now optional for the dense matrix solver. By default PyNite uses the sparse matrix solver. If you wish to use the dense matrix solver, you'll need to set the sparse parameter equal to False when you analyze a model. Generally, the sparse matrix solver is faster and uses less memory. This feature was added to improve compatibility with other programs that may not work well with scipy.
    • Started work on a Renderer class for visualization to better organize the code.
    • Renamed several variables in the render_model function to make them more descriptive of what they control. If you use keyword arguments in your calls to render_model you may need to change some of the variable names.
    Source code(tar.gz)
    Source code(zip)
  • v0.0.52(Nov 6, 2021)

    • Major bug fix for quadrilaterals. In-plane stiffnesses were 1/4 of what they should have been.
    • Added more unit testing for plates and quadrilaterals.
    • Fixed a bug where cylindrical quad meshes didn't calculate the number of quads that fit in the circumference correctly. This bug only affected models where the number was not explicitly specified.
    • Added plate/quad surface load validation to ensure loads are not added to ficticious plates/quads.
    • Improved the remove_duplicate_nodes method. It wasn't working properly for springs. It also now returns a list of the names of the nodes that were removed. Also added a docstring for this method.
    • Added the orphaned_nodes method that checks the model for orphaned nodes and returns a list of the names of orphaned nodes.
    Source code(tar.gz)
    Source code(zip)
  • v0.0.51(Oct 13, 2021)

    • Internal changes to some matrix operations. This was in response to Issue #102 where statics were not checking out for some 3D plate models.
    • Reduced stiffness of plate/quad element drilling degree of freedom. Again in response to Issue #102.
    Source code(tar.gz)
    Source code(zip)
  • v0.0.50(Oct 1, 2021)

    • Bug fix for cylindrical meshes.
    • Added tension/compression only support springs. This required some reworking of how support springs are implemented. See the "Beam on Elastic Foundation" example for an example of how to properly use support springs.
    • More PEP8 style changes. This shouldn't change the way you use the program. Some of the internal calls to function names still referenced the old function names. It was leading to deprecation warnings during runtime.
    • Fixed a divide by zero error for plotting contours on models with nodes not attached to plates/quads.
    Source code(tar.gz)
    Source code(zip)
  • v0.0.49(Sep 2, 2021)

    • Major speed boost. A lot of time was being wasted reading/writing to a SciPy lil_matrix format. The stiffness matrix is now assembled as a coo format first, and then switched to lil format later on to facilitate slicing.
    • Refactored node names to match PEP8 style guide. Instead of iNode, jNode, etc. PyNite now uses i_node, j_node etc. This should only affect you if you were using the keyword arguments for node names.
    • Removed test modules from package distribution. These files were unnecessary for users to have installed on their computers.
    Source code(tar.gz)
    Source code(zip)
  • v0.0.48(Aug 15, 2021)

    • Global load directions can now be used for member loads now. Use capital notation to apply the member load in the global X, Y, or Z direction (e.g. 'FX', 'MY', 'FZ'...). Use lower case notation to apply the member load in the member's local x, y, or z direction (e.g. 'Fx', 'My', 'Fz'...).
    • Bug fix for rendering models without plates/quads (special thanks to tamalone1 for this pull request!)
    Source code(tar.gz)
    Source code(zip)
  • v0.0.47(Aug 13, 2021)

  • v0.0.46(Aug 12, 2021)

    • The size of the scalar bar for plate contours is now a little more predictable. It used to be based off of the window size. Now it only resizes when the window gets really small.
    • The user now has more control over screenshots. If a screenshot is requested, it will be captured when the user closes the render window.
    Source code(tar.gz)
    Source code(zip)
  • v0.0.45(Aug 9, 2021)

    Openings can now be added to rectangular meshes. An example of a shear wall with openings has been added to the Examples folder to help you get started.

    Source code(tar.gz)
    Source code(zip)
  • v0.0.44(Aug 7, 2021)

    • Many method and function names have been renamed to match the PEP8 style guide for Python. For now PyNite is backwards compatible with the old method/function names, but deprecation warnings have been implemented for function names that will be disappearing in a future release. If you see deprecation warnings when you run your code, it's recommended to move your code over to the new method and function names given in the deprecation warnings. This is a big change that will affect most users. I don't plan to make changes this big very often, but PyNite was getting large and complex enough that I had to do it now or never. When I started PyNite I didn't know much about Python coding styles. This change brings the code into better conformance with normal conventions in Python.
    • The ClearLoads method (delete_loads going forward) wasn't deleting plate and quad loads. Fixed this issue.
    Source code(tar.gz)
    Source code(zip)
  • v0.0.43(Jul 31, 2021)

    This is another attempt at a fix for PyNite's link to Travis CI, which automatically tests the code whenever a new version is released. If this worked correctly, we should see the build failing because the unstable structure detection test scenario fails (which is a known issue ever since PyNite moved to a sparse solver).

    Source code(tar.gz)
    Source code(zip)
  • v0.0.42(Jul 31, 2021)

    This is a fix for PyNite's link to Travis CI, which automatically tests the code whenever a new version is released. If this worked correctly, we should see the build failing because the unstable structure detection test scenario fails (which is a known issue ever since PyNite moved to a sparse solver).

    Source code(tar.gz)
    Source code(zip)
  • v0.0.41(Jul 30, 2021)

  • v0.0.40(Jul 26, 2021)

  • v0.0.39(Jul 17, 2021)

Owner
Craig
A registered structural engineer with roots in computer science.
Craig
CadQuery is an intuitive, easy-to-use Python module for building parametric 3D CAD models.

A python parametric CAD scripting framework based on OCCT

1.9k Dec 30, 2022
Leshycam - Generate Inscryption styled portrait sprites from any image

Leshy's Camera Generate Inscryption styled portrait sprites from any image. Setu

3 Sep 27, 2022
A suite of useful tools based on 3D interactivity in napari

napari-threedee A suite of useful tools based on 3D interactivity in napari This napari plugin was generated with Cookiecutter using @napari's cookiec

11 Dec 14, 2022
Viewer for NFO files

NFO Viewer NFO Viewer is a simple viewer for NFO files, which are "ASCII" art in the CP437 codepage. The advantages of using NFO Viewer instead of a t

Osmo Salomaa 114 Dec 29, 2022
Generates images of calendar month tables and can paste them onto suitable photos.

📆 calendizer README Generates images of calendar month tables and can paste them onto suitable photos. A quick way to make your own calendar for prin

Sean Ryan 2 Dec 14, 2022
Python binding to Skia Graphics Library

Skia python binding Python binding to Skia Graphics Library. Binding based on pybind11. Currently, the binding is under active development. Install Bi

Kota Yamaguchi 170 Jan 06, 2023
🖼️ Draw Images or GIFs in your terminal

Drawitor Draw Images/GIFs in your terminal. Install pip install drawitor CLI Tool drawitor cat_dancing.gif Library The library is written in a simple

Eliaz Bobadilla 7 Dec 15, 2022
kikuchipy is an open-source Python library for processing and analysis of electron backscatter diffraction (EBSD) patterns

kikuchipy is an open-source Python library for processing and analysis of electron backscatter diffraction (EBSD) patterns. The library builds on the

pyxem 53 Dec 29, 2022
Tweet2Image - Convert tweets to Instagram-friendly images.

Convert tweets to Instagram-friendly images. How to use If you want to use this repository as a submodule, don't forget to put the fonts d

Janu Lingeswaran 1 Mar 11, 2022
Generative Art Synthesizer - a python program that generates python programs that generates generative art

GAS - Generative Art Synthesizer Generative Art Synthesizer - a python program that generates python programs that generates generative art. Examples

Alexey Borsky 43 Dec 03, 2022
An async Python library to automate solving ReCAPTCHA v2 by audio using Playwright.

Playwright nonoCAPTCHA An async Python library to automate solving ReCAPTCHA v2 by audio using Playwright. Disclaimer This project is for educational

Michael Mooney 69 Dec 28, 2022
A Python package implementing various CFA (Colour Filter Array) demosaicing algorithms and related utilities.

Colour - Demosaicing A Python package implementing various CFA (Colour Filter Array) demosaicing algorithms and related utilities. It is open source a

colour-science 218 Dec 04, 2022
An executor that performs standard pre-processing and normalization on images.

An executor that performs standard pre-processing and normalization on images.

Jina AI 6 Jun 30, 2022
A simple plugin to view APR images in napari

napari-apr-viewer A simple plugin to view APR images in napari This napari plugin was generated with Cookiecutter using @napari's cookiecutter-napari-

5 Jan 24, 2022
ProsePainter combines direct digital painting with real-time guided machine-learning based image optimization.

ProsePainter Create images by painting with words. ProsePainter combines direct digital painting with real-time guided machine-learning based image op

Morphogen 276 Dec 17, 2022
A linear stairs generation add-on for Blender

Linear Stairs Generator Table of Contents Installation Usage Screenshots Important Notes Requirements Blender 3.0 or newer. Installation: Download a z

Elhanan Flesch 4 May 17, 2022
MikuMikuRig是一款集生成控制器,自动导入动画,自动布料为一体的blender插件

Miku_Miku_Rig MikuMikuRig是一款集生成控制器,自动导入动画,自动布料为一体的blender插件。 MikumiKurig is a Blender plugin that can generates rig, automatically imports animations

小威廉伯爵 342 Dec 29, 2022
利用近邻法的弱点实现图片缩小后变成另一张图

这是我一个视频的配套代码。 视频是:利用近邻法的弱点实现图片缩小后变成另一张图 https://www.bilibili.com/video/BV1Lf4y1r7dZ 配套代码中,仅generate.py是核心文件,其余的图片神马的,都是赠品。 这个核心文件利用了近邻法缩放的弱点,可以将图a的像素按

偶尔有点小迷糊 182 Dec 19, 2022
A tool and a library for SVG path data transformations.

SVG path data transformation toolkit A tool and a library for SVG path data transformations. Currently it supports a translation and a scaling. Usage

Igor Mikushkin 2 Mar 07, 2022
Django helper application to easily and non-destructively crop arbitrarily large images in admin and frontend.

django-image-cropping django-image-cropping is an app for cropping uploaded images via Django's admin backend using Jcrop. Screenshot: django-image-cr

Jonas und der Wolf GmbH 546 Jan 03, 2023