The Question about Pre-strain
- Ariel Schwartz
- Posts: 16
- Joined: Tue Feb 20, 2018 7:20 am
Re: The Question about Pre-strain
Hi Yidan,
I don't think it matters how you fix the femur during prestrain, as long as you are able to successfully apply the prestrain, and then load your model as you like.
With regards to the problematic rotation you are seeing - if you were previously able to apply the valgus loading without prestrain, return to that model and look for all differences between that model and the current model. If prestrain is the ONLY difference, start by setting the initial stretch to 1 for all ligament - ie no prestrain, but making use of the prestrain step. If that model does not run as expected, you may want to check the material definition. If you are using an uncoupled transversely isotropic mooney rivlin material, here is an example of how the material should be defined with prestrain. Note that the bulk modulus goes under the material element, while the remaining material properties go under the elastic element:
<material id="1" name="ligament" type="uncoupled prestrain elastic">
<k>2551.10</k>
<elastic type="trans iso Mooney-Rivlin">
<density>1e-09</density>
<c1>0.040459</c1>
<c2>0</c2>
<c3>0.0139</c3>
<c4>116.22</c4>
<c5>2551.10</c5>
<lam_max>1.046</lam_max>
</elastic>
<prestrain type="in-situ stretch">
<stretch lc="2">1</stretch>
<isochoric>1</isochoric>
</prestrain>
<fiber type="vector">-0.04720507907357793,0.6701116499565312,-0.7407577587188626</fiber>
</material>
Best,
Ariel
I don't think it matters how you fix the femur during prestrain, as long as you are able to successfully apply the prestrain, and then load your model as you like.
With regards to the problematic rotation you are seeing - if you were previously able to apply the valgus loading without prestrain, return to that model and look for all differences between that model and the current model. If prestrain is the ONLY difference, start by setting the initial stretch to 1 for all ligament - ie no prestrain, but making use of the prestrain step. If that model does not run as expected, you may want to check the material definition. If you are using an uncoupled transversely isotropic mooney rivlin material, here is an example of how the material should be defined with prestrain. Note that the bulk modulus goes under the material element, while the remaining material properties go under the elastic element:
<material id="1" name="ligament" type="uncoupled prestrain elastic">
<k>2551.10</k>
<elastic type="trans iso Mooney-Rivlin">
<density>1e-09</density>
<c1>0.040459</c1>
<c2>0</c2>
<c3>0.0139</c3>
<c4>116.22</c4>
<c5>2551.10</c5>
<lam_max>1.046</lam_max>
</elastic>
<prestrain type="in-situ stretch">
<stretch lc="2">1</stretch>
<isochoric>1</isochoric>
</prestrain>
<fiber type="vector">-0.04720507907357793,0.6701116499565312,-0.7407577587188626</fiber>
</material>
Best,
Ariel
Re: The Question about Pre-strain
Hi Dr. Schwartz,
Thank you so much for your kind reply! I appreciate it a lot!
According to your suggestions, I used the initial value of prestrain and applied 10Nm valgus loading. Then I found it actually couldn't work. After I changed the material definition to the same as your example, it's working now, and the results are the same as the valgus simulation without prestrain. Then I added prestrain value to the ligaments and applied valgus loading(10Nm). It's working and converging well. However, the values of the prestrain stretch in the PostView are lower than the input values. For example, the input prestrain of MCL is 1.034, but the prestrain stretch of most elements in the MCL is even no more than 1.01. But the valgus rotation angle at the end is about 4 degrees, which looks reasonable. I was wondering why such lower prestrain stretch could come into play? Should it be reasonable since the rotation results look reasonable?
Also, in the valgus loading simulation, the tibia is fixed, and I only fixed the flexion-extension rotation of the femur. After applying 10Nm valgus loading, I found the I-E rotation of the femur is about 2 degrees, which is higher than I expected. And I fixed the IE rotation of the femur, the simulation can still work, and the valgus rotation results didn't be affected.
Looking forward to your kind reply.
Best wishes,
Yidan
Thank you so much for your kind reply! I appreciate it a lot!
According to your suggestions, I used the initial value of prestrain and applied 10Nm valgus loading. Then I found it actually couldn't work. After I changed the material definition to the same as your example, it's working now, and the results are the same as the valgus simulation without prestrain. Then I added prestrain value to the ligaments and applied valgus loading(10Nm). It's working and converging well. However, the values of the prestrain stretch in the PostView are lower than the input values. For example, the input prestrain of MCL is 1.034, but the prestrain stretch of most elements in the MCL is even no more than 1.01. But the valgus rotation angle at the end is about 4 degrees, which looks reasonable. I was wondering why such lower prestrain stretch could come into play? Should it be reasonable since the rotation results look reasonable?
Also, in the valgus loading simulation, the tibia is fixed, and I only fixed the flexion-extension rotation of the femur. After applying 10Nm valgus loading, I found the I-E rotation of the femur is about 2 degrees, which is higher than I expected. And I fixed the IE rotation of the femur, the simulation can still work, and the valgus rotation results didn't be affected.
Looking forward to your kind reply.
Best wishes,
Yidan
- Attachments
-
- prestrain stretch.png (122.52 KiB) Viewed 2496 times
-
- valgus_rotation.png (32.9 KiB) Viewed 2496 times
- Ariel Schwartz
- Posts: 16
- Joined: Tue Feb 20, 2018 7:20 am
Re: The Question about Pre-strain
Hi Yidan,
If you look through the prestrain manual, you can see that depending on the way you have prestrain defined, it may not solve so that the prestrain in every element is exactly what was defined. Depending on the problem you are trying to solve, you may want to define it one way or the other.
The actual initial stretch of a ligament will be dependent on the orientation of the knee when it is imaged. Imagine the knee were under varus vs valgus loading when it was imaged - in one case the MCL will be stretched, and the other it will be compressed. I assume you took the value 1.034 from literature (or from our model, which we took from literature) - this is simply a guess. From our current data set we do not know of a way to determine the exact initial stretch of the ligaments. There are ways to try and optimize the initial stretch of the ligaments to minimize mismatch between the experimental knee kinematics vs the model kinematics under experimental loading conditions... it all depends what you plan to use the model for whether you need to have exact parameters or not. Same goes for material properties of the ligaments. The ones I sent in my previous message may or may not be good to describe a ligament (they were chosen arbitrarily), I was just sending you an example to show you how the layout should be in the xml element.
Whether or not you fix the IE rotation will be dependent on how you plan to use the model. Many factors will affect how the knee joint moves under certain loads - the material properties of the ligaments, the initial stretch in the ligaments, what other tissues are modeled, the geometries of the bones... the list goes on.
Best,
Ariel
If you look through the prestrain manual, you can see that depending on the way you have prestrain defined, it may not solve so that the prestrain in every element is exactly what was defined. Depending on the problem you are trying to solve, you may want to define it one way or the other.
The actual initial stretch of a ligament will be dependent on the orientation of the knee when it is imaged. Imagine the knee were under varus vs valgus loading when it was imaged - in one case the MCL will be stretched, and the other it will be compressed. I assume you took the value 1.034 from literature (or from our model, which we took from literature) - this is simply a guess. From our current data set we do not know of a way to determine the exact initial stretch of the ligaments. There are ways to try and optimize the initial stretch of the ligaments to minimize mismatch between the experimental knee kinematics vs the model kinematics under experimental loading conditions... it all depends what you plan to use the model for whether you need to have exact parameters or not. Same goes for material properties of the ligaments. The ones I sent in my previous message may or may not be good to describe a ligament (they were chosen arbitrarily), I was just sending you an example to show you how the layout should be in the xml element.
Whether or not you fix the IE rotation will be dependent on how you plan to use the model. Many factors will affect how the knee joint moves under certain loads - the material properties of the ligaments, the initial stretch in the ligaments, what other tissues are modeled, the geometries of the bones... the list goes on.
Best,
Ariel
Re: The Question about Pre-strain
Hi Dr.Schwartz,
Thank you so much for your quick and patient reply! That's super helpful!
When I'm working with the simulations with augmentation turned off in the update, the simulation's results look well. However, I still have a few questions about prestrain constraints confusing me:
1.when I turned on the augmentation(tolerance is 0.03 and max_iters is 3) in the update (the update type is to eliminate the distortion), the prestrain stretch value at the end of the prestrain application step looks lower than expected (also lower than the non-augmentation result), and the simulation is hard to converge in the loading step. The mesh distortion in the loading step (e.g., valgus torque) is super large, leading to the difficult convergence under the prestrain constraint. So I was wondering if the "prestrain constraint" should work in the loading step?
2.Also, I tried to only turn on the augmentation in the prestrain application step and applied the loading without augmentation in the update. However, the prestrain stretch is low and the results are similar to the results of simulations without prestrain. So it seems that the framework didn't apply the prestrain successfully after the update.
Looking forward to your kind reply!
Best,
Yidan
Thank you so much for your quick and patient reply! That's super helpful!
When I'm working with the simulations with augmentation turned off in the update, the simulation's results look well. However, I still have a few questions about prestrain constraints confusing me:
1.when I turned on the augmentation(tolerance is 0.03 and max_iters is 3) in the update (the update type is to eliminate the distortion), the prestrain stretch value at the end of the prestrain application step looks lower than expected (also lower than the non-augmentation result), and the simulation is hard to converge in the loading step. The mesh distortion in the loading step (e.g., valgus torque) is super large, leading to the difficult convergence under the prestrain constraint. So I was wondering if the "prestrain constraint" should work in the loading step?
2.Also, I tried to only turn on the augmentation in the prestrain application step and applied the loading without augmentation in the update. However, the prestrain stretch is low and the results are similar to the results of simulations without prestrain. So it seems that the framework didn't apply the prestrain successfully after the update.
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,
I am not sure I understand your questions. It may be helpful for you to share your model file.
When you refer to "Steps" it sounds like you are applying prestrain and loading in separate FEBio step. If you look back at the beginning of our correspondence I showed how prestrain and loading can both be applied in one time step via use of the load curves. The entire step runs from time 0 to 2, with prestrain applied during time 0 to 1, and loading applied from time 1 to 2. When you apply it this way, the prestrain constraint is applied over the entire step, such that it ramps up from time 0 to 1, and is held from time 1 to 2.
It is also important to understand what prestrain stretch and fiber stretch represent in postview. When prestrain has been applied but no loads have been applied yet, the average prestrain stretch over all elements in the ligaments should be ~ equal to requested initial stretch. The fiber stretch should be ~1 if there was no distortion. The augmentations ensure this, so turning off augmentations may reduce the accuracy. Once the loads are applied, if the prestrain is held during loading (as described above), the requested prestrain should be equal to the difference between prestrain stretch and fiber stretch.
Here is an example of a Femur, Tibia, and ACL where an initial stretch of 1.05 was applied from time 0 to 1. and then the ACL was stretched ~10%. as you can see at time 1, the prestrain stretch averages about 1.05, and fiber stretch it ~1 (no augmentations). and at time 2, prestrain stretch - fiber stretch is approximately equal to the prestrain stretch at time 1.
I am not sure I understand your questions. It may be helpful for you to share your model file.
When you refer to "Steps" it sounds like you are applying prestrain and loading in separate FEBio step. If you look back at the beginning of our correspondence I showed how prestrain and loading can both be applied in one time step via use of the load curves. The entire step runs from time 0 to 2, with prestrain applied during time 0 to 1, and loading applied from time 1 to 2. When you apply it this way, the prestrain constraint is applied over the entire step, such that it ramps up from time 0 to 1, and is held from time 1 to 2.
It is also important to understand what prestrain stretch and fiber stretch represent in postview. When prestrain has been applied but no loads have been applied yet, the average prestrain stretch over all elements in the ligaments should be ~ equal to requested initial stretch. The fiber stretch should be ~1 if there was no distortion. The augmentations ensure this, so turning off augmentations may reduce the accuracy. Once the loads are applied, if the prestrain is held during loading (as described above), the requested prestrain should be equal to the difference between prestrain stretch and fiber stretch.
Here is an example of a Femur, Tibia, and ACL where an initial stretch of 1.05 was applied from time 0 to 1. and then the ACL was stretched ~10%. as you can see at time 1, the prestrain stretch averages about 1.05, and fiber stretch it ~1 (no augmentations). and at time 2, prestrain stretch - fiber stretch is approximately equal to the prestrain stretch at time 1.
- Attachments
-
- Capture_4.PNG (194.24 KiB) Viewed 2459 times
-
- Capture_3.PNG (197.93 KiB) Viewed 2459 times
-
- Capture_2.PNG (193.6 KiB) Viewed 2459 times
-
- Capture_1.PNG (223.35 KiB) Viewed 2459 times
Re: The Question about Pre-strain
Hi Dr. Schwartz,
Thank you so much for your kind reply! It helps me a lot!
To clarify my previous post, I used one FEBio step from time 0 to 2 to apply prestrain(time 0 to 1) and loading (time 1 to 2). And I used the load curve to control the loading.
I attached the Feb file as this link: https://drive.google.com/file/d/1tUb14j ... sp=sharing
Since I found that when I turned on the augmentation in the update (tolerance=0.03, max_iter=3), the loading step is super hard to converge due to large distortion. So I was wondering if we should use the update in the loading step. And I couldn't understand what you mean
According to your last post, I checked the simulation(as attached) results, and the prestrain stretch actually looks lower than the input values. As the attached picture (prestrain stretch MCL), I plot the MCL, but the average value is lower than the input value(1.034). However, the fiber stretch value is about 1. So I'm not sure if its reasonable.
Looking forward to your kind reply.
Best,
Yidan
Thank you so much for your kind reply! It helps me a lot!
To clarify my previous post, I used one FEBio step from time 0 to 2 to apply prestrain(time 0 to 1) and loading (time 1 to 2). And I used the load curve to control the loading.
I attached the Feb file as this link: https://drive.google.com/file/d/1tUb14j ... sp=sharing
Since I found that when I turned on the augmentation in the update (tolerance=0.03, max_iter=3), the loading step is super hard to converge due to large distortion. So I was wondering if we should use the update in the loading step. And I couldn't understand what you mean
. How should we hold the constraint?the prestrain constraint is applied over the entire step, such that it ramps up from time 0 to 1, and is held from time 1 to 2.
According to your last post, I checked the simulation(as attached) results, and the prestrain stretch actually looks lower than the input values. As the attached picture (prestrain stretch MCL), I plot the MCL, but the average value is lower than the input value(1.034). However, the fiber stretch value is about 1. So I'm not sure if its reasonable.
Looking forward to your kind reply.
Best,
Yidan
- Attachments
-
- prestrain stretch mcl.png (166.52 KiB) Viewed 2433 times
-
- prestrain stretch 4ligs.png (140.13 KiB) Viewed 2433 times
- Ariel Schwartz
- Posts: 16
- Joined: Tue Feb 20, 2018 7:20 am
Re: The Question about Pre-strain
Hi Yidan,
I apologize my wording was confusing in the sentence you highlighted. What I mean is that the prestrain constraint is defined in the step. Therefore prestrain is being applied the whole time from time 0 to time 2. But using the load curves (take MCL as an example), we defined the initial stretch to be 1.0 at time zero , 1.034 at time 1.0, and then 1.034 at time 2.0. In other words, from time 0 to time 1 the initial stretch is applied, and then no change in initial stretch from time 1 to time 2. What this means is that when FEBio calculates the total stretch of the fibers during the loading portion, it will take into account an initial stretch of 1.034, plus whatever stretch is being induced from the loading.
The remainder of your questions are not for me to answer . What is 'reasonable' for one study may not be reasonable for another. You must determine what the goal of your study is, and then determine what outputs you require from the model. Most model outputs will be influenced in some way by the decisions of the modeler. For example how geometries were segmented, the density of the mesh, the insertions of the ligaments, how you decided what prestrain to apply, if you fix other degrees of freedom... to name a few. You may need to perform sensitivity analysis to see how some of these decisions will affect your results.
Best,
Ariel
I apologize my wording was confusing in the sentence you highlighted. What I mean is that the prestrain constraint is defined in the step. Therefore prestrain is being applied the whole time from time 0 to time 2. But using the load curves (take MCL as an example), we defined the initial stretch to be 1.0 at time zero , 1.034 at time 1.0, and then 1.034 at time 2.0. In other words, from time 0 to time 1 the initial stretch is applied, and then no change in initial stretch from time 1 to time 2. What this means is that when FEBio calculates the total stretch of the fibers during the loading portion, it will take into account an initial stretch of 1.034, plus whatever stretch is being induced from the loading.
The remainder of your questions are not for me to answer . What is 'reasonable' for one study may not be reasonable for another. You must determine what the goal of your study is, and then determine what outputs you require from the model. Most model outputs will be influenced in some way by the decisions of the modeler. For example how geometries were segmented, the density of the mesh, the insertions of the ligaments, how you decided what prestrain to apply, if you fix other degrees of freedom... to name a few. You may need to perform sensitivity analysis to see how some of these decisions will affect your results.
Best,
Ariel
- Marloes vdH
- Posts: 8
- Joined: Fri Nov 06, 2020 1:07 am
Re: The Question about Pre-strain
Dear dr. Schwartz, Yidan,
I am trying to apply prestrain on the tf_joint_v2p7 model as well, using FEBioStudio.
I want to define it as a single value for the entire ligament.
FEBio Studio seems a bit different in assigning material properties and applying prestrain.
You gave an example for using the uncoupled transversely isotropic mooney rivlin material:
When trying to run the model, the parameters are according to the load curve (using 1 point) except for the bulk (k). Is there an other possibility to assign the values to bulk and density?
It seems not possible to only make 2 different loadcurves and assign it to the desired materials/forces, however, copy-paste works fine.(with small adjustments in value) I used 0-1s for applying the prestrain and 1-2s for applying valgus, and step01: 20 steps, time step 0.1.
You both mention using the prestrain constraints
However, I can't find the possibility of using an update rule/prestrain constraint in the Constraints section. These are the only options visible:
Is there an other way to use the prestrain constraint, or should this be defined elsewhere?
I can't manage to obtain a normal termination including prestrain.
I really hope you have any suggestions or ideas that could help me!
I am looking forward to your reply.
Kind regards,
Marloes
I am trying to apply prestrain on the tf_joint_v2p7 model as well, using FEBioStudio.
I want to define it as a single value for the entire ligament.
FEBio Studio seems a bit different in assigning material properties and applying prestrain.
You gave an example for using the uncoupled transversely isotropic mooney rivlin material:
However, in FEBioStudio the bulk modulus and density disappear and don't go under the material element: When adjusting the LoadCurves the density and bulk become visible, but I am not sure if adding one point to the load curve with the bulk/density value, to obtain a constant value over time is sufficient.arielschwartz wrote: ↑Tue Sep 22, 2020 5:20 pmIf you are using an uncoupled transversely isotropic mooney rivlin material, here is an example of how the material should be defined with prestrain. Note that the bulk modulus goes under the material element, while the remaining material properties go under the elastic element:
<material id="1" name="ligament" type="uncoupled prestrain elastic">
<k>2551.10</k>
<elastic type="trans iso Mooney-Rivlin">
<<
</elastic>
<prestrain type="in-situ stretch">
<<
</prestrain>
<fiber type="vector">-0.04720507907357793,0.6701116499565312,-0.7407577587188626</fiber>
</material>
When trying to run the model, the parameters are according to the load curve (using 1 point) except for the bulk (k). Is there an other possibility to assign the values to bulk and density?
It seems not possible to only make 2 different loadcurves and assign it to the desired materials/forces, however, copy-paste works fine.(with small adjustments in value) I used 0-1s for applying the prestrain and 1-2s for applying valgus, and step01: 20 steps, time step 0.1.
You both mention using the prestrain constraints
Code: Select all
<Constraints>
<constraint type="prestrain">
<tolerance>0.1</tolerance>
<min_iters>3</min_iters>
</constraint>
</Constraints>
I can't manage to obtain a normal termination including prestrain.
I really hope you have any suggestions or ideas that could help me!
I am looking forward to your reply.
Kind regards,
Marloes
- Ariel Schwartz
- Posts: 16
- Joined: Tue Feb 20, 2018 7:20 am
Re: The Question about Pre-strain
Hi Marloes,
I personally do not have experience using febio studio, however I strongly recommend you open the .feb file in an xml compatible text reader (ex: SciTE). This is the file that is actually read by FeBio when it is running the model, so the issues you have with "disappearing" properties will likely be easier to troubleshoot. My guess is that they do not disappear, they just have not been displayed in febio studio because they are located outside the "elastic" element. You will be able to set the density and bulk modulus directly in the .feb file. The febio users manual gives a lot of direction about understanding the file under "Free Format Input" (https://help.febio.org/FEBio/FEBio_um_2_8/). This will also allow you to add the prestrain constraint manually, if the option is not available in febio studio.
Best of luck,
Ariel
I personally do not have experience using febio studio, however I strongly recommend you open the .feb file in an xml compatible text reader (ex: SciTE). This is the file that is actually read by FeBio when it is running the model, so the issues you have with "disappearing" properties will likely be easier to troubleshoot. My guess is that they do not disappear, they just have not been displayed in febio studio because they are located outside the "elastic" element. You will be able to set the density and bulk modulus directly in the .feb file. The febio users manual gives a lot of direction about understanding the file under "Free Format Input" (https://help.febio.org/FEBio/FEBio_um_2_8/). This will also allow you to add the prestrain constraint manually, if the option is not available in febio studio.
Best of luck,
Ariel
- Marloes vdH
- Posts: 8
- Joined: Fri Nov 06, 2020 1:07 am
Re: The Question about Pre-strain
Hi dr.Schwartz,
Thank you very much for your quick reply!
FEBio Studio didn't read the bulk and density properly, but this has been solved and I got a new software version.
I manually applied the PreStrain, however, I experience some problems. When looking at the Lagrange Strain it seems like the strain is homogeneously applied and approximately in the right scale. However, the fiber stretch doesn't give any results (the whole object is grey).
It seems like the PreStrain isn't applied to the fiber, but to the matrix (?). My material is defined as follows:
In your example of the material, the fiber is defined outside of the TransIsoMR. However, the fiber is a property of the TransIsoMR and according to the FEBio developers, it should be defined in the TransIsoMR.
I am not sure how to resolve this issue and how to obtain results for the fiber stretch.
Do you have any suggestions?
Kind regards,
Marloes
Thank you very much for your quick reply!
FEBio Studio didn't read the bulk and density properly, but this has been solved and I got a new software version.
I manually applied the PreStrain, however, I experience some problems. When looking at the Lagrange Strain it seems like the strain is homogeneously applied and approximately in the right scale. However, the fiber stretch doesn't give any results (the whole object is grey).
It seems like the PreStrain isn't applied to the fiber, but to the matrix (?). My material is defined as follows:
Code: Select all
<material id="11" name="acl" type="uncoupled prestrain elastic">
<density>1.5e-09</density>
<k>73.2</k>
<elastic type="trans iso Mooney-Rivlin">
<c1>1.95</c1>
<c2>0</c2>
<c3>0.0139</c3>
<c4>116.22</c4>
<c5>535.039</c5>
<lam_max>1.046</lam_max>
<fiber type="local">1,4</fiber>
</elastic>
<prestrain type="in-situ stretch">
<stretch lc="1">1</stretch>
<isochoric>1</isochoric>
</prestrain>
</material>
I am not sure how to resolve this issue and how to obtain results for the fiber stretch.
Do you have any suggestions?
Kind regards,
Marloes