-
-
Notifications
You must be signed in to change notification settings - Fork 95
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Moving to v1.0.0 w/ API consistency #202
Comments
I'll jump in and say that I agree that the package is almost ready for a v1.0 release. I have been using the 1D Member elements in production code for a while now and it has performed flawlessly, though I'll admit it is a little tricky to maintain due to the regular breaking changes. I would like to incorporate the 2D elements (Quads) into production code as well, though it seems they're not quite ready yet. I think this is a good time to open the discussion around what the API workflow looks like in a v1.0 release. I've addded a few of my own thoughts below:
I understand much of the above would constitute breaking changes, but I want to make sure they're considered before pushing ahead with a v1.0 release. |
I am also quite interested in solidifying the API since I think this library is working great and I think has a good balance of scope and ease of use. I think it might be a good idea to share our wishlists in this threads so we can decide where potential breaks in the interface might occur and design an interface that wont break when these changes are added if not at the 1.0 release. I have a couple of changes I would like to make and think some of them are significant changes so It would be nice to get those in before 1.0 vs after to prevent breaking changes.
Changes I'd want to integrate are here: Another interesting Idea would be to create a github-organization to integrate engineering oriented libraries that many brilliant people have put together. A library I am using |
Thanks for the input. Here are my thoughts: @bjhowie (not completely in the same order as you have):
In summary, @bjhowie is proposing a series of API changes too be considered. I think they make sense but I take direction from @JWock82 :) @SoundsSerious has some very cool features suggested and I think they can all be implemented without API breaking changes (except the @JWock82, would love to hear your thoughts whenever you have the capacity :) Thanks all! |
Wow! I appreciate all the insight and interest in Let me say I agree for the most part. I've been trying to decide when is the right time to do a v1.0.0 release, and I think I'm close. I'm still sorting out a few issues with plates/quads on the DKMQ branch, and I'd like these changes to be part of the v1.0.0 release. I've generally tried to follow the PEP-8 style guide for python, which uses first letters capitalized for class names. I'm open to other style guide suggestions, but I don't want to disrupt too many users.
Plates and Quads offer different advantages at the moment, but the DKMQ element will bridge the gap. Plates currently produce better stresses near boundaries, but they have the limitation of being rectangular, and do not consider thick plate behavior properly. They also solve more efficiently. Quads have the advantage of being able to be any quad shape, and of being able to model thick plates. The new DKMQ element will give us the best of both worlds. I'm really close to being done with the DKMQ. The models I'm testing are producing good internal stress results, but for some reason I'm getting strange element corner forces. I think I'm chasing down a typo at this point and when I find it I'll push the DKMQ branch to the main branch and will replace The only disadvantage I see between tying shear modulus to poisson's ratio is that sometimes for non-linear material approximation users may want to adjust one without adjusting the other. We may want to keep them separate. For example, adjusting the shear modulus to account for shear cracking while not affecting the poisson effect for axial loads. This is a pretty far fetched case, especially if the built-in stiffness modification factors To interact directly with Members/Quads/Plates without using the dictionaries we'd have to build some helper methods as you've noted into the I like the idea of integrating These are great ideas. Let me get the DKMQ branch sorted out, and then I'll start looking at pull requests. Also, if any of you want to become maintainers, let me know. Pynite's usage has exploded in the last year, and I'm getting a lot more e-mails about it than I have in the past. I'm struggling to keep up with them all. Lot's of great ideas, but only one Craig at this point, and I tend to focus on the features that are most useful to me - I have a killer |
@JWock82 This sounds great. I am going to start submitting incremental PRs to address the following (in this order) to move towards v1.0:
My intention is to submit small PRs with clear scope to make it easy for you to review/comment/reject/approve each one. I am going to start working on these Thursday, July 25th in the AM. If you are up for it, I would be happy to be a maintainer (I have capacity for this now). You have my contact info so we can coordinate this offline if you want. If you could create a |
@connorferster @JWock82 great points about the scope of materials and sections, there's alot of possibilities but I think youre right that its better to get solid functionality vs adding every feature under the sun, hence the V1.0 stability imperative :) Looking through my code for what is ready for integration without breaking anything, I think I can work in a similar pattern to @connorferster to minimize the impending integration hell. In general I am motivated to improve the meshing capabilities as I've found working with multiple meshes to be frankly a pain in the butt, and actually writing meshing code is even less fun. However having a system that could effortlessly merge meshes, or join-frames into assemblies would be really cool
Features which I think it might take some thinking about are a redesign for saving/loading results, but would be worth it I think. This kind of also fits with the meshing improvements scope. I think data structures our our friends here, Another idea would be to just hold one set of displacements at a time and develop a strong On the topic of materials / sections I dont think there really is a good library for this out there, despite @connorferster for snake case and formatting I think maybe we just want to get a CI workflow setup with github actions, using a formatter like |
Checking in again... I'm still stuck on these DKMQ elements. They are producing correct internal forces in the plates, correct deformed shapes, displacements and contour plots, but for some reason the statics checks are failing and the plate node forces are not correct. Really confusing to me how some results can be so accurate while others are off. I've stared at the code for hours trying to find the issue and cross-compared with the equations in the literature I'm using to derive the DKMQ, but no luck finding the bug. I think I'm going to keep working at it, but I don't want the DKMQ element to hold up production anymore. This weekend I'm going to look at it one more time. If I don't find the issue this weekend I'll have you start pushing your 1.0 changes to the main branch instead of the DKMQ branch, with the plan that DKMQ will come along later. |
@JWock82 sounds good! I am excited to get into the @connorferster Thinking about your concerns about immutability on I found organizing nodes via their hash directly in a dictionary to be useful, hence the change. At present the dictionary structure is organized with the key as each nodes name so a hash of each nodes name and use the node directly as a key in the dictionary is essentially equivalent. As an alternative in the current api there isn't a way to move nodes so a hash on its X,Y,Z coordinates (vs the name as it is now) would be consistent with current concepts. In the That being said, maybe node names are just another thing to maintain arent they? I could see the benefits of querying by a name however, and as well querying in space. An alternative could be to allow for node aliases to be queried, or alternatively nodes could be given a readable hash name:
|
@JWock82 I want to voice my support of you completing the DKMQ branch. This is something you have been working on for some time and would be a real boon to the package. I am excited for the possibilities it brings to thick concrete slab design. If it takes longer to work out the bugs, that's ok with me. @SoundsSerious and I have also forked the DKMQ branch for our PRs so it would be easiest if the DKMQ branch gets merged :) When I am debugging, I often find the following mantra helpful: "The data that I think I have is probably not the data that I actually have." Meaning, that most of my functions might actually be working but the data that is coming in to them might not be what I am expecting it to be. So that's where I start checking. You got this!!! Let me know if you want another set of eyes on it (you would need to email me the reference material). |
@connorferster agreed, there's no reason we have to rush this, in fact its probably better if we dont :) Since it sounds like youre pretty close on DMKQ perhaps we can create a branch off your latest commit on that branch @JWock82 for v1.0 so @connorferster and I can work on the PR merge. Depending on progress & timing DMKQ could be merged to main first then V1 or V1 could be merged to main pulling in your latest changes on DMKQ. The old divide and conquer! |
I’ve tinkered some more with the DKMQ element. It looks like the DKMQ is derived using a swapped nomenclature from MITC4 for rotations about the local x and y axes. Not sure if I’m looking at it right, but I’ll try swapping it and testing a few things. Progress happens one baby step at a time. |
Update: I've isolated the issue and now my statics checks are passing. After checking and rechecking my DKMQ code multiple times, I decided either 2 authors had incorrect DKMQ derivations, or the element wasn't plugging into Pynite the way Pynite expected it to. Apparently, the papers I'm using to derive the DKMQ use a different sign convention from Pynite's sign convention and from the MITC4's and other plate elements' more traditional sign convention. The DKMQ also swaps the x and y axis for bending. I've got good results coming out of the elements now, and just need to swap the sign convention for a few more methods. Isolating that bug stumped me for 2 or 3 months. So frustrating to debug, but so satisfying once the overall statics checks finally passed! |
@JWock82 Great work! 🤩 |
Brilliant stuff, @JWock82! I'd have rage-quit long ago. |
Another update: I've done a little more work on the DKMQ element, and more testing, and it is performing nicely so far. I'm noticing a major improvement in plate bending stresses at fixed edges over the old MITC4 formulation. I've still got a few more parts of the code to correct and a few more tests to run, but I think this element will be ready to go within the next week or two, depending on how much free time I can find to finish it up. |
The DKMQ branch has been merged into the main branch. |
@JWock82 Amazing! Congratulations! |
Following on from the discussions above, I'm going to start working on a pull request to enforce the use of member section properties. This will probably be the most painful of the breaking changes, so best to get it out of the way early. |
On the topic of breaking API changes, I think it is worthwhile modifying the FEModel3D constructor functions to return the instance of the newly created object rather than the name assigned to it. For instance, the I find myself constantly looking up newly created objects in the relevent FEModel3D dictionaries immediately after calling the constructor methods, which feels a little inefficient. For consistancy and ease of use, constructor methods that currently accept object names should also accept instances of the relevant object. For instance the Would be keen to hear other's thoughts on making this change prior to a v1.0.0 release. |
Is your feature request related to a problem? Please describe.
PyNiteFEA continues to develop as a great project and I love using it (and teaching others to use it!) I know at least one engineer who relies on it for production engineering work (awesome!)
As PyNite is not in v1.0.0 yet, there have been some breaking changes to the API recently (part of which I addressed in #194). This is to be expected since the major version is still
0
. I am proposing that PyNite could be ready for av1.0
after doing some final house-keeping updates to the API. Once doing a v1.0 release, this would mean that the names of all classes, functions, parameters, and parameter order would stay fixed until it is decided that the existing API no longer serves the future of the project.To be clear, additional features can be added to the v1.0.0 release (e.g. new element types, new solvers, new methods, new attributes, etc.) but the default settings would need to remain and the new features would be optional.
(Apologies if you are nodding your head saying, "yes, yes, I know this..."; I am just stating it for clarity)
Describe the solution you'd like
I am proposing to open a PR (off of the DKMQ branch) to perform the following tasks to move towards a consistent API and to facilitate a stable v1.0 release:
model.Members
would becomemodel.members
, andmodel.LoadCombos
would becomemodel.load_combos
import Rendering
would becomeimport rendering
.import FEModel3D
for historical reasons and because I think it just makes sense.Describe alternatives you've considered
We could also do nothing and leave things as they are. Breaking changes currently seem to happen unexpectedly though and, when they happen, it gives the impression that PyNite is "buggy". I think that PyNite is stable enough to consider a v1.0 release and give users confidence going forward that their scripts and models written against v1.x releases will always be able to run. This still allows PyNiteFEA to continue to grow rapidly through the addition of new features as attributes, parameters, functions, and classes can always be added without having to change the names of existing attributes, function, and classes.
Additional context
Moving to a 1.0.0 release can also facilitate improved git branch management techniques. See #201
The text was updated successfully, but these errors were encountered: