--- a +++ b/Application/Examples/THA-KneeBendDemo/THA-KneeBendDemo.Main.any @@ -0,0 +1,134 @@ +#include "../libdef.any" + +/** +This is a demo model for the simulation of a knee bend for a body model +with a total hip arthroplasty (THA)using: + - either an ideal spherical joint with joint reaction forces + - or force dependent kinematics and a contact model. + +In the body model, the hip joint is excluded from the AnyBodyStudy and a new force dependent +hip joint is included. Therefore, a acetabular cup and a femoral component (1) are included into the model +and a contact force between these implants is defined. For stabiliy reasons an artifical spring +is implemented to avoid the joint to disconnect. + +Please notice that this simulation is only a demo example. +The placement of hte implant is not based on any anatomical data. +Further, the implant includes an artificial spring (in Model/ContactForces.any) +element to make the simulation more robust. For each simulation, the force produced +by this artifical spring should be checked to be aware of the influence +of this spring on the results. + +--- +(1) The geometry data of the femoral component was kindly provided by Edmundo Fuentes via GrabCAD.com + http://edmundofuentes.com +*/ +Main = { + + // Switches to include AnyDrawWidgets to change the positions and orientation of the hip implants. + + // Widget to rotate the femoral component + #define FEM_STEM_ROT 0 + // Widget to move the femoral component + #define FEM_STEM_LIN 0 + // Widget to rotate the Acetabular cup + #define PELVIS_CUP_ROT 0 + + // Switch to use an ideal spherical joint, or force dependent kinematics for the right hip joint. + #ifndef USE_FDK + #define USE_FDK 1 + #endif + + // ---------------------------------------------------------- + // Path to draw settings + // ---------------------------------------------------------- + #include "Model/DrawSettings.any" + + // ---------------------------------------------------------- + // Body Model Configuration + // ---------------------------------------------------------- + #include "Model/BodyModelConfiguration.any" + + // The Mannequin file specifies load-time positions for all the segments + // in the HumanModel. This is important for the model's ablity to resolve + // all the kinematic constraints when the model is analyzed. + // The mannequin file also drives those degrees of freedom of the human + // model that are not governed by problem-specific drivers at run time. + #include "Model/Mannequin.any" + + // Model of the human body to be used for the analysis + #include "<ANYBODY_PATH_BODY>/HumanModel.any" + + /// The actual model where all components are assembled + AnyFolder Model ={ + /// Body model without default drivers + AnyFolder &BodyModel=.HumanModel.BodyModel; + /// Reference to the mannequin folder (used by drivers) + AnyFolder &Mannequin =.HumanModel.Mannequin; + + #include "Model/Environment.any" + + // Implants defines and positions the stl surfaces of the hip implants. + #include "Model/Implants.any" + + AnyFolder ModelEnvironmentConnection = { + #include "Model/JointsAndDrivers.any" + }; + }; + + AnyBodyStudy Study = { + AnyFolder &Model = .Model; + + // This file implements the implant contact forces. + #if USE_FDK + #include "Model/ContactForces.any" + #endif + + // In this file, the bone of the femur is replaced. + #include "Model/BoneExchange.any" + + + tEnd = 10.0; + Gravity = {0.0, -9.81, 0.0}; + nStep = 10; + + + AnyFolder HipComparison = + { + + #if USE_FDK + AnyFloat RightHipReactionForceFDK = (Main.Study.FSurf.Fslave[0]^2 + + Main.Study.FSurf.Fslave[1]^2 + + Main.Study.FSurf.Fslave[2]^2)^0.5; + #else + AnyFloat RightHipReactionForce = (Main.HumanModel.BodyModel.Right.Leg.Jnt.Hip.Constraints.Reaction.Fout[0]^2 + + Main.HumanModel.BodyModel.Right.Leg.Jnt.Hip.Constraints.Reaction.Fout[1]^2 + + Main.HumanModel.BodyModel.Right.Leg.Jnt.Hip.Constraints.Reaction.Fout[2]^2)^0.5; + #endif + + AnyFloat LeftHipReactionForce = (Main.HumanModel.BodyModel.Left.Leg.Jnt.Hip.Constraints.Reaction.Fout[0]^2 + + Main.HumanModel.BodyModel.Left.Leg.Jnt.Hip.Constraints.Reaction.Fout[1]^2 + + Main.HumanModel.BodyModel.Left.Leg.Jnt.Hip.Constraints.Reaction.Fout[2]^2)^0.5; + }; + + #if USE_FDK + // Here the hip joint from the body model is removed + // and new FDK drivers for the contact hip joint are + // defined. + #include "Model/HipExchange.any" + + InverseDynamics.ForceDepKinOnOff=On; //Values gained by experience + InverseDynamics.ForceDepKin.ForceTol=10; //Values gained by experience + InverseDynamics.ForceDepKin.Perturbation=5e-5; //Values gained by experience + InverseDynamics.ForceDepKin.LocalSearchOnOff = On; //Values gained by experience + //InverseDynamics.ForceDepKin.MaxNewtonStep = 0.1; //Values gained by experience + + //InverseDynamics.ForceDepKin.UseAdaptiveForceTolOnOff = On; + #endif + + }; // End of study + + // Include an operation sequence to run all required steps of your application (see Operations tab) + #include "<ANYBODY_PATH_MODELUTILS>\Operations\RunAppSequence.any" + +}; //Main +