Open qjones81 opened 3 years ago
Thanks for the complements. I'm a structural engineer first and a programmer second. I started learning how to code FEA with xlFrame about 10 years ago, and then in 2017 started converting xlFrame's code into Python to create PyNite. Python brought a whole lot of functionality with it that I just couldn't get with Excel/VBA. The last year or two PyNite's code base has really started to mature with each new feature able to build on the previous features. I'm definitely looking for more contributors to help this project grow and remain sustainable/relevant. Regarding the features you'd like to see:
Self weight is something I would like to add too. At some point I plan on introducing a Material
class that handles density that you can assign to members. I'd also like to add a Section
class that handles section properties. This will require reworking the Member3D
element a little to recieve a Material
and a Section
as arguments instead of outright defining those properties, but it's on my radar. I'd also like to use pandas
to pull in the AISC database to draw from for steel.
One of my next goals is to improve mesh routines. The RectangleMesh
object has been set up with openings in mind. It has control points built into the meshing routine. In a future release I plan to use these control points to help it mesh around openings. I design a lot of shear walls with openings, so this feature is something I plan on implementing soon.
Cracked section properties are a matter of modifying the element moment of inertia. For out-of-plane wall analysis you'd probably want to use the effective moment of inertias defined by ACI (or TMS for masonry). You could build the wall panel out of multiple members to track displacements at the nodes (P-little-delta) and run a P-Delta analysis (FEModel3D.Analyze_PDelta()
). I generally do that rather than using the iterative slender wall provisions that adjust the moment of inertia (Icr) on each iteration and therefore don't lend themselves to FEA very well - although you could do that with PyNite if you wanted.
I see cracked section analysis for concrete as a class inheriting from the Material
and/or Section
classes I mentioned in comment 1. A little further down the road, but definitely possible to implement. I'd also like to implement moment-curvature relationships and pushover analysis at some point... but that's way down on the list of priorities.
I plan to eventually improve the surface load options for plate elements.
Second order geometric stiffness analysis is already implemented in the P-Delta analysis feature. A Kg
matrix is assembled for each member that is a function of the axial load on the member. Iterations on the Kg
matrix are run until convergence of nodal displacements/rotations is reached within the specified tolerance, or until divergence is detected.
I'd be glad to have help. If there's something you want to add I do take pull requests. I recommend you let me know what you want to add in advance so we don't work over the top of each other, and so we can work it in a way that integrates with other features I plan to add. Right now I'm focused on restyling the methods to match the PEP8 style guide. I came over from VBA, so learning "Pythonic" ways to code took some time.
Great! Thanks for the thoughtful response. I am actually a programmer first, and "engineer" second (I do software development for a structural engineering firm). As codes/structures are getting more complicated I am trying to implement some ways to do more extensive analysis etc.
That is great the second order effects are already implemented. I didn't realize the P-Delta function worked as you described(Which would work well).
As for my preference where to start it would most likely be on the self weight portion followed by the meshing with openings. I will create a fork soon and start trying a few concepts and see what I come up with. After that I will get back with you and make sure we can implement it in a way that fits well with your overall vision etc.
Thanks!
Codes are getting much more complicated than they used to be. Second order analysis requirements for slender members is a prime example of that.
I think the first step in implementing self-weight would be to allow loads to be defined in a global direction on an arbitrarily oriented member. We almost always define gravity to act in one of the principle directions (X, Y or Z). Issue #87 discusses this topic and how one might go about it. I think there's a simple solution for this involving the transformation matrix T
for the member (already built into PyNite's Member3D
object). That matrix converts member local forces into global forces and vis versa.
Rectangular meshes with openings are now supported. See the new shear wall example in the Examples folder
Very nice! I was looking at this over the weekend and was converging on a similar solution. The control point algorithm you have is quite nice. I was going to just skip adding any nodes in the voids, but the post deletion method you have here works for me.
I am now looking into the plates and adding self weight + global coordinate loading etc. It should not matter but I am curious why the rectangular plates (the kirchoff equivalent ones) are not formulated isoparametrically similar to the MITC4? I am thinking it would be best to add the self weight by using the body force vector and integrating over the volume of the plate element. This should be easier in the isoparametric natural coordinate system.
Thanks!
I'm sure there's a more efficient way to do it than deleting the nodes after the fact, but it seems to work well for now. If I find it becomes cumbersome at some point I'll look at improving the algorithm.
The isoparametric formulation on a four noded quad produces excellent plate center stresses, but poor corner stresses. They are secondary values being extrapolated from a numerically integrated solution at 4 gauss points. A polynomial formulation does a much better job at the element corners (as long as Kirchoff theory applies). No extrapolation or numerical integration involved. However, a direct solution of a quad is mathematically impossible - only rectangles for polynomial solutions.
There's a good demonstration of the corner stress issues here: Quad Example. The comments are worth reading if you want to dig into the details.
See also this eng-tips discussion for a detailed discussion about the quad element's behavior.
It sounds like you're working on self-weight for plates and quads. I think I'm ready to start implementing globally aligned loads for the Member3D
element if you haven't started on that yet.
Correct. I am probably being a bit biased/selfish. But yes our main use case is for tilt wall panel design, and thus plates/quads :). I am also tinkering with some ideas for material classes etc so I can implement reinforced concrete more easily. Eventually I would also like to add "stiffener" elements for the walls(Pilasters, Lintels, Spandrels etc) Will probably use Member3D
+ reinforced material class for that functionality.
I should caution you then that the Kg matrix is only available for the Member3D object at this point. P-Delta effects aren't captured for plates/quads. If you want to account for the slender wall effects using plates/quads you'll need to use ACI's moment magnification equations to magnify your design moments for the presence of axial load. It's a fairly simple procedure.
Another alternative (which most engineers do in practice) is to model the wall as a beam. Openings are accounted for by increasing the distributed load at the lintels and sills to account for 1/2 of the opening.
A good slender wall example for masonry: https://cmacn.org/product/masonry-chronicles-spring-2010/ Concrete is similar.
In addition to the local directions, member loads can now be applied in the global directions as of v0.0.48. I haven't added this feature to plates/quads.
If you plan to do this for plates/quads, you may want to look at my code in my recent commits to see how I implemented it. It was fairly easy to do using the member's transformation matrix.
Thanks for the update!
I had not realized that plates did not have the geometric stiffness matrices. I have been working through some derivations the last few days for this and believe I have come up with the appropriate equations for the Kg
for plates. Plan to test these on some ground truth test cases soon...
The design guide you posted is very much the process we currently use for our panel design. It does work really well for us but unfortunately has a few edge cases that are not easily handled and I am of the belief an FEA analysis will help these cases. In particular for good in-plane shear analysis.
Also global load additions look good. It took me a bit to notice the subtlety between Fx
and FX
. Works nicely though. The only thing I would add(I doubt you are worried about this in priority as most loads are added in the main 3 cartesian directions) but it would be nice if you could add load vectors of any arbitrary orientation without needing to specify a direction etc. The backend functions would just transform and pick out the proper vector components etc.
All said and done I am impressed with how much traction you have on this project! It is well on it's way to being one of the most complete open source FE implementations out there.
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!