-
Notifications
You must be signed in to change notification settings - Fork 110
Feat stress elm local #230
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
Feat stress elm local #230
Conversation
The stresses that are interpolated by the shape functions are the elements nodal stresses not the nodal average stress.
This looks great @normanrichardson! I think we can get it to work based off what you've done here, and I'm happy with the linear interpolation results! Design-wise, I think we can store the section actions in the All the section properties could be retrieved from the Moving forward, do you have the time/enough information to finish this off? If not, I can have a look into it over the next month or so. Thanks again for all your work on this! |
Also love the line plots you've done, seems like it should be easy to build a |
Thanks so much @normanrichardson ! Great work! |
@Czarified no worries, thanks for the prodding. @robbievanleeuwen, yeah I think I can finish this up.
In One thought is to change stress_post to calculate and hold the element stresses, and not the averaged nodal stresses, or maybe hold both. But I would hesitate to go that far for now.
It has been a while, so I'm a little rusty on the details here. Are these |
@robbievanleeuwen I think I miss understood. Would The way I was describing it would work: # the usual above
state = {
'N': 0,
'Mxx': 5e6,
'Myy': 0,
'M11': 0,
'M22': 0,
'Mzz': 3e6,
'Vx': 10e3,
'Vy': 0
}
case1 = section.calculate_stress(**state)
p = np.array([5, ii])
stress_p = case1.get_stress_at_point( p) But what I'm now thinking you're saying: # the usual above
state = {
'N': 0,
'Mxx': 5e6,
'Myy': 0,
'M11': 0,
'M22': 0,
'Mzz': 3e6,
'Vx': 10e3,
'Vy': 0
}
case1 = section.calculate_stress(**state)
stress_p = section.get_stress_at_point( p, **state) Where the type of case1 and stress_p could differ. Is this closer to what you are thinking? |
Yes I was thinking the second option because if a user was only interested in the stress at certain points they wouldn't have to run the entire analysis using def get_stress_at_point(
self,
pt: List[float],
actions: Dict[str, float],
) -> Tuple[float]:
"""description...
e.g. pt = [0.5, 1.5]
e.g actions = state (from your comment above)
:return: Resultant normal and shear stresses (sigma_zz, tau_xz, tau_yz)
"""
# do stuff Disregard the comment about saving the actions to the
Correct, these are just the resultant stresses, calculation as you've highlighted! |
Potential issue: Other potential improvements: |
Correct, pretty sure the stresses are not continuous at element boundaries. This is a common theme in FEA with extrapolating stresses from gauss points. If you could average the boundary result based on the two adjacent elements I think that would be suitable? Regarding the element search, if you think it is worth adding this feature I'm all for it 🙌 |
From my experience, and referencing a "Practical FEA" textbook, element-nodal bilinear extrapolation with nodally averaged boundary results is common, and with a slight conservatism. I could look up the reference, if you're curious. |
@robbievanleeuwen let me know your thoughts. Thanks |
I realized that I need to update the docstring to include the return type of |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is great, thanks @normanrichardson! A few small minor spelling/docs items but the rest of it looks good to me!
Thanks so much, @normanrichardson ! Great work on this feature! |
Agreed thanks again @normanrichardson! I think this is a really useful addition to sectionproperties! I'm hoping to overhaul the docs in the near future and will definitely be adding an example that uses this feature! |
No worries, any time. It was good to partially dust off the fea knowledge |
This is draft for some of basic elements of issue #175. It gives the ability for the Tri6 element to determine its stress at a point within its domain.
Known limitations:
Tri6.local_coord
that take a global coordinate and maps it to a local coordinate (or physical coordinate to a natural coordinate) are based on alphine transformations and are not general enough for isoparametric triangular elements. The mappings are sufficient for "straight line" Tri6 elements. I believe the underlying meshertriangle
is limited to "straight line" Tri6's.In it's current state this can be used as follows: