AppliedMechanics / AMfe

Nonlinear Finite Element Code for structural applications with simplicity in mind.
Other
27 stars 14 forks source link

Adding time-varying forcing from controller #1

Closed jjalora closed 2 years ago

jjalora commented 2 years ago

Hello AMfe team!

I was looking around for finite element code that had ECSW implemented and thankfully stumbled upon AMfe!

I'm working on developing real-time, optimization-based controllers (e.g. Model Predictive Control) for reduced order models (with soft robot applications) and so I was hoping to leverage AMfe's very well-established codebase for this research.

What I'd like to do is to compute a reduced model of my mechanical system using ECSW and use it as a surrogate model to compute control policies, which I would then introduce into the original (non-reduced system). My questions are...

  1. Is there a straight forward way to introduce time-varying forcing with the current code-base? Looking at the code, it seems that one way to do this would be to formulate it as a constraint (but that seems to require having to redefine the mechanical system)?
  2. How do I select which nodes to apply forcing to?
  3. Do there exist formulation of the mechanical systems that allow for large displacements?

Looking forward to hearing from you and thanks for the help!

Best, John

aseibold commented 2 years ago

Hello John,

thank you very much for your interest in our FE-software AMfe and we would be glad, if it could help you in achieving your goals.

I do think, almost everything, you're asking for, is already there, if I got right, what you are trying to do:

  1. you can define time-dependent forces using the force-functions in amfe/forces. As soon as you've chosen your function, you can apply it to boundary-elements, using the UI-function set_neumann_by_group or set_neumann_by_elementids.

  2. the UI-functions do not provide an option to apply a force to a single node, as this will introduce a singularity. Moreover, the element-assembly-routines wouldn't work with node-ids. If you still want to have a force applied to a single node, you could do that manually by assigning a custom f_ext-function to the mechanical system, that returns the force-array, instead of calling the component. The required dofs can be obtained from the component's mapping-object.

  3. Large displacements are actually supported by default. It's the other way around, in case of a linear model, you'll have to explicitly define that via the constants in the mechanical system.

I hope this helps you. If you have further questions, feel free to contact us. If you would like to contribute to this project, you are welcome. I would suggest to have some kind of online-meeting first, though. Such that, we can define a proper workflow.

Best, Andreas

jjalora commented 2 years ago

Hi Andreas. Thank you for the very helpful response! I'll continue to parse through the code but I think as it stands, it will do for what I'd like to do. I'll admit, I have no experience working with finite element code, but I'd certainly be happy to contribute once I'm comfortable with the codebase and if your team has interest in providing support for controller design/synthesis.

I will undoubtedly have questions in the future so thank you for the offer! Would you prefer me to continue to open issues or reach out directly?

Best, John

aseibold commented 2 years ago

Hi John, as a general advice how to familiarize yourself with AMfe, I highly recommend to start withe the _ui_examplebeam.py in examples. This utilizes the ui-module, which simplifies the usability a bit and wraps up some functions. From there, you can go "top-down" through the routines.

Regarding general support for AMfe, I would recommend to discuss that via e-mail (andreas.seibold@tum.de). The issue-section is supposed to be rather something like a section for bugreports an new proposed features.

Best, Andreas

jjalora commented 2 years ago

Great! Thanks Andreas, I'll go ahead and close.