55                         const Vec3& fOTmp, 
const Vec3& fATmp, 
 
   56                         const Vec3& fBTmp, 
const Vec3& fITmp,
 
   58                         const unsigned int iIntOrder, 
const unsigned int iIntSegments,
 
   92         l1 = R1*(fATmp - fOTmp);
 
   93         l2 = R2*(fBTmp - fITmp);
 
  109                 for (
unsigned int jj = 0; jj < iIntSegments; jj++) {
 
  116                                 dLength = dLength + s*gp.dGetWght()*p.
Norm();
 
  118                         } 
while (gdi->fGetNext(gp)); 
 
  125         ASSERT(dLength > std::numeric_limits<doublereal>::epsilon());
 
  140         out << 
", rod bezier, " 
  142                 << 
"position, reference, node, "; 
 
  144                 << 
"position, reference, node, "; 
fA.
Write(out, 
", ") << 
"," << std::endl
 
  146                 << 
"position, reference, node, "; 
fO.
Write(out, 
", ") << 
", " 
  147                 << 
"position, reference, node, "; 
fA.
Write(out, 
", ") << 
"," << std::endl
 
  148                 << 
dL0 << 
"," << std::endl
 
  149                 << 
"integration order, " << 
iIntOrd << 
", " 
  150                 << 
"integration segments, " << 
iIntSeg << 
", ";
 
  151         return pGetConstLaw()->Restart(out) << 
';' << std::endl;
 
  168         DEBUGCOUT(
"Entering RodBezier::AssJac()" << std::endl);
 
  185         for (
int iCnt = 1; iCnt <= 6; iCnt++) {
 
  188                 WM.
PutRowIndex(6 + iCnt, iNode2FirstMomIndex + iCnt);
 
  189                 WM.
PutColIndex(6 + iCnt, iNode2FirstPosIndex + iCnt);
 
  213         doublereal q, up, pNorm, dKC, dAp1, dAp2, dAp3, dAp4;
 
  223         for (
unsigned int jj = 0; jj < 
iIntSeg; jj++) {
 
  235                         p = b1*dAp1 + b2*dAp2 + b3*dAp3 + b4*dAp4;
 
  237                         dKC = (s*gp.dGetWght())/(2*
dL0*pNorm);
 
  239                         kcx1 = kcx1 + p*(dFDE*dKC*dCoef*(dAp1 + dAp2));
 
  241                         kcg1 = kcg1 + p.
Cross(fOTmp*dAp1 + fATmp*dAp2)*dFDE*dKC*dCoef;
 
  243                         kcx2 = kcx2 + p*dFDE*dKC*dCoef*(dAp3 + dAp4);
 
  245                         kcg2 = kcg2 + p.
Cross(fBTmp*dAp3 +fITmp*dAp4)*dFDE*dKC*dCoef;
 
  247                         if (dFDEPrime != 0.) {
 
  248                                 kcx1 = kcx1 + p*dFDEPrime*dKC*(dAp1 + dAp2);
 
  250                                 TmpV = p*2. - p.
Cross(fOTmp*dAp1 + fATmp*dAp2);
 
  251                                 kcg1 = kcg1 - Omega1.
Cross(TmpV)*dFDEPrime*dKC*dCoef;
 
  253                                 kcx2 = kcx2 + p*dFDEPrime*dKC*(dAp3 + dAp4);
 
  255                                 TmpV = p*2. - p.
Cross(fBTmp*dAp3 + fITmp*dAp4);
 
  256                                 kcg2 = kcg2 + Omega2.
Cross(TmpV)*dFDEPrime*dKC*dCoef;
 
  269         WM.
Sub(3 + 1, 1, M1x1);
 
  273         WM.
Add(6 + 1, 1, F2x1);
 
  277         WM.
Sub(9 + 1, 1, M2x1);
 
  281         WM.
Add(1, 3 + 1, F1g1);
 
  285         WM.
Sub(3 + 1, 3 + 1, M1g1);
 
  289         WM.
Add(6 + 1, 3 + 1, F2g1);
 
  293         WM.
Sub(9 + 1, 3 + 1, M2g1);
 
  297         WM.
Add(1, 6 + 1, F1x2);
 
  301         WM.
Sub(3 + 1, 6 + 1, M1x2);
 
  305         WM.
Add(6 + 1, 6 + 1, F2x2);
 
  309         WM.
Sub(9 + 1, 6 + 1, M2x2);
 
  313         WM.
Add(1, 9 + 1, F1g2);
 
  317         WM.
Sub(3 + 1, 9 + 1, M1g2);
 
  321         WM.
Add(6 + 1, 9 + 1, F2g2);
 
  325         WM.
Sub(9 + 1, 9 + 1, M2g2);
 
  337         DEBUGCOUT(
"RodBezier::AssRes()" << std::endl);
 
  350         for (
int iCnt = 1; iCnt <= 6; iCnt++) {
 
  351                 WorkVec.
PutRowIndex(iCnt, iNode1FirstMomIndex + iCnt);
 
  352                 WorkVec.
PutRowIndex(6 + iCnt, iNode2FirstMomIndex + iCnt);
 
  363         DEBUGCOUT(
"RodBezier::AssVec()" << std::endl);
 
  387         for (
unsigned int jj = 0; jj < 
iIntSeg; jj++) {
 
  399                         p = (x1 + fOTmp)*dAp1 + 
 
  404                         dElle = dElle + s*gp.dGetWght()*p.
Norm();
 
  405                         pprime = (v1 + Omega1.Cross(fOTmp))*dAp1 + 
 
  406                                  (v1 + Omega1.Cross(fATmp))*dAp2 +
 
  407                                  (v2 + Omega2.Cross(fBTmp))*dAp3 + 
 
  408                                  (v2 + Omega2.Cross(fITmp))*dAp4;
 
  409                         dEllePrime = dEllePrime + .5*s*gp.dGetWght()/p.
Norm()*p.
Dot(pprime);
 
  414         if (dElle <= std::numeric_limits<doublereal>::epsilon()) {
 
  415                 silent_cerr(
"RodBezier(" << 
GetLabel() << 
"): " 
  416                         "null length of element." << std::endl);
 
  427         bool ChangeJac(
false);
 
  442         WorkVec.
Add(3 + 1, fOTmp.Cross(F1));
 
  443         WorkVec.
Add(6 + 1, F2);
 
  444         WorkVec.
Add(9 + 1, fITmp.
Cross(F2));
 
  455                 ASSERT(
dElle > std::numeric_limits<doublereal>::epsilon());
 
  458                 std::ostream& out = OH.
Joints();
 
  462                         << 
" " << 
l2*dF << 
" " << 
dElle << 
" " << 
l1 << 
" "  
  473         DEBUGCOUT(
"Entering RodBezier::InitialAssJac()" << std::endl);
 
  485         integer iNode1FirstVelIndex = iNode1FirstPosIndex + 6;
 
  487         integer iNode2FirstVelIndex = iNode2FirstPosIndex + 6;
 
  490         for (
int iCnt = 1; iCnt <= 6; iCnt++) {
 
  493                 WM.
PutColIndex(6 + iCnt, iNode1FirstVelIndex + iCnt);
 
  495                 WM.
PutRowIndex(6 + iCnt, iNode2FirstPosIndex + iCnt);
 
  496                 WM.
PutColIndex(12 + iCnt, iNode2FirstPosIndex + iCnt);
 
  497                 WM.
PutColIndex(18 + iCnt, iNode2FirstVelIndex + iCnt);
 
  520         const Vec3 b1 = x1 + R1*
fO; 
 
  521         const Vec3 b2 = x1 + R1*
fA; 
 
  522         const Vec3 b3 = x2 + R2*
fB; 
 
  523         const Vec3 b4 = x2 + R2*
fI; 
 
  526         doublereal q, up, pNorm, dKC, dAp1, dAp2, dAp3, dAp4;
 
  543         for (
unsigned int jj = 0; jj < 
iIntSeg; jj++) {
 
  555                         p = b1*dAp1 + b2*dAp2 + b3*dAp3 + b4*dAp4;
 
  557                         dKC = (s*gp.dGetWght())/(2*
dL0*pNorm);
 
  559                         kx1 = kx1 + p*dFDE*dKC*(dAp1 + dAp2);
 
  561                         TmpV = fOTmp*dAp1 + fATmp*dAp2;
 
  562                         kg1 = kg1 - TmpV.
Cross(p)*dFDE*dKC;
 
  564                         kx2 = kx2 + p*dFDE*dKC*(dAp3 + dAp4);
 
  566                         TmpV = fBTmp*dAp3 + fITmp*dAp4;
 
  567                         kg2 = kg2 - TmpV.
Cross(p)*dFDE*dKC;
 
  569                         if (dFDEPrime != 0.) {
 
  570                                 TmpV = Omega1.
Cross(p);
 
  571                                 cg1 = cg1 - TmpV.
Cross(fATmp*dAp2 - fOTmp*dAp1)*dFDEPrime*dKC;
 
  573                                 cxp1 = cxp1 + p*dFDEPrime*dKC*(dAp1 + dAp2);
 
  575                                 com1 = com1 - p.
Cross(fATmp*dAp2 - fOTmp*dAp1)*dFDEPrime*dKC;
 
  577                                 TmpV = Omega2.
Cross(p);
 
  578                                 cg2 = cg2 + TmpV.
Cross(fITmp*dAp4 - fBTmp*dAp3)*dFDEPrime*dKC;
 
  580                                 cxp2 = cxp2 + p*dFDEPrime*dKC*(dAp3 + dAp4);
 
  582                                 com2 = com2 - p.
Cross(fITmp*dAp4 - fBTmp*dAp3)*dFDEPrime*dKC;
 
  595         if (dFDEPrime != 0.) {
 
  599         WM.
Add(1, 3 + 1, F1g1);
 
  603         if (dFDEPrime != 0.) {
 
  605                 WM.
Add(1, 6 + 1, F1xp1);
 
  610         if (dFDEPrime != 0.) {
 
  612                 WM.
Add(1, 9 + 1, F1om1);
 
  617         WM.
Add(1, 12 + 1, F1x2);
 
  621         if (dFDEPrime != 0.) {
 
  625         WM.
Add(1, 15 + 1, F1g2);
 
  629         if (dFDEPrime != 0.) {
 
  631                 WM.
Add(1, 18 + 1, F1xp2);
 
  636         if (dFDEPrime != 0.) {
 
  638                 WM.
Add(1, 21 + 1, F1om2);
 
  643         WM.
Sub(3 + 1, 1, M1x1);
 
  647         WM.
Sub(3 + 1, 3 + 1, M1g1);
 
  650         if (dFDEPrime != 0.) {
 
  651                 Mat3x3 M1xp1 = Mat3x3(
MatCross, fOTmp)*F1xp1;
 
  652                 WM.
Sub(3 + 1, 6 + 1, M1xp1);
 
  656         if (dFDEPrime != 0.) {  
 
  657                 Mat3x3 M1om1 = Mat3x3(
MatCross, fOTmp)*F1om1;
 
  658                 WM.
Sub(3 + 1, 9 + 1, M1om1);
 
  662         Mat3x3 M1x2 = Mat3x3(
MatCross, fOTmp)*F1x2;
 
  663         WM.
Sub(3 + 1, 12 + 1, M1x2);
 
  666         Mat3x3 M1g2 = Mat3x3(
MatCross, fOTmp)*F1g2;
 
  667         WM.
Sub(3 + 1, 15 + 1, M1g2);
 
  670         if (dFDEPrime != 0.) {
 
  671                 Mat3x3 M1xp2 = Mat3x3(
MatCross, fOTmp)*F1xp2;
 
  672                 WM.
Sub(3 + 1, 18 + 1, M1xp2);
 
  676         if (dFDEPrime != 0.) {
 
  677                 Mat3x3 M1om2 = Mat3x3(
MatCross, fOTmp)*F1om2;
 
  678                 WM.
Sub(3 + 1, 21 + 1, M1om2);
 
  682         Mat3x3 F2x1 = 
l2.
Tens(kx1);
 
  683         WM.
Add(6 + 1, 1, F1x1);
 
  687         Mat3x3 F2g1 = 
l2.
Tens(Tmp1);
 
  688         WM.
Add(6 + 1, 3 + 1, F2g1);
 
  692         if (dFDEPrime != 0.) {
 
  694                 WM.
Add(6 + 1, 6 + 1, F2xp1);
 
  699         if (dFDEPrime != 0.) {
 
  701                 WM.
Add(6 + 1, 9 + 1, F2om1);
 
  705         Mat3x3 F2x2 = 
l2.
Tens(kx2);
 
  706         WM.
Add(6 + 1, 12 + 1, F2x2);
 
  711         WM.
Add(6 + 1, 15 + 1, F2g2);
 
  715         if (dFDEPrime != 0.) {
 
  717                 WM.
Add(6 + 1, 18 + 1, F2xp2);
 
  722         if (dFDEPrime != 0.) {
 
  724                 WM.
Add(6 + 1, 21 + 1, F2om2);
 
  728         Mat3x3 M2x1 = Mat3x3(
MatCross, fITmp)*F2x1;
 
  729         WM.
Sub(9 + 1, 1, M2x1);
 
  732         Mat3x3 M2g1 = Mat3x3(
MatCross, fITmp)*F2g1;
 
  733         WM.
Sub(9 + 1, 3 + 1, M1g1);
 
  736         if (dFDEPrime != 0.) {
 
  737                 Mat3x3 M2xp1 = Mat3x3(
MatCross, fITmp)*F2xp1;
 
  738                 WM.
Sub(9 + 1, 6 + 1, M2xp1);
 
  742         if (dFDEPrime != 0.) {  
 
  743                 Mat3x3 M2om1 = Mat3x3(
MatCross, fITmp)*F2om1;
 
  744                 WM.
Sub(9 + 1, 9 + 1, M2om1);
 
  748         Mat3x3 M2x2 = Mat3x3(
MatCross, fITmp)*F2x2;
 
  749         WM.
Sub(9 + 1, 12 + 1, M2x2);
 
  753         WM.
Sub(9 + 1, 15 + 1, M2g2);
 
  756         if (dFDEPrime != 0.) {
 
  757                 Mat3x3 M2xp2 = Mat3x3(
MatCross, fITmp)*F2xp2;
 
  758                 WM.
Sub(9 + 1, 18 + 1, M2xp2);
 
  762         if (dFDEPrime != 0.) {
 
  763                 Mat3x3 M2om2 = Mat3x3(
MatCross, fITmp)*F2om2;
 
  764                 WM.
Sub(9 + 1, 21 + 1, M2om2);
 
  775         DEBUGCOUT(
"RodBezier::InitialAssRes()" << std::endl);
 
  788         for (
int iCnt = 1; iCnt <= 6; iCnt++) {
 
  789                 WorkVec.
PutRowIndex(iCnt, iNode1FirstPosIndex + iCnt);
 
  790                 WorkVec.
PutRowIndex(6 + iCnt, iNode2FirstPosIndex + iCnt);
 
  811         return AssJac(WorkMat, 1., XCurr, XCurr);
 
  822         DEBUGCOUT(
"Entering RodBezier::AssRes()" << std::endl);
 
  827         return AssRes(WorkVec, 1., XCurr, XPrimeCurr);
 
  856         if (strcmp(s, 
"F") == 0) {
 
  860         if (strcmp(s, 
"L") == 0) {
 
  864         if (strcmp(s, 
"LPrime") == 0) {
 
  868         size_t l = 
STRLENOF(
"constitutiveLaw.");
 
  869         if (strncmp(s, 
"constitutiveLaw.", l) == 0) {
 
RodBezier(unsigned int uL, const DofOwner *pDO, const ConstitutiveLaw1D *pCL, const StructNode *pN1, const StructNode *pN2, const Vec3 &fOTmp, const Vec3 &fATmp, const Vec3 &fBTmp, const Vec3 &fITmp, doublereal dLength, bool bFromNodes, const unsigned int iIntOrder, const unsigned int iIntSegments, flag fOut)
void AssVec(SubVectorHandler &WorkVec)
void PutColIndex(integer iSubCol, integer iCol)
const Vec3 Zero3(0., 0., 0.)
Vec3 Cross(const Vec3 &v) const 
std::ostream & Write(std::ostream &out, const char *sFill=" ") const 
virtual const Mat3x3 & GetRRef(void) const 
virtual bool bToBeOutput(void) const 
ConstitutiveLaw< T, Tder > * pGetConstLaw(void) const 
#define MBDYN_EXCEPT_ARGS
virtual void ResizeReset(integer)
const MatCross_Manip MatCross
FullSubMatrixHandler & SetFull(void)
virtual const Mat3x3 & GetRCurr(void) const 
virtual Node::Type GetNodeType(void) const 
doublereal Norm(void) const 
doublereal Dot(const Vec3 &v) const 
bool bIsErgonomy(void) const 
void Add(integer iRow, integer iCol, const Vec3 &v)
virtual unsigned int iGetPrivDataIdx(const char *s) const 
virtual bool bInverseDynamics(void) const 
flag fGetNext(doublereal &d, integer i=0) const 
PntWght GetFirst(void) const 
virtual void AfterConvergence(const VectorHandler &X, const VectorHandler &XP)
virtual SubVectorHandler & AssRes(SubVectorHandler &WorkVec, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
const Tder & GetFDE(void) const 
doublereal Ap2(doublereal u)
virtual unsigned int iGetNumPrivData(void) const 
virtual const Vec3 & GetWRef(void) const 
void Output(OutputHandler &OH) const 
virtual VariableSubMatrixHandler & InitialAssJac(VariableSubMatrixHandler &WorkMat, const VectorHandler &XCurr)
virtual void PutRowIndex(integer iSubRow, integer iRow)=0
virtual std::ostream & Restart(std::ostream &out) const 
virtual std::ostream & OutputAppend(std::ostream &out) const 
virtual void InitialWorkSpaceDim(integer *piNumRows, integer *piNumCols) const 
virtual integer iGetFirstMomentumIndex(void) const =0
virtual integer iGetFirstPositionIndex(void) const 
virtual const Vec3 & GetWCurr(void) const 
virtual std::ostream & Restart(std::ostream &out) const 
std::ostream & Joints(void) const 
doublereal Ap4(doublereal u)
void AfterConvergence(const T &Eps, const T &EpsPrime=mb_zero< T >())
#define ASSERT(expression)
Mat3x3 Tens(const Vec3 &v) const 
virtual unsigned int iGetPrivDataIdx(const char *s) const 
virtual const Vec3 & GetXCurr(void) const 
virtual void Add(integer iRow, const Vec3 &v)
virtual void ResizeReset(integer, integer)
const StructNode * pNode1
virtual doublereal dGetPrivData(unsigned int i) const 
const MatCrossCross_Manip MatCrossCross
doublereal dGetPnt(void) const 
doublereal Ap3(doublereal u)
void PutRowIndex(integer iSubRow, integer iRow)
const T & GetF(void) const 
virtual SubVectorHandler & InitialAssRes(SubVectorHandler &WorkVec, const VectorHandler &XCurr)
virtual const Vec3 & GetVCurr(void) const 
void Sub(integer iRow, integer iCol, const Vec3 &v)
const Tder & GetFDEPrime(void) const 
std::ostream & Output(std::ostream &out, const char *sJointName, unsigned int uLabel, const Vec3 &FLocal, const Vec3 &MLocal, const Vec3 &FGlobal, const Vec3 &MGlobal) const 
void Update(const T &Eps, const T &EpsPrime=mb_zero< T >())
virtual void WorkSpaceDim(integer *piNumRows, integer *piNumCols) const 
void Update(const VectorHandler &XCurr, InverseDynamics::Order iOrder=InverseDynamics::INVERSE_DYNAMICS)
unsigned int GetLabel(void) const 
const StructNode * pNode2
doublereal dGetPrivData(unsigned int i) const 
virtual VariableSubMatrixHandler & AssJac(VariableSubMatrixHandler &WorkMat, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
virtual unsigned int iGetNumPrivData(void) const 
doublereal Ap1(doublereal u)