Welcome to the FEBio Forum. This forum serves the community of FEBio and FEBio Studio users and developers. Forum participants are encouraged to post questions, as well as answer posts from others. A broad level of participation is encouraged, to create a vibrant community that helps improve the quality and usefulness of these open-source/free software products. Moderators are here to assist with explaining novel features, addressing bug reports and reviewing feature requests, but the effectiveness of the forum depends critically on the participation of experienced users who can assist novices or share ideas and models that explore challenging problems. Please feel free to join in this effort. You can subscribe to forums by pressing the "Subscribe" button at the top of the forum. This will allow you to stay up to date on recent activity on the forum.
The FEBio software downloads and knowledgebase can be found here.
Self-contact is allowed in the sliding contact interfaces. Just select the same surface(s) as primary and secondary. When using sliding-elastic contact, make sure to reduce the search_radius to a small enough value.
Apologies it took me this long to respond. I have been trying to simplify these meshes so our simulation does not fail before getting to the contact portion of the problem. I am also now using the latest version of FEBioStudio.
My model is a little different now, but the problem is still the same (Figure 1-2). I followed your suggestion and went from the default search_radius = 1 to 0.1 and 0.01. In either case, the simulation ended at 76-77%, with 0.1 getting further.
Here is a summary of the sliding-elastic contact parameters;
The fact that you got so far means that the analysis was set up properly, so that's a good place to be.
Difficulties in contact convergence can occur to a variey of factors, but here are a few more things you can try:
Make sure that the analysis step uses a non-symmetric stiffness matrix (because this sliding-elastic contact interface has produces a non-symmetric stiffness).
You can turn laugon=1 and reduce the penalty from 10 to 1. Start with the default tolerance (0.2), but you can reduce it if you find that the contacting surfaces overlap too much.
Great news!
I actually got the simulation to converge using the penalty method (penalty = 1, search_radius = 0.1).
First, I confirmed that all of the simulations were non-symmetric and the quasi-newton method used was broyden.
I am never clear of the interaction between the auto_penalty flag and the penalty value itself, when both are active of course. I wonder if this had an effect?
Fluvio L. Lobo Fenoglietto CTO, Principal Engineer
Digital Anatomy Simulations for Healthcare, LLC
When auto-penalty=0, the penalty value represents the contact stiffness, you need to provide it in units of force/length.
When auto-penalty=1, the penalty value is a scale factor that multiplies an estimate of the contact stiffness obtained from the material properties (Young's modulus) and local finite element thickness (element volume divided by area of the contact face).
After getting this convergence on the folding surface, I went back and added a second contact condition that describes the tissue sliding along the curved chest wall.
The second contact condition is also defined by a sliding-elastic formulation, with tension enabled.
I am having issues with converging using the penalty or the augmented Lagrangian method, so just wanted to get your thoughts...
As opposed to the previous contact problem, larger penalty values helped with convergence, but only until 120. With a penalty = 120, the simulation fails at 0.453 (45%).
When penalty was set to >120 (e.g. 130, 150, and 200), I did not get the first step to converge. Note that I am using the auto_penalty too.
Here I figured I could try using the augmented Lagrangian method for once.
With a gap_tol = 0.1 and a tol = 0.01 I get as far as 0.30 (30%). I got the furthest with a gap_tol = 1 (0.36 or 36%). But increasing the gap_tol > 1 (e.g. 10) or increasing the tol > 0.01 (e.g. 0.2), I only got to 0.25 (25%).
I know there is a risk with having both gap_tol and tol on at the same time, according to the manual, but perhaps I am missing something else?
Fluvio L. Lobo Fenoglietto CTO, Principal Engineer
Digital Anatomy Simulations for Healthcare, LLC
In general, when using a stringent value for <gaptol>, you should turn off the <tolerance> (set it to 0). Similarly, if you turn on <tolerance>, I recommend turning off <gaptol>. When either of these tolerances is set to be too tight, you may find that your analysis can never achieve those desired tolerances, especially if the mesh is relatively coarse. In that case however, the code will simply augment until maxaug is reached, then continue with the next time step. So, in principle, the values of the tolerances should not affect the termination time of the analysis. This makes me suspect that you might be using a quasi-Newton method to solve this problem (e.g., BROYDEN or BFGS)? If so, I recommend switching to a full-Newton analysis. The reason for that is that the stiffness matrix in a contact analysis changes as the contact interface evolves, so a quasi-Newton method may lead to poorer convergence and, possibly, premature termination.
For the problem description you have provided, it is unclear to me why the tension flag should be turned on. Have you tried running the analysis with that flag turned off?
Let me clarify. I have two contact conditions going on.
The first contact condition (left) is for the skin folding over itself (this was the original problem, which I was able to solve with a sliding-elastic contact(auto_penalty = 1, penalty = 1, search_radius = 0.1) and using BROYDEN
The second contact condition (right), on the same problem, is for the tissue sliding along the chest wall (red arrows). I am also using a sliding sliding-elastic contact and having the issues described above. This also uses BROYDEN
We have applied sliding to previous models. If you recall, my colleague Tres and I worked on a normal displacement constraint this past summer.
I will try using the full-Newton method. In order to set-up the full method, do I set the number of max_updates = 0?
I will try a few things, but this response should sort of clear the approach.
Fluvio L. Lobo Fenoglietto CTO, Principal Engineer
Digital Anatomy Simulations for Healthcare, LLC
We are getting closer, but we still have some issues...
I went ahead and started using a full-Newton method by setting <max_ups = 0> and also increased <max_refs = 50>, which I found advised on the FEBio user's manual.
Sadly, I still do not get a convergence with both contact conditions together. In the best scenario, my simulation fails between 46% and 48% of the way through.
I went ahead and split the problem in two parts. First, applying only the sliding elastic contact (Contact #1) to avoid surface penetration when the tissues folds over.
I was able to get through the entire simulation with the following parameters;
Then, I created a model with only with the sliding elastic contact allowing the sliding of the tissue along the chest wall (Contact #2).
I believe the entire issue is related to this contact condition, but do not know if changing the simulation parameters is enough...
I have tried;
- penalty = 120, auto_penalty = 1 -----------------> 48%
- augmentation_tol = 0.2, gap_tol = 0 -------------> 46%
- augmentation_tol = 0, gap_tol = 1 -------------> 46%
I have tried other combinations, with higher and lower tolerances and penalty factors, but these are the best results I get... always around 46-48%
Is this an indication that the mesh needs refinement?
...maybe re-meshing?
Thank you!
Fluvio L. Lobo Fenoglietto CTO, Principal Engineer
Digital Anatomy Simulations for Healthcare, LLC
Thanks for emailing me the file. I tried a few things to get the model to converge, here I summarize what I did to get it to run to completion:
- Because the model was taking too long to run, I remeshed the "skin" domain using "Tet Remesh" with Element size: 6, Min element size: 3. This brought down the number of equations from > 500 K to < 100 K.
- For the sliding-elastic contact with tension=No, I set laugon=1 and kept tolerance=0.2, penalty=1, auto-penalty=Yes, two-pass=Yes.
- For the sliding-elastic contact with tension=Yes, I set laugon=1, tolerance=0, gap tolerance=0.15, penalty=10, auto-penalty=Yes, two-pass=No.
- I added a boundary condition: Fix X on the surfaces for which you had also fixed Y. This prevented part of the torso from expanding laterally along X as gravity increased, while another part was fixed from the fixed BC you had applied along X.
- I increased the optimal iterations (opt_iter) to 20.
With these changes the model ran to completion in about 11 minutes. I have emailed you a link to my updated model files so that you can view and run this model yourself. Let me know if you are unable to reproduce those results, or if you require clarifications about these choices.
Comment