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)