The Question about Pre-strain
The Question about Pre-strain
Hi,
I am a first-year master student who is using the open knee model (Generation one) to finish my thesis. Now I am trying to apply the pre-strain on the ligaments according to your suggestions on the website (https://simtk.org/plugins/moinmoin/open ... estrain%29) and the user's manual of FEBio plugin. At first, I tried to simulate the 10Nm Valgus rotation as Dr. Maas & Dr. Erdemir did in the literature ( DOI:10.1016/j.jmbbm.2016.04.012). In my simulation, I tried to apply in-situ stretch on the ligaments and to use prestrain update rule in the first step, followed by the load in the second step. For the boundary conditions, the femur is free except for the flexion-extension rotation, while the tibia is fixed. However, I just found that the prestrain stretch value in the PostView is almost the initial value (1.0), and I couldn't get the sensible results (rotation angle) as published results in such a situation. As a result, the rotation angle is almost the same as the result of the simulation without pre-strain. Also, I tried to apply in-situ stretch on the ligaments and use the in-situ stretch update rule. In such a situation, I found the prestrain stretch value in the PostView, is close to the applied value. And the rotation results in this simulation are closer to the published results.
I was stuck by the problem more than two months, and I might incorrectly use the update rule. Could anyone give me some suggestions and ideas? Any helps, I would appreciate it a lot!
Since the .feb file is too large, I attached my file as a link here:
https://drive.google.com/file/d/13B_YeT ... sp=sharing
Sincerely,
Yidan
I am a first-year master student who is using the open knee model (Generation one) to finish my thesis. Now I am trying to apply the pre-strain on the ligaments according to your suggestions on the website (https://simtk.org/plugins/moinmoin/open ... estrain%29) and the user's manual of FEBio plugin. At first, I tried to simulate the 10Nm Valgus rotation as Dr. Maas & Dr. Erdemir did in the literature ( DOI:10.1016/j.jmbbm.2016.04.012). In my simulation, I tried to apply in-situ stretch on the ligaments and to use prestrain update rule in the first step, followed by the load in the second step. For the boundary conditions, the femur is free except for the flexion-extension rotation, while the tibia is fixed. However, I just found that the prestrain stretch value in the PostView is almost the initial value (1.0), and I couldn't get the sensible results (rotation angle) as published results in such a situation. As a result, the rotation angle is almost the same as the result of the simulation without pre-strain. Also, I tried to apply in-situ stretch on the ligaments and use the in-situ stretch update rule. In such a situation, I found the prestrain stretch value in the PostView, is close to the applied value. And the rotation results in this simulation are closer to the published results.
I was stuck by the problem more than two months, and I might incorrectly use the update rule. Could anyone give me some suggestions and ideas? Any helps, I would appreciate it a lot!
Since the .feb file is too large, I attached my file as a link here:
https://drive.google.com/file/d/13B_YeT ... sp=sharing
Sincerely,
Yidan
- Ariel Schwartz
- Posts: 16
- Joined: Tue Feb 20, 2018 7:20 am
Re: The Question about Pre-strain
Hi Yidan,
I will first share with you two nuances that we discovered while working through this issue, and confirmed with the FEBio developers:
a. when looking at the prestrain stretch in postview, it is important to note that this variable shows the total fiber stretch, including the effects of prestrain and deformation. So after the application of prestrain it will continue to change during loading
b. depending on if in situ stretch is defined element wise in the mesh data section, or if it is defined as a single value for the entire ligament, the scaling of the load curve works differently. If using the mesh data section, the load curve would be defined as usual from 0 to 1. However if it is defined as a single parameter in the material definition, the load curve should be scaled from 1 to the in situ stretch (example below)
Here is how we succeeded in applying prestrain to the ligaments:
Instead of using two different steps, we defined one step from time 0 to time 2. From time 0 to 1 is prestrain application, and from time 1 to time 2 is loading/flexion.
1) load curve defining the in situ stretch from 1 to in situ stretch, and holding from time 1 to 2 (in this example stretch of 0.016):
<loadcurve id="1">
<point>0,1.0</point>
<point>1,1.016</point>
<point>2,1.016</point>
</loadcurve>
2) ligament material is defined as "uncoupled prestrain elastic" with in-situ-stretch set at 1.0, and pointing to the defined load curve
<prestrain type="in-situ-stretch">
<stretch lc="1">1.0</stretch>
<isochoric>1</isochoric>
</prestrain>
3) loading/flexion load curves stay at 0 from time 0 to time 1, and then load from time 1 to 2
<loadcurve id="2">
<point>0,0</point>
<point>1,0</point>
<point>2,1</point>
</loadcurve>
4) prestrain constraint defined using the "prestrain" update rule.
I hope this helps,
Ariel
I will first share with you two nuances that we discovered while working through this issue, and confirmed with the FEBio developers:
a. when looking at the prestrain stretch in postview, it is important to note that this variable shows the total fiber stretch, including the effects of prestrain and deformation. So after the application of prestrain it will continue to change during loading
b. depending on if in situ stretch is defined element wise in the mesh data section, or if it is defined as a single value for the entire ligament, the scaling of the load curve works differently. If using the mesh data section, the load curve would be defined as usual from 0 to 1. However if it is defined as a single parameter in the material definition, the load curve should be scaled from 1 to the in situ stretch (example below)
Here is how we succeeded in applying prestrain to the ligaments:
Instead of using two different steps, we defined one step from time 0 to time 2. From time 0 to 1 is prestrain application, and from time 1 to time 2 is loading/flexion.
1) load curve defining the in situ stretch from 1 to in situ stretch, and holding from time 1 to 2 (in this example stretch of 0.016):
<loadcurve id="1">
<point>0,1.0</point>
<point>1,1.016</point>
<point>2,1.016</point>
</loadcurve>
2) ligament material is defined as "uncoupled prestrain elastic" with in-situ-stretch set at 1.0, and pointing to the defined load curve
<prestrain type="in-situ-stretch">
<stretch lc="1">1.0</stretch>
<isochoric>1</isochoric>
</prestrain>
3) loading/flexion load curves stay at 0 from time 0 to time 1, and then load from time 1 to 2
<loadcurve id="2">
<point>0,0</point>
<point>1,0</point>
<point>2,1</point>
</loadcurve>
4) prestrain constraint defined using the "prestrain" update rule.
I hope this helps,
Ariel
Re: The Question about Pre-strain
Hi Dr.Schwartz,
Thank you so much for your kind reply! That is super helpful.
I have already revised my file based on your suggestion. But I still have one more question about update rule which is confusing:
Should the update rule only work in the prestrain application step? Should I turn off the update flag when the loading/flexion is applying?
Thanks,
Yidan
Thank you so much for your kind reply! That is super helpful.
I have already revised my file based on your suggestion. But I still have one more question about update rule which is confusing:
Should the update rule only work in the prestrain application step? Should I turn off the update flag when the loading/flexion is applying?
Thanks,
Yidan
- Ariel Schwartz
- Posts: 16
- Joined: Tue Feb 20, 2018 7:20 am
Re: The Question about Pre-strain
Hi Yidan,
Sorry for the delayed response.
In our case, it is applied throughout the entire simulation. The ligament prestrain values are simply held fixed during the remainder of the simulation, defined via the load curves.
I do not have experience personally using prestrain in a separate step.
Best,
Ariel
Sorry for the delayed response.
In our case, it is applied throughout the entire simulation. The ligament prestrain values are simply held fixed during the remainder of the simulation, defined via the load curves.
I do not have experience personally using prestrain in a separate step.
Best,
Ariel
Re: The Question about Pre-strain
Hi Dr.Schwartz,
Thank you so much for your kind reply!
During these days, I am working on this simulation which is refined based on your suggestions. However, I still have convergence problem and the simulation terminated at time 0.5/0.6. This is how I defined the prestrain constraint:
In order to untangle the problem, I tried to adjust the parameters in the time step but still not working. I also tried to delete the <min_iters>, but it just terminated at time 1 and couldn't be applied with loading. I still couldn't figure out where I might do something wrong.
Could you please give me any clues/suggestions to help me troubleshoot it? Any helps, I would appreciate it a lot!
Best,
Yidan
Thank you so much for your kind reply!
During these days, I am working on this simulation which is refined based on your suggestions. However, I still have convergence problem and the simulation terminated at time 0.5/0.6. This is how I defined the prestrain constraint:
Code: Select all
<Constraints>
<constraint type="prestrain">
<tolerance>0.1</tolerance>
<min_iters>3</min_iters>
</constraint>
</Constraints>
Could you please give me any clues/suggestions to help me troubleshoot it? Any helps, I would appreciate it a lot!
Best,
Yidan
- Ariel Schwartz
- Posts: 16
- Joined: Tue Feb 20, 2018 7:20 am
Re: The Question about Pre-strain
Hi Yidan,
A model not converging is a very difficult problem to troubleshoot, especially without having full knowledge of all details of the model. We have some suggestions on this page of where to start, and some common issues. https://simtk.org/plugins/moinmoin/open ... leshooting
This is just from our experience what we have found helpful, I hope it will help put you in the right direction.
Best,
Ariel
A model not converging is a very difficult problem to troubleshoot, especially without having full knowledge of all details of the model. We have some suggestions on this page of where to start, and some common issues. https://simtk.org/plugins/moinmoin/open ... leshooting
This is just from our experience what we have found helpful, I hope it will help put you in the right direction.
Best,
Ariel
- Ariel Schwartz
- Posts: 16
- Joined: Tue Feb 20, 2018 7:20 am
Re: The Question about Pre-strain
Hi Yidan,
I had another thought about something that may help you.
In some of our prestrain models, we have had convergence success by turning off augmentations in the prestrain constraint. This can be done by setting the following:
<constraint type="prestrain">
<update>1</update>
<tolerance>0.03</tolerance>
<min_iters>0</min_iters>
<max_iters>0</max_iters>
</constraint>
I hope this helps.
Best,
Ariel
I had another thought about something that may help you.
In some of our prestrain models, we have had convergence success by turning off augmentations in the prestrain constraint. This can be done by setting the following:
<constraint type="prestrain">
<update>1</update>
<tolerance>0.03</tolerance>
<min_iters>0</min_iters>
<max_iters>0</max_iters>
</constraint>
I hope this helps.
Best,
Ariel
Re: The Question about Pre-strain
Hi Dr.Schwartz,
Thanks for your patience and help!
According to your suggestions, I turned off the augmentations in my simulation and the prestrain application step successfully terminated. However, when I added the valgus step after the prestrain, the simulation got terminated immediately. But when I added a 20N compression after the prestrain, it worked well. But still couldn't be followed by a valgus torque. Once I added the valgus torque after the pretrain and compression, it failed at 5%. And the rotation angle is suddenly increased in the valgus step. So I'm not sure if the prestrain application step still has any problems which I didn't solve.
Also, in order to test the tension in the ligaments, I fixed the bones and applied the prestrain. However, the rigid force( the tension) is no more than 0.1N. Is it reasonable? Should the tension be larger if the prestrain applied successfully?
Looking forward to your kind reply!
Best,
Yidan
Thanks for your patience and help!
According to your suggestions, I turned off the augmentations in my simulation and the prestrain application step successfully terminated. However, when I added the valgus step after the prestrain, the simulation got terminated immediately. But when I added a 20N compression after the prestrain, it worked well. But still couldn't be followed by a valgus torque. Once I added the valgus torque after the pretrain and compression, it failed at 5%. And the rotation angle is suddenly increased in the valgus step. So I'm not sure if the prestrain application step still has any problems which I didn't solve.
Also, in order to test the tension in the ligaments, I fixed the bones and applied the prestrain. However, the rigid force( the tension) is no more than 0.1N. Is it reasonable? Should the tension be larger if the prestrain applied successfully?
Looking forward to your kind reply!
Best,
Yidan
- Ariel Schwartz
- Posts: 16
- Joined: Tue Feb 20, 2018 7:20 am
Re: The Question about Pre-strain
Hi Yidan,
If the prestrain step converged, and you were able to apply a compressive load following prestrain, it sounds like you got over the challenge of prestrain application followed by loading. You can check the postview file and look at prestrain stretch at the end of the prestrain step to see how it went and if the results look good to you.
In terms of the valgus loading, are you continuing to apply a compressive load while you apply valgus loading? Possibly your model is too unstable for valgus loading on its own. Also, I am not sure what rotation you are referring to - if you are seeing a flexion rotation under valgus loading you may want to consider fixing your flexion angle while you apply valgus loads.
I would start with stabilizing your model during the valgus loading to see if it converges. Initially, fix all other degrees of freedom and apply valgus loading. If this converges, you can being freeing up some degrees of freedom to see where the issues come into play. If it does not converge with all other degrees of freedom fixed, then likely you have some other issue.
In general, first you need to look at the logfile and determine why your model is terminating.
If your logfile is not printing negative jacobians, you will need to add the following element to the Febio/bin/febio.xml file.<output_negative_jacobians>1</output_negative_jacobians>
If you are seeing negative jacobians at certain elements, you will want to locate those elements and see what could be going on.
Best of luck,
Ariel
If the prestrain step converged, and you were able to apply a compressive load following prestrain, it sounds like you got over the challenge of prestrain application followed by loading. You can check the postview file and look at prestrain stretch at the end of the prestrain step to see how it went and if the results look good to you.
In terms of the valgus loading, are you continuing to apply a compressive load while you apply valgus loading? Possibly your model is too unstable for valgus loading on its own. Also, I am not sure what rotation you are referring to - if you are seeing a flexion rotation under valgus loading you may want to consider fixing your flexion angle while you apply valgus loads.
I would start with stabilizing your model during the valgus loading to see if it converges. Initially, fix all other degrees of freedom and apply valgus loading. If this converges, you can being freeing up some degrees of freedom to see where the issues come into play. If it does not converge with all other degrees of freedom fixed, then likely you have some other issue.
In general, first you need to look at the logfile and determine why your model is terminating.
If your logfile is not printing negative jacobians, you will need to add the following element to the Febio/bin/febio.xml file.<output_negative_jacobians>1</output_negative_jacobians>
If you are seeing negative jacobians at certain elements, you will want to locate those elements and see what could be going on.
Best of luck,
Ariel
Re: The Question about Pre-strain
Hi Dr. Schwartz,
Thank you so much for your quick reply!
Based on your suggestions, I fixed all the rotation freedom in the prestrain application step and applied valgus/varus torque. In results, the prestrain step converges, and the prestrain stretch in the Postview looks good (Fig 1). However, the model could only be applied 5-10 Nmm torque, and the femur would rotate 0.3 rad, which is super large. I attached the rotation image of 10Nmm varus torque (Fig 2). Previously, I've already tried 10 Nm valgus/varus torque simulation without prestrain, and it was working well. So I suspect if the prestrain applied correctly.
Also, I wondered if I should fix the femur in the prestrain step or make the BCs consistent as the loading step?
Best,
Yidan
Thank you so much for your quick reply!
Based on your suggestions, I fixed all the rotation freedom in the prestrain application step and applied valgus/varus torque. In results, the prestrain step converges, and the prestrain stretch in the Postview looks good (Fig 1). However, the model could only be applied 5-10 Nmm torque, and the femur would rotate 0.3 rad, which is super large. I attached the rotation image of 10Nmm varus torque (Fig 2). Previously, I've already tried 10 Nm valgus/varus torque simulation without prestrain, and it was working well. So I suspect if the prestrain applied correctly.
Also, I wondered if I should fix the femur in the prestrain step or make the BCs consistent as the loading step?
Best,
Yidan
- Attachments
-
- prestrain applied.png (155.36 KiB) Viewed 2783 times
-
- Varus--error.png (133.16 KiB) Viewed 2783 times