49 pNode1(pN1), pNode2(pN2),
50 R1h(R1hTmp), R2h(R2hTmp), M(
Zero3)
70 "INDEX ERROR in PrismaticJoint::GetEqType");
80 <<
", hinge, reference, node, 1, ", (
R1h.
GetVec(1)).
Write(out,
", ")
83 <<
", hinge, reference, node, 1, ", (
R2h.
GetVec(1)).
Write(out,
", ")
97 DEBUGCOUT(
"Entering PrismaticJoint::AssJac()" << std::endl);
141 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
153 Vec3 e1a(R1hTmp.GetVec(1));
154 Vec3 e2a(R1hTmp.GetVec(2));
155 Vec3 e3a(R1hTmp.GetVec(3));
156 Vec3 e1b(R2hTmp.GetVec(1));
157 Vec3 e2b(R2hTmp.GetVec(2));
158 Vec3 e3b(R2hTmp.GetVec(3));
163 Mat3x3 MWedgeT(MWedge.Transpose());
165 WM.
Add(1, 1, MWedge);
166 WM.
Sub(1, 4, MWedgeT);
168 WM.
Add(4, 1, MWedgeT);
169 WM.
Sub(4, 4, MWedge);
171 Vec3 v1(e2a.Cross(e3b));
172 Vec3 v2(e3a.Cross(e1b));
173 Vec3 v3(e1a.Cross(e2b));
175 MWedge =
Mat3x3(v1, v2, v3);
177 WM.
Add(1, 7, MWedge);
178 WM.
Sub(4, 7, MWedge);
192 MWedge = MWedge.Transpose();
194 WM.
Add(7, 1, MWedge);
195 WM.
Sub(7, 4, MWedge);
207 DEBUGCOUT(
"Entering PrismaticJoint::AssRes()" << std::endl);
221 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
222 WorkVec.
PutRowIndex(0+iCnt, iNode1FirstMomIndex+iCnt);
223 WorkVec.
PutRowIndex(3+iCnt, iNode2FirstMomIndex+iCnt);
225 WorkVec.
PutRowIndex(6+iCnt, iFirstReactionIndex+iCnt);
229 M =
Vec3(XCurr, iFirstReactionIndex+1);
235 Vec3 e1a(R1hTmp.GetVec(1));
236 Vec3 e2a(R1hTmp.GetVec(2));
237 Vec3 e3a(R1hTmp.GetVec(3));
238 Vec3 e1b(R2hTmp.GetVec(1));
239 Vec3 e2b(R2hTmp.GetVec(2));
240 Vec3 e3b(R2hTmp.GetVec(3));
242 Vec3 MTmp(
Mat3x3(e2a.Cross(e3b), e3a.Cross(e1b), e1a.Cross(e2b))*
M);
245 WorkVec.
Sub(1, MTmp);
248 WorkVec.
Add(4, MTmp);
254 WorkVec.
PutCoef(7, -(e3b.Dot(e2a)/dCoef));
255 WorkVec.
PutCoef(8, -(e1b.Dot(e3a)/dCoef));
256 WorkVec.
PutCoef(9, -(e2b.Dot(e1a)/dCoef));
303 for (
unsigned i = 0; i < ph->size(); i++) {
316 }
else if (dynamic_cast<Joint::ReactionsHint *>(pjh)) {
326 if (strncasecmp(s,
"hinge{" ,
STRLENOF(
"hinge{" )) == 0) {
329 if (strcmp(&s[1],
"}") != 0) {
350 DEBUGCOUT(
"Entering PrismaticJoint::InitialAssJac()" << std::endl);
365 integer iNode1FirstVelIndex = iNode1FirstPosIndex+6;
367 integer iNode2FirstVelIndex = iNode2FirstPosIndex+6;
369 integer iReactionPrimeIndex = iFirstReactionIndex+3;
376 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
388 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
399 Vec3 MPrime(XCurr, iReactionPrimeIndex+1);
417 Mat3x3 MWedgeT(MWedge.Transpose());
420 WM.
Add(1, 1, MWedge);
421 WM.
Sub(1, 7, MWedgeT);
423 WM.
Add(7, 1, MWedgeT);
424 WM.
Sub(7, 7, MWedge);
427 WM.
Add(4, 4, MWedge);
428 WM.
Sub(4, 10, MWedgeT);
430 WM.
Add(10, 4, MWedgeT);
431 WM.
Sub(10, 10, MWedge);
442 WM.
Add(4, 1, MWedge);
443 WM.
Sub(10, 1, MWedge);
453 WM.
Sub(4, 7, MWedge);
454 WM.
Add(10, 7, MWedge);
456 Vec3 v1(e2a.Cross(e3b));
457 Vec3 v2(e3a.Cross(e1b));
458 Vec3 v3(e1a.Cross(e2b));
461 if (v1.Dot() < std::numeric_limits<doublereal>::epsilon()
462 || v2.Dot() < std::numeric_limits<doublereal>::epsilon()
463 || v3.Dot() < std::numeric_limits<doublereal>::epsilon())
465 silent_cerr(
"PrismaticJoint(" <<
GetLabel() <<
"): "
466 "first and second node hinge axes are (nearly) orthogonal"
471 MWedge =
Mat3x3(v1, v2, v3);
474 WM.
Add(1, 13, MWedge);
475 WM.
Sub(7, 13, MWedge);
478 WM.
Add(4, 16, MWedge);
479 WM.
Sub(10, 16, MWedge);
482 MWedge = MWedge.Transpose();
485 WM.
Add(13, 1, MWedge);
486 WM.
Sub(13, 7, MWedge);
489 WM.
Add(16, 4, MWedge);
490 WM.
Sub(16, 10, MWedge);
492 v1 = e3b.Cross(e2a.Cross(Omega1)) + e2a.Cross(Omega2.Cross(e3b));
493 v2 = e1b.Cross(e3a.Cross(Omega1)) + e3a.Cross(Omega2.Cross(e1b));
494 v3 = e2b.Cross(e1a.Cross(Omega1)) + e1a.Cross(Omega2.Cross(e2b));
496 MWedge =
Mat3x3(v1, v2, v3);
499 WM.
Add(4, 13, MWedge);
500 WM.
Sub(10, 13, MWedge);
503 Omega1 = Omega1 - Omega2;
505 v1 = e2a.Cross(e3b.Cross(Omega1));
506 Vec3 v1p(e3b.Cross(Omega1.Cross(e2a)));
507 v2 = e3a.Cross(e1b.Cross(Omega1));
508 Vec3 v2p(e1b.Cross(Omega1.Cross(e3a)));
509 v3 = e1a.Cross(e2b.Cross(Omega1));
510 Vec3 v3p(e2b.Cross(Omega1.Cross(e1a)));
512 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
538 DEBUGCOUT(
"Entering PrismaticJoint::InitialAssRes()" << std::endl);
548 integer iNode1FirstVelIndex = iNode1FirstPosIndex+6;
550 integer iNode2FirstVelIndex = iNode2FirstPosIndex+6;
552 integer iReactionPrimeIndex = iFirstReactionIndex+3;
555 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
556 WorkVec.
PutRowIndex(0+iCnt, iNode1FirstPosIndex+iCnt);
557 WorkVec.
PutRowIndex(3+iCnt, iNode1FirstVelIndex+iCnt);
558 WorkVec.
PutRowIndex(6+iCnt, iNode2FirstPosIndex+iCnt);
559 WorkVec.
PutRowIndex(9+iCnt, iNode2FirstVelIndex+iCnt);
562 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
563 WorkVec.
PutRowIndex(12+iCnt, iFirstReactionIndex+iCnt);
573 M =
Vec3(XCurr, iFirstReactionIndex+1);
574 Vec3 MPrime(XCurr, iReactionPrimeIndex+1);
587 Vec3 MTmp(e2a.Cross(e3b*M(1))
589 +e1a.Cross(e2b*
M(3)));
592 WorkVec.
Add(1, -MTmp);
595 WorkVec.
Add(7, MTmp);
598 (e2a.Cross(Omega2.Cross(e3b)) - e3b.Cross(Omega1.Cross(e2a)))*
M(1)
599 +(e3a.Cross(Omega2.Cross(e1b)) - e1b.Cross(Omega1.Cross(e3a)))*
M(2)
600 +(e1a.Cross(Omega2.Cross(e2b)) - e2b.Cross(Omega1.Cross(e1a)))*
M(3)
601 +e2a.
Cross(e3b*MPrime(1))
602 +e3a.
Cross(e1b*MPrime(2))
603 +e1a.
Cross(e2b*MPrime(3));
606 WorkVec.
Add(4, -MTmp);
609 WorkVec.
Add(10, MTmp);
612 WorkVec.
PutCoef(13, -(e3b.Dot(e2a)));
613 WorkVec.
PutCoef(14, -(e1b.Dot(e3a)));
614 WorkVec.
PutCoef(15, -(e2b.Dot(e1a)));
617 Omega2 = Omega2-Omega1;
618 WorkVec.
PutCoef(16, (e2a.Cross(e3b)).
Dot(Omega2));
619 WorkVec.
PutCoef(17, (e3a.Cross(e1b)).
Dot(Omega2));
620 WorkVec.
PutCoef(18, (e1a.Cross(e2b)).
Dot(Omega2));
VariableSubMatrixHandler & AssJac(VariableSubMatrixHandler &WorkMat, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
void PutColIndex(integer iSubCol, integer iCol)
const Vec3 Zero3(0., 0., 0.)
Vec3 Cross(const Vec3 &v) const
#define ASSERTMSGBREAK(expr, msg)
virtual const Mat3x3 & GetRRef(void) const
void WorkSpaceDim(integer *piNumRows, integer *piNumCols) const
virtual bool bToBeOutput(void) const
PrismaticJoint(unsigned int uL, const DofOwner *pDO, const StructNode *pN1, const StructNode *pN2, const Mat3x3 &R1hTmp, const Mat3x3 &R2hTmp, flag fOut)
#define MBDYN_EXCEPT_ARGS
virtual void ResizeReset(integer)
const MatCross_Manip MatCross
bool UseNetCDF(int out) const
FullSubMatrixHandler & SetFull(void)
virtual const Mat3x3 & GetRCurr(void) const
virtual Node::Type GetNodeType(void) const
void Add(integer iRow, integer iCol, const Vec3 &v)
std::ostream & Write(std::ostream &out, const FullMatrixHandler &m, const char *s, const char *s2)
const StructNode * pNode1
virtual void Sub(integer iRow, const Vec3 &v)
SubVectorHandler & InitialAssRes(SubVectorHandler &WorkVec, const VectorHandler &XCurr)
void PutCoef(integer iRow, integer iCol, const doublereal &dCoef)
virtual void InitialWorkSpaceDim(integer *piNumRows, integer *piNumCols) const
virtual const Vec3 & GetWRef(void) const
std::vector< Hint * > Hints
void Output(OutputHandler &OH) const
virtual std::ostream & Restart(std::ostream &out) const
Vec3 GetVec(unsigned short int i) const
virtual void PutRowIndex(integer iSubRow, integer iRow)=0
virtual unsigned int iGetNumDof(void) const
SubVectorHandler & AssRes(SubVectorHandler &WorkVec, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
long GetCurrentStep(void) 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
DotTraits< VectorExprLhs, VectorExprRhs, N_rows, N_rows >::ExpressionType Dot(const VectorExpression< VectorExprLhs, N_rows > &u, const VectorExpression< VectorExprRhs, N_rows > &v)
#define ASSERT(expression)
virtual void PutCoef(integer iRow, const doublereal &dCoef)=0
virtual Hint * ParseHint(DataManager *pDM, const char *s) const
virtual void OutputPrepare_int(const std::string &type, OutputHandler &OH, std::string &name)
virtual void Add(integer iRow, const Vec3 &v)
VariableSubMatrixHandler & InitialAssJac(VariableSubMatrixHandler &WorkMat, const VectorHandler &XCurr)
virtual void ResizeReset(integer, integer)
Mat3x3 Transpose(void) const
const MatCrossCross_Manip MatCrossCross
void SetValue(DataManager *pDM, VectorHandler &X, VectorHandler &XP, SimulationEntity::Hints *ph=0)
void PutRowIndex(integer iSubRow, integer iRow)
const doublereal * pGetVec(void) const
DofOrder::Order GetEqType(unsigned int i) const
void Sub(integer iRow, integer iCol, const Vec3 &v)
virtual integer iGetFirstIndex(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
unsigned int GetLabel(void) const
const StructNode * pNode2
bool UseText(int out) const
void OutputPrepare(OutputHandler &OH)