[bfdf16]: / Body / AAUHuman / Trunk / Buckle.any

Download this file

745 lines (587 with data), 26.8 kB

/**
This is the main file which is used to simulate the mechanical effect of intra-abdominal pressure.
The model automatically finds the optimal abdominal pressure that will reduce the muscle activities.

The abdominal volume is measure using a number of cylinders. The abdominal model can generate forces to 
the rest of the model according to the way the volume is measured. This means that all measures in
the volume may generate a force, since we have an abdominal muscle working on the volume.
  
The abdominal muscles wraps an abdominal-like shape which means that the effective area they have on 
the abdominal volume comes automatically. This would otherwise be very difficult to determine.

We have compared the model with other models in the litterature and it seems to be the only model
where the forces that arise from the pressure between the abdominal volume and the frontal side of 
the vertebrae is taken into account.  We are working on validating the model towards experiments found 
in the litterature.
*/
AnyFolder Buckle={
  
  /// Scaling function used by buckle segment and disc segments
  /// The function uses the same scalemat as the lumbar region but without offsets
  AnyFunTransform3DLin Scale = {
    ScaleMat = ....Scaling.GeometricalScaling.Lumbar.ScaleFunction.ScaleMat; 
    Offset = {0,0,0};
  };
  AnyVar Xfactor = Scale.ScaleMat[0][0];
  AnyVar Yfactor = Scale.ScaleMat[1][1];
  AnyVar Zfactor = Scale.ScaleMat[2][2];
  
  //Settings which is used to control the geometry of the abdominal volume
  AnyVar  B=0.08*Zfactor;//0.07; //frontal distance between cylinders
  AnyVar  R=0.04*(Zfactor + Xfactor)/2; //radius of circles  
  AnyVar  Delta=0.015*Xfactor;//saggital plane distance between cylinders
  AnyVar  CylLength =0.35*Yfactor ; //Lenght of cylinders
  AnyVar  A=0.05*Xfactor; //Backwardss offset of cylinders in the saggital plane
  AnyVec3 CylRGB={0.6,0.6,0.6};
  AnyVar  CylOpacity =0;
  AnyVar  CylCapRatio=0.4;
  
  //References
  AnyFolder &PelvisRef=.SegmentsLumbar.PelvisSeg;
  AnyFolder &ThoraxRef=.SegmentsRibCage.SternalBodySeg;
  
  AnyFolder Segments ={
    
    AnySeg BuckleSeg ={
      

      
      Mass=0.1;
      Jii={0,0,0};
      //Set the inital position to be the midpoint between the control point on pelvis and thorax
      r0=0.5*(...SegmentsRibCage.SternalBodySeg.BuckleNodeTopCenter.sRel*...SegmentsRibCage.SternalBodySeg.Axes0'+...SegmentsRibCage.SternalBodySeg.r0+
      ...SegmentsLumbar.PelvisSeg.BuckleNodeBottomCenter.sRel*...SegmentsLumbar.PelvisSeg.Axes0'+...SegmentsLumbar.PelvisSeg.r0);
      
      // The buckle scales together with the lumbar spine
      AnyFunTransform3D& Scale = ..Scale;
      AnyRefNode& ScalingNode = AnatomicalFrameTrunk;
      AnyRefNode AnatomicalFrameTrunk = {
        sRel = ...PelvisRef.AnatomicalFrameTrunk.sRel;
        ARel = ...PelvisRef.AnatomicalFrameTrunk.ARel;
      };
      //Set the Axes to the average of the orientation of pelvis and thorax. This is a crude estimation
      //it does not ensure orthogonality of the axes matrix..
      AnyMat33 Am=0.5*(...SegmentsRibCage.SternumSeg.Axes0+...SegmentsLumbar.PelvisSeg.Axes0);
      
      //Normalizing Am
      AnyVar L0 = ((Am[0][0])^2+(Am[1][0])^2+(Am[2][0])^2)^0.5;
      AnyVar L1 = ((Am[0][1])^2+(Am[1][1])^2+(Am[2][1])^2)^0.5;
      AnyVar L2 = ((Am[0][2])^2+(Am[1][2])^2+(Am[2][2])^2)^0.5;
      
      Axes0={
        {Am[0][0]/L0,Am[0][1]/L1,Am[0][2]/L2},
        {Am[1][0]/L0,Am[1][1]/L1,Am[1][2]/L2},
        {Am[2][0]/L0,Am[2][1]/L1,Am[2][2]/L2}
      };
      
      AnyRefNode Node0={  //top center
        sRel= .Scale({0,0.07,0.0});   
      };
      AnyRefNode Node1={ //top right
        sRel= .Scale({0,0.09,0.05});   
      };
      
      AnyRefNode Node2={//top left
        sRel= .Scale({0,0.09,-0.05});   
      };
      
      AnyRefNode Node3={ //bottom right
        sRel= .Scale({0,-0.09,0.05});   
      };
      AnyRefNode Node4={ //bottom left
        sRel= .Scale({0,-0.09,-0.05});   
      };
      AnyRefNode Node5={ //bottom center
        sRel= .Scale({0,-0.09,0});   
      };
      
      AnyKinPLine line ={
        AnyRefNode &ref1=.Node1;     
        AnyRefNode &ref2=.Node2;   
        AnyRefNode &ref3=.Node4;
        AnyRefNode &ref4=.Node3;
        AnyRefNode &ref5=.Node1;
      };
      
    
        AnyRefNode RA_1_R ={
        sRel= .Scale({0.01,0.0,0.005});   
      };

      
      AnyRefNode RA_2_R ={
        sRel= .Scale({0.007,0,0.015});   
      };
      
      AnyRefNode RA_3_R={
        sRel= .Scale({0.004,0,0.03});   
      };   

      AnyRefNode RA_4_R ={
        sRel= .Scale({0,0.0,0.045});   
      };


      
            AnyRefNode RA_1_L ={
        sRel= .Scale({0.01,0.0,-0.005});   
      };

      
      AnyRefNode RA_2_L ={
        sRel= .Scale({0.007,0,-0.015});   
      };
      
      AnyRefNode RA_3_L={
        sRel= .Scale({0.004,0,-0.03});   
      };   

      AnyRefNode RA_4_L ={
        sRel= .Scale({0,0.0,-0.045});   
      };

      AnyVar h=0.07;
      AnyVar w=0.05;
      AnyRefNode SupportNodeRight={  //disc1 right
        sRel= .Scale({0,.h,.w});   
      };      
      AnyRefNode SupportNodeLeft={  //disc1 left
        sRel= .Scale({0,.h,-.w});   
      };      
      
      AnyRefNode SupportNode2Right={  //disc2 right
        sRel= .Scale({0,.5*.h,.w});   
      };      
      AnyRefNode SupportNode2Left={  //disc2 left
        sRel= .Scale({0,.5*.h,-.w});   
      };      
      
      AnyRefNode SupportNode3Right={  //disc3 right
        sRel= .Scale({0,0,.w});   
      };      
      AnyRefNode SupportNode3Left={  //disc3 left
        sRel= .Scale({0,0,-.w});   
      };  
      
      AnyRefNode SupportNode4Right={  //disc4 right
        sRel= .Scale({0,-0.5*.h,.w});   
      };      
      AnyRefNode SupportNode4Left={  //disc4 left
        sRel= .Scale({0,-0.5*.h,-.w});   
      };  
      
      AnyRefNode SupportNode5Right={  //disc5 right
        sRel= .Scale({0,-.h,.w});   
      };      
      AnyRefNode SupportNode5Left={  //disc5 left
        sRel= .Scale({0,-.h,-.w});   
      };  
      
      AnyRefNode SupportNode1={  //disc1 
        sRel= .Scale({0,.h,0});   
      };      
      
      AnyRefNode SupportNode2={  //disc2 
        sRel= .Scale({0,.5*.h,0});   
      };      
      
      AnyRefNode SupportNode3={  //disc3 
        sRel= .Scale({0.0, 0.0, 0.0});   
      };      
      
      AnyRefNode SupportNode4={  //disc4 
        sRel= .Scale({0,-0.5*.h,0});   
      };      
      
      AnyRefNode SupportNode5={  //disc5 
        sRel= .Scale({0,-.h,0});   
      };      
      
      //Attachment points for muscles 
      AnyVar T1 =0.02;
      AnyVar T2=-0.04;
      
      //obliquusexternusleft
      
      AnyRefNode OEC6_RSNodeL= {        sRel= .Scale({-0.0000, 0.09, -0.02});      };
      AnyRefNode OEC7_RSNodeL= {        sRel= .Scale({-0.0000, 0.04, -0.02});      };
      AnyRefNode OEC8_RSNodeL= {        sRel= .Scale({-0.0000, -0.01, -0.0225});   };
      AnyRefNode OEC9_RSNodeL= {        sRel= .Scale({-0.0000, -0.05, -0.025});    };
      AnyRefNode OEC10_RSNodeL={        sRel= .Scale({-0.0000, -0.08, -0.03});     };
      
      //obliquusexternusright
      AnyRefNode OEC6_RSNodeR= {        sRel= .Scale({-0.0000, 0.09, 0.02});       };
      AnyRefNode OEC7_RSNodeR= {        sRel= .Scale({-0.0000, 0.04, 0.02});       };
      AnyRefNode OEC8_RSNodeR= {        sRel= .Scale({-0.0000, -0.01, 0.0225});    };
      AnyRefNode OEC9_RSNodeR= {        sRel= .Scale({-0.0000, -0.05,0.025});      };
      AnyRefNode OEC10_RSNodeR={        sRel= .Scale({-0.0000, -0.08, 0.03});      };
      
      
     
      //obliquusinternusleft
      AnyRefNode OICI_RS1NodeL={        sRel= .Scale({.0000, 0.09, -0.03});        };
      AnyRefNode OICI_RS2NodeL={        sRel= .Scale({.0000, 0.04, -0.03});        };
      AnyRefNode OICI_RS3NodeL={        sRel= .Scale({.0000, -0.01, -0.03});       };
      AnyRefNode OICI_RS4NodeL={        sRel= .Scale({0.0000, -0.05, -0.025});     };
      AnyRefNode OICI_RS5NodeL={        sRel= .Scale({0.0000, -0.08, -0.02});      };
      
      //obliquusinternusright
      AnyRefNode OICI_RS1NodeR={        sRel= .Scale({.0000, 0.09, 0.03});        };
      AnyRefNode OICI_RS2NodeR={        sRel= .Scale({.0000, 0.04, 0.03});        };
      AnyRefNode OICI_RS3NodeR={        sRel= .Scale({.0000, -0.01, 0.03});       };
      AnyRefNode OICI_RS4NodeR={        sRel= .Scale({0.0000, -0.05, 0.025});     };
      AnyRefNode OICI_RS5NodeR={        sRel= .Scale({0.0000, -0.08, 0.02});      };

      //Rectus abdominis Left side
      AnyRefNode RACP_CO5NodeL ={        sRel= .Scale({-0.0000, 0.0, 0.02});      };
      AnyRefNode RACP_CO6NodeL={        sRel= .Scale({-0.0000, 0.0, 0.02});      };
      AnyRefNode RACP_CO7NodeL={        sRel= .Scale({-0.0000, 0.0, 0.02});      };
      
      //Rectus abdominis Right side
      AnyRefNode RACP_CO5NodeR ={        sRel= .Scale({-0.0000, 0.0, -0.02});      };
      AnyRefNode RACP_CO6NodeR={        sRel= .Scale({-0.0000, 0.0, -0.02});      };
      AnyRefNode RACP_CO7NodeR={        sRel= .Scale({-0.0000, 0.0, -0.02});      };
      
      
      AnySurfEllipsoid elipsoid={
        AnyDrawParamSurf drw={Opacity=0.5;};
        Radius= .Scale({0.008,0.09,0.05});
      };
    };//buckle  
  }; //segments
  
  
  
  //Adding sliders for applying force to buckle
  
  AnyFolder Slider1={
    AnyVec3  r_vec=.Disc1.Disc.DiscSeg.node4.sRel*.Disc1.Disc.DiscSeg.Axes0'+...Trunk.SegmentsLumbar.L1Seg.MidPoint.sRel*...Trunk.SegmentsLumbar.PelvisSeg.Axes0'+...Trunk.SegmentsLumbar.PelvisSeg.r0;  
    AnySeg &StartNode = .Segments.BuckleSeg; //node on buckle
    AnyRefNode &DiscNode =.Disc1.Disc.DiscSeg.node4;
    AnyMat33 Axes= .Segments.BuckleSeg.Axes0;
    #include "Slider.any"
    
  };
  
  AnyFolder Slider2={
    AnyVec3  r_vec=.Disc2.Disc.DiscSeg.node4.sRel*.Disc2.Disc.DiscSeg.Axes0'+...Trunk.SegmentsLumbar.L2Seg.MidPoint.sRel*...Trunk.SegmentsLumbar.PelvisSeg.Axes0'+...Trunk.SegmentsLumbar.PelvisSeg.r0;  
    AnySeg &StartNode = .Segments.BuckleSeg; //node on buckle
    AnyRefNode &DiscNode =.Disc2.Disc.DiscSeg.node4;
    AnyMat33 Axes= .Segments.BuckleSeg.Axes0;
    #include "Slider.any"
  };
  
  AnyFolder Slider3={
    AnyVec3  r_vec=.Disc3.Disc.DiscSeg.node4.sRel*.Disc3.Disc.DiscSeg.Axes0'+...Trunk.SegmentsLumbar.L3Seg.MidPoint.sRel*...Trunk.SegmentsLumbar.PelvisSeg.Axes0'+...Trunk.SegmentsLumbar.PelvisSeg.r0;  
    AnySeg &StartNode = .Segments.BuckleSeg; //node on buckle
    AnyRefNode &DiscNode =.Disc3.Disc.DiscSeg.node4;
    AnyMat33 Axes= .Segments.BuckleSeg.Axes0;
    #include "Slider.any"
  };
  
  AnyFolder Slider4={
    AnyVec3  r_vec=.Disc4.Disc.DiscSeg.node4.sRel*.Disc4.Disc.DiscSeg.Axes0+...Trunk.SegmentsLumbar.L4Seg.MidPoint.sRel*...Trunk.SegmentsLumbar.PelvisSeg.Axes0'+...Trunk.SegmentsLumbar.PelvisSeg.r0;  
    AnySeg &StartNode = .Segments.BuckleSeg; //node on buckle
    AnyRefNode &DiscNode =.Disc4.Disc.DiscSeg.node4;
    AnyMat33 Axes= .Segments.BuckleSeg.Axes0;
    #include "Slider.any"
  };
  AnyFolder Slider5={
    AnyVec3  r_vec=.Disc5.Disc.DiscSeg.node4.sRel*.Disc5.Disc.DiscSeg.Axes0'+...Trunk.SegmentsLumbar.L5Seg.MidPoint.sRel*...Trunk.SegmentsLumbar.PelvisSeg.Axes0'+...Trunk.SegmentsLumbar.PelvisSeg.r0;  
    AnySeg &StartNode = .Segments.BuckleSeg; //node on buckle
    AnyRefNode &DiscNode =.Disc5.Disc.DiscSeg.node4;
    AnyMat33 Axes= .Segments.BuckleSeg.Axes0;
    #include "Slider.any"
  };
    
  
  AnyFolder AddOnNodes={
    
    AnyFolder &PelvisRef=..SegmentsLumbar.PelvisSeg;
    //AnyFolder &T12Ref=..SegmentsThorax.T12Seg;
    AnyFolder &Sternum=..SegmentsRibCage.SternalBodySeg;
    
    PelvisRef={
      //this the node where the force from the abdominal pressure is applied to
      AnyRefNode PressureNode           ={ sRel = .Scale(.StdPar.PressureNode_pos);};
      AnyRefNode BuckleNodeBottomCenter ={ sRel = .Scale(.StdPar.BuckleNodeBottomCenter_pos);};
      AnyRefNode BuckleNodeRight        ={ sRel = .Scale(.StdPar.Right.BuckleNode_pos);};
      AnyRefNode BuckleNodeLeft         ={ sRel = .Scale(.StdPar.Left.BuckleNode_pos);};
    };
    
    Sternum ={
      //this the node where the force from the abdominal pressure is applied to
      AnyRefNode PressureNode           ={ sRel = .Scale(.StdPar.Thorax.PressureNode_pos);};
      AnyRefNode BuckleNodeTopCenter    ={ sRel = .Scale(.StdPar.Thorax.BuckleNodeTopCenter_pos);};
      AnyRefNode BuckleNodeRight        ={ sRel = .Scale(.StdPar.Thorax.Right.BuckleNode_pos);};
      AnyRefNode BuckleNodeLeft         ={ sRel = .Scale(.StdPar.Thorax.Left.BuckleNode_pos);};
    };

  };
  
  AnyFolder Disc1 ={
    AnyRefNode &ref1 =...Trunk.SegmentsLumbar.L1Seg.MidPoint;

    AnySphericalJoint Jnt ={ 
      AnyRefNode &ref1 =....Trunk.SegmentsLumbar.L1Seg.MidPoint;
      AnyRefNode &ref2=.Disc.DiscSeg.node0;
    };

    AnyReacForce reaction ={
      AnySphericalJoint &ref=.Jnt;
    };
    
    AnyVec3  r_vec= (...Trunk.SegmentsLumbar.L1Seg.MidPoint.sRel * ...Trunk.SegmentsLumbar.L1Seg.Axes0') + ...Trunk.SegmentsLumbar.L1Seg.r0 ;
    AnyMat33 Axes_mat = ...Trunk.SegmentsLumbar.PelvisSeg.Axes0;
    
    AnyVar Ratio=5/6+0.08;
    AnyVar L0 = 0.220;     //half width sideways
    AnyVar L1 = 0.085+0.0; //depth of disc
    AnyVar L2 = 0.220;     //half width sideways
    AnyVar L3 = L1;
    AnyKinPLine &LinRight=.JointsAndDrivers.PLineMeasureRight;
    AnyKinPLine &LinLeft=.JointsAndDrivers.PLineMeasureLeft;
    AnyKinLinear &LinMid=.JointsAndDrivers.LinMeasure;
    
    #include "Disc.any"
  };
  
  
  AnyFolder Disc2 ={
    AnyRefNode &ref1 =...Trunk.SegmentsLumbar.L2Seg.MidPoint;

    AnySphericalJoint Jnt ={ 
      AnyRefNode &ref1 =....Trunk.SegmentsLumbar.L2Seg.MidPoint;
      AnyRefNode &ref2=.Disc.DiscSeg.node0;
    };

    AnyReacForce reaction ={
      AnySphericalJoint &ref=.Jnt;
    };
    
    AnyVec3  r_vec= (...Trunk.SegmentsLumbar.L2Seg.MidPoint.sRel * ...Trunk.SegmentsLumbar.L2Seg.Axes0') + ...Trunk.SegmentsLumbar.L2Seg.r0 ;
    AnyMat33 Axes_mat = ...Trunk.SegmentsLumbar.PelvisSeg.Axes0;
    
    AnyVar Ratio=4/6+0.08;
    AnyVar L0 = 0.220;
    AnyVar L1 = 0.07+0.0;
    AnyVar L2 = 0.220;
    AnyVar L3 = L1;
    AnyKinPLine &LinRight=.JointsAndDrivers.PLineMeasureRight;
    AnyKinPLine &LinLeft=.JointsAndDrivers.PLineMeasureLeft;
    AnyKinLinear &LinMid=.JointsAndDrivers.LinMeasure;
    
    #include "Disc.any"
    
  };
   
  AnyFolder Disc3 ={
    AnyRefNode &ref1 =...Trunk.SegmentsLumbar.L3Seg.MidPoint;

    AnySphericalJoint Jnt ={ 
      AnyRefNode &ref1 =....Trunk.SegmentsLumbar.L3Seg.MidPoint;
      AnyRefNode &ref2=.Disc.DiscSeg.node0;
    };

    AnyReacForce reaction ={
      AnySphericalJoint &ref=.Jnt;
    };
        
    AnyVec3  r_vec= (...Trunk.SegmentsLumbar.L3Seg.MidPoint.sRel * ...Trunk.SegmentsLumbar.L3Seg.Axes0') + ...Trunk.SegmentsLumbar.L3Seg.r0 ;
    
    AnyMat33 Axes_mat = ...Trunk.SegmentsLumbar.PelvisSeg.Axes0;
    
    AnyVar Ratio=3/6+0.05;
    AnyVar L0 = 0.220;
    AnyVar L1 = 0.06+0.0;
    AnyVar L2 = 0.220;
    AnyVar L3 = L1;
    AnyKinPLine &LinRight=.JointsAndDrivers.PLineMeasureRight;
    AnyKinPLine &LinLeft=.JointsAndDrivers.PLineMeasureLeft;
    AnyKinLinear &LinMid=.JointsAndDrivers.LinMeasure;
    #include "Disc.any"
  };
  
  AnyFolder Disc4 ={
     AnyRefNode &ref1 =...Trunk.SegmentsLumbar.L4Seg.MidPoint;

    AnySphericalJoint Jnt ={ 
      AnyRefNode &ref1 =....Trunk.SegmentsLumbar.L4Seg.MidPoint;
      AnyRefNode &ref2=.Disc.DiscSeg.node0;
    };
      
    AnyReacForce reaction ={
      AnySphericalJoint &ref=.Jnt;
    };
    
    AnyVec3  r_vec= (...Trunk.SegmentsLumbar.L4Seg.MidPoint.sRel * ...Trunk.SegmentsLumbar.L4Seg.Axes0') + ...Trunk.SegmentsLumbar.L4Seg.r0 ;
    
    AnyMat33 Axes_mat = ...Trunk.SegmentsLumbar.PelvisSeg.Axes0;
    
    AnyVar Ratio=2/6+0.075;
    AnyVar L0 = 0.220;
    AnyVar L1 = 0.045;//0.0475;
    AnyVar L2 = 0.220;
    AnyVar L3 = L1;
    AnyKinPLine &LinRight=.JointsAndDrivers.PLineMeasureRight;
    AnyKinPLine &LinLeft=.JointsAndDrivers.PLineMeasureLeft;
    AnyKinLinear &LinMid=.JointsAndDrivers.LinMeasure;
    
    #include "Disc.any"
    
  };
  
  AnyFolder Disc5 ={
     AnyRefNode &ref1 =...Trunk.SegmentsLumbar.L5Seg.MidPoint;

    AnySphericalJoint Jnt ={ 
      AnyRefNode &ref1 =....Trunk.SegmentsLumbar.L5Seg.MidPoint;
      AnyRefNode &ref2=.Disc.DiscSeg.node0;
    };
    
    AnyReacForce reaction ={
      AnySphericalJoint &ref=.Jnt;
    };
    
    AnyVec3  r_vec= (...Trunk.SegmentsLumbar.L5Seg.MidPoint.sRel * ...Trunk.SegmentsLumbar.L5Seg.Axes0') + ...Trunk.SegmentsLumbar.L5Seg.r0 ;
    
    AnyMat33 Axes_mat = ...Trunk.SegmentsLumbar.PelvisSeg.Axes0;
    
    AnyVar Ratio=1/6+0.1;
    AnyVar L0 = 0.220;
    AnyVar L1 = 0.035;//0.0425;
    AnyVar L2 = 0.220;
    AnyVar L3 = L1;
    AnyKinPLine &LinRight=.JointsAndDrivers.PLineMeasureRight;
    AnyKinPLine &LinLeft=.JointsAndDrivers.PLineMeasureLeft;
    AnyKinLinear &LinMid=.JointsAndDrivers.LinMeasure;
    
    #include "Disc.any"
  };
  
  #include "BuckleSupport.any"
  
  AnyFolder JointsAndDrivers={
    
    AnyKinLinear LinMeasure ={
      Ref=0; 
      AnyRefNode &ref1=..PelvisRef.BuckleNodeBottomCenter;
      AnyRefNode &ref2=..ThoraxRef.BuckleNodeTopCenter;
    };
    
    AnyKinRotational RotMeasure ={
      
      AnyRefNode &ref1=..PelvisRef.BuckleNodeBottomCenter;
      AnyRefNode &ref2=..ThoraxRef.BuckleNodeTopCenter;
      Type=RotVector; 
    };

    AnyKinLinear Disc3BuckleTopLin ={
      Ref=0; 
      AnyRefNode &ref1=..Disc3.Disc.DiscSeg.node4;
      AnyRefFrame &ref2=..Segments.BuckleSeg;
    };
    
    AnyKinRotational Disc3BuckleTopRot ={
      
      AnyRefNode &ref1=..Disc3.Disc.DiscSeg.node4;
      AnyRefFrame &ref2=..Segments.BuckleSeg;
      Type=RotVector; 
    };
    
    AnyKinEqSimpleDriver LinTopDrv={
      AnyKinLinear &ref=.Disc3BuckleTopLin;
      DriverPos={0,0,0};
      DriverVel={0,0,0};
      Reaction.Type={Off,Off,Off};
    };
    
    AnyKinEqSimpleDriver RotTopDrv={
      AnyKinRotational &ref1=.Disc3BuckleTopRot;
      MeasureOrganizer={1};
      DriverPos={0};
      DriverVel={0};
      Reaction.Type={Off};
    };
    
    AnyKinLinear Disc4BuckleBottomLin ={
      Ref=0; 
      AnyRefNode &ref1=..Disc4.Disc.DiscSeg.node4;
      AnyRefFrame &ref2=..Segments.BuckleSeg.Node5;
    };
    
    
    AnyKinEqSimpleDriver LinBottomDrv={
      AnyKinLinear &ref=.Disc4BuckleBottomLin;
      DriverPos={0,0};
      DriverVel={0,0};
      Reaction.Type={Off,Off};
      MeasureOrganizer={0,2};
    };
    
    AnyKinLinear LinMeasureRight ={
      Ref=0; 
      AnyRefNode &ref1=..PelvisRef.BuckleNodeRight;
      AnyRefNode &ref2=..ThoraxRef.BuckleNodeRight;
      //AnyDrawPLine drw={Thickness=0.00375;RGB=Main.DrawSettings.Colors.AnyBodyRed;};
      
    };
    
    ///This is the linear measure between pelvis and thorax
    AnyKinLinear LinMeasureLeft ={
      Ref=0; 
      AnyRefNode &ref1=..PelvisRef.BuckleNodeLeft;
      AnyRefNode &ref2=..ThoraxRef.BuckleNodeLeft;
      //AnyDrawPLine drw={Thickness=0.00375;RGB=Main.DrawSettings.Colors.AnyBodyRed;};
    };
    
    
    
    //Disc drivers
    ///This is the linear measure between pelvis and thorax
    AnyKinPLine PLineMeasureRight ={
      
      AnyRefNode &ref1=..PelvisRef.BuckleNodeRight;
      AnyRefNode &ref2=..ThoraxRef.BuckleNodeRight;
      //AnyDrawPLine drw={Thickness=0.00375;RGB=Main.DrawSettings.Colors.AnyBodyRed;};
      
    };
    
    ///This is the linear measure between pelvis and thorax
    AnyKinPLine PLineMeasureLeft ={
      AnyRefNode &ref1=..PelvisRef.BuckleNodeLeft;
      AnyRefNode &ref2=..ThoraxRef.BuckleNodeLeft;
      //AnyDrawPLine drw={Thickness=0.00375;RGB=Main.DrawSettings.Colors.AnyBodyRed;};
    };
    
    
    ///This is a PLine  between pelvis and thorax
    AnyKinPLine H ={
      AnyRefNode &ref1=..PelvisRef.PressureNode;//BuckleNodeRight;
      AnyRefNode &ref2=..ThoraxRef.PressureNode;//BuckleNodeRight;
      // AnyDrawPLine drw={Thickness=0.00375;RGB=Main.DrawSettings.Colors.AnyBodyRed;};
    };    
    
    //Definition of a segment which points from pelvis towards the thorax its 
    //origin is in the BuckleNodeRight and the segment always have its y axis points 
    //towards the thorax node BuckleNodeRight
    //The segment is used only for measuring purposes used in for driving the distances
    //between the disc's
    AnyFolder MeasuringSegmentRight={
      
      //create artifical segment
      //the segment is used for measuing purposes only
      AnySeg Seg={
        r0=.....Trunk.SegmentsLumbar.PelvisSeg.BuckleNodeRight.sRel*.....Trunk.SegmentsLumbar.PelvisSeg.Axes0'+.....Trunk.SegmentsLumbar.PelvisSeg.r0;   
        Axes0=.....Trunk.SegmentsLumbar.PelvisSeg.Axes0;
        Mass=1e-5;
        Jii={0,0,0};
        //AnyDrawRefFrame Drw={ScaleXYZ={0.1,0.1,0.1}; RGB={1,0,0};};
      };
      
      //Lock all lin dof to the bucklenoderight
      AnyKinEq LinCon ={
        AnyKinLinear Lin={
          AnyRefNode &ref1=....PelvisRef.BuckleNodeRight;
          AnySeg &ref2=..Seg;
        };
      };
      
      AnyReacForce RotReac={
        AnyKinRotational Rot={
          Type=RotAxesAngles;
          AnyRefNode &ref1=....PelvisRef.BuckleNodeRight;
          AnySeg &ref2=..Seg;
        };
      };
      
      //drive the x and z dof measured in the localcoordinate system of the new segment
      //to match the thorax.bucklenoderigth
      //This means that the segment will alway points with it z axis from pelvis.bucklenoderigth
      //towards thorax.bucklenoderight
      AnyKinEqSimpleDriver Drv1={
        AnyKinLinear Lin={
          Ref=0;
          AnySeg &ref2=..Seg;
          AnyRefNode &ref1=....ThoraxRef.BuckleNodeRight;
        };
        DriverPos={0,0};
        DriverVel={0,0};
        MeasureOrganizer={0,2};
        Reaction.Type={Off,Off};
      };
      
      
      //drive one rot dof 
      AnyKinEqSimpleDriver Drv2={
        AnyKinRotational Rot={
          Type=RotAxesAngles;
          AnyRefNode &ref1=....PelvisRef.BuckleNodeRight;
          AnySeg &ref2=..Seg;
        };      
        DriverPos={0};
        DriverVel={0};
        MeasureOrganizer={1};
        Reaction.Type={Off};
        
      };
      
      
    };
    
    //Used in the same way as the right side measurering segment
    AnyFolder MeasuringSegmentLeft={
      
      //create artifical segment
      //the segment is used for measuing purposes only
      AnySeg Seg={
        r0=.....Trunk.SegmentsLumbar.PelvisSeg.BuckleNodeLeft.sRel*.....Trunk.SegmentsLumbar.PelvisSeg.Axes0'+.....Trunk.SegmentsLumbar.PelvisSeg.r0;           
        Axes0=.....Trunk.SegmentsLumbar.PelvisSeg.Axes0;
        Mass=1e-5;
        Jii={0,0,0};
        //AnyDrawRefFrame Drw={ScaleXYZ={0.1,0.1,0.1}; RGB={1,0,0};};
      };
      
      //Lock all lin dof to the bucklenoderight
      AnyKinEq LinCon ={
        AnyKinLinear Lin={
          AnyRefNode &ref1=....PelvisRef.BuckleNodeLeft;
          AnySeg &ref2=..Seg;
        };
      };
      
      AnyReacForce RotReac={
        AnyKinRotational Rot={
          Type=RotAxesAngles;
          AnyRefNode &ref1=....PelvisRef.BuckleNodeLeft;
          AnySeg &ref2=..Seg;
        };
      };
      
      //drive the x and z dof measured in the localcoordinate system of the new segment
      //to match the thorax.bucklenoderight
      //This means that the segment will alway points with it z axis from pelvis.bucklenoderigth
      //towards thorax.bucklenoderight
      
      AnyKinEqSimpleDriver Drv1={
        AnyKinLinear Lin={
          Ref=0;
          AnySeg &ref2=..Seg;
          AnyRefNode &ref1=....ThoraxRef.BuckleNodeLeft;
        };
        
        DriverPos={0,0};
        DriverVel={0,0};
        MeasureOrganizer={0,2};
        Reaction.Type={Off,Off};
      };
      
      //drive one rot dof 
      AnyKinEqSimpleDriver Drv2={
        AnyKinRotational Rot={
          Type=RotAxesAngles;
          AnyRefNode &ref1=....PelvisRef.BuckleNodeLeft;
          AnySeg &ref2=..Seg;
        };      
        DriverPos={0};
        DriverVel={0};
        MeasureOrganizer={1};
        Reaction.Type={Off};
      };
    };
    
    
  };

  //  The abdominal model can generate forces to the rest of the model according to the way the volume 
  //  is measured. This means that all measures in the volume may generate a force, since we have an 
  //  abdominal muscle working on the volume.
  //  //  
  AnyKinMeasureLinComb  AbdominalVol= {
    
    AnyKinMeasure& L1=.Disc1.Disc.VirtuelSegDiscJnt;
    AnyKinMeasure& L2=.Disc2.Disc.VirtuelSegDiscJnt;
    AnyKinMeasure& L3=.Disc3.Disc.VirtuelSegDiscJnt;
    AnyKinMeasure& L4=.Disc4.Disc.VirtuelSegDiscJnt;
    AnyKinMeasure& L5=.Disc5.Disc.VirtuelSegDiscJnt;  
    
    AnyKinPLine &ref7=.JointsAndDrivers.H;    
    
    AnyVar Disc1Coef =  2*pi*R*H0*1/5;
    AnyVar Disc2Coef =  2*pi*R*H0*1/5;
    AnyVar Disc3Coef =  2*pi*R*H0*1/5;
    AnyVar Disc4Coef =  2*pi*R*H0*1/5;
    AnyVar Disc5Coef =  2*pi*R*H0*1/5;
    
    AnyVar R = 0.12; //equivalent radius
    AnyVar Area=pi*R^2;
    AnyVar H0=0.28; //initial height
    
    AnyVar dvdh=Area;
    AnyVar F=1;
    
    OutDim = 1;
    Coef={{F*Disc1Coef,F*Disc2Coef,F*Disc3Coef,F*Disc4Coef,F*Disc5Coef,F*dvdh}};   
  }; // Measure
  
  //1 mmHg = 0.133 kPa  Pa=N/m^2
  //A maximum pressure of 200mmHg was found in Morten Essendrup Ph.D. report
  //SIGNIFICANCE OF INTRA-ABDOMINAL PRESSURE
  //IN WORK RELATED TRUNK-LOADING
  //200mmHg=26.6KPa = 26.6*10^3 N/m^2
  
  //In the AnyBody Modeling System, if a force is applied to this volume it becomes an abdominal pressure!
  //A muscle with a strength equivalent to the maximal abdominal pressure is working on the volume.
  
  AnyVar StrengthScaleSpine = ...Scaling.StrengthScaling.Spine.StrengthScale;
  
 
  AnyRecruitedActuator AbdominalPressureMuscle1={
    AnyKinMeasureLinComb  &ref=.AbdominalVol;
    Strength = 26600*. StrengthScaleSpine;
    Type = NonNegative;//push
    SET_DEFAULT_ACTUATOR_VOLUME;
  };
};