55 pNode1(pN1), pNode2(pN2),
56 d1(dTmp1), R1h(R1hTmp), d2(dTmp2), R2h(R2hTmp), F(
Zero3), dM(0.)
75 "reference, node, ",
d1.
Write(out,
", ") <<
", "
76 "hinge, reference, node, "
80 "reference, node, ",
d2.
Write(out,
", ") <<
", "
81 "hinge, reference, node, "
97 DEBUGCOUT(
"Entering UniversalHingeJoint::AssJac()" << std::endl);
126 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
129 WM.
PutRowIndex(6 + iCnt, iNode2FirstMomIndex + iCnt);
130 WM.
PutColIndex(6 + iCnt, iNode2FirstPosIndex + iCnt);
133 for (
int iCnt = 1; iCnt <= 4; iCnt++) {
134 WM.
PutRowIndex(12 + iCnt, iFirstReactionIndex + iCnt);
135 WM.
PutColIndex(12 + iCnt, iFirstReactionIndex + iCnt);
139 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
140 WM.
PutCoef(iCnt, 12 + iCnt, 1.);
141 WM.
PutCoef(6 + iCnt, 12 + iCnt, -1.);
152 Vec3 MTmp = e2b*(
dM*dCoef);
158 WM.
Add(4, 10, e3aWedgeMWedge);
160 WM.
Add(10, 4, MWedgee3aWedge);
164 Vec3 Tmp(e2b.Cross(e3a));
166 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
175 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
176 WM.
PutCoef(12 + iCnt, iCnt, 1.);
177 WM.
PutCoef(12 + iCnt, 6 + iCnt, -1.);
193 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
210 DEBUGCOUT(
"Entering UniversalHingeJoint::AssRes()" << std::endl);
224 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
225 WorkVec.
PutRowIndex(iCnt, iNode1FirstMomIndex + iCnt);
226 WorkVec.
PutRowIndex(6 + iCnt, iNode2FirstMomIndex + iCnt);
230 for (
int iCnt = 1; iCnt <= 4; iCnt++) {
231 WorkVec.
PutRowIndex(12 + iCnt, iFirstReactionIndex + iCnt);
235 F =
Vec3(XCurr, iFirstReactionIndex + 1);
236 dM = XCurr(iFirstReactionIndex + 4);
251 Vec3 MTmp(e2b.Cross(e3a)*
dM);
255 WorkVec.
Sub(4, dTmp1.Cross(
F) + MTmp);
265 WorkVec.
Add(13, (x2 + dTmp2 - x1 - dTmp1)/dCoef);
268 WorkVec.
PutCoef(16, (e3a*e2b)/dCoef);
281 Vec3 vTmp(R2Tmp.GetVec(2).Cross(R1Tmp.GetVec(3)));
284 R1Tmp.Transpose()*
F,
Vec3(
dM, 0., 0.),
F, vTmp*
dM)
296 DEBUGCOUT(
"Entering UniversalHingeJoint::InitialAssJac()" << std::endl);
312 integer iNode1FirstVelIndex = iNode1FirstPosIndex + 6;
314 integer iNode2FirstVelIndex = iNode2FirstPosIndex + 6;
316 integer iReactionPrimeIndex = iFirstReactionIndex + 4;
324 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
327 WM.
PutRowIndex(6 + iCnt, iNode1FirstVelIndex + iCnt);
328 WM.
PutColIndex(6 + iCnt, iNode1FirstVelIndex + iCnt);
329 WM.
PutRowIndex(12 + iCnt, iNode2FirstPosIndex + iCnt);
330 WM.
PutColIndex(12 + iCnt, iNode2FirstPosIndex + iCnt);
331 WM.
PutRowIndex(18 + iCnt, iNode2FirstVelIndex + iCnt);
332 WM.
PutColIndex(18 + iCnt, iNode2FirstVelIndex + iCnt);
336 for (
int iCnt = 1; iCnt <= 8; iCnt++) {
337 WM.
PutRowIndex(24 + iCnt, iFirstReactionIndex + iCnt);
338 WM.
PutColIndex(24 + iCnt, iFirstReactionIndex + iCnt);
342 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
344 WM.
IncCoef(iCnt, 24 + iCnt, 1.);
347 WM.
IncCoef(6 + iCnt, 28 + iCnt, 1.);
350 WM.
DecCoef(12 + iCnt, 24 + iCnt, 1.);
353 WM.
DecCoef(18 + iCnt, 28 + iCnt, 1.);
356 WM.
DecCoef(24 + iCnt, iCnt, 1.);
359 WM.
DecCoef(28 + iCnt, 6 + iCnt, 1.);
362 WM.
IncCoef(24 + iCnt, 12 + iCnt, 1.);
365 WM.
IncCoef(28 + iCnt, 18 + iCnt, 1.);
374 Vec3 FPrime(XCurr, iReactionPrimeIndex+1);
375 doublereal dMPrime(XCurr(iReactionPrimeIndex+4));
388 Vec3 MPrimeTmp(e2b*dMPrime);
405 Vec3 Tmp(e2b.Cross(e3a));
413 if (Tmp.Dot() < std::numeric_limits<doublereal>::epsilon()) {
414 silent_cerr(
"CardanoHingeJoint(" <<
GetLabel() <<
"): "
415 "first and second node hinge axes are (nearly) orthogonal"
420 Vec3 TmpPrime(e2b.Cross(Omega1.Cross(e3a)) - e3a.Cross(Omega2.Cross(e2b)));
426 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
427 WM.
PutCoef(3 + iCnt, 28, Tmp(iCnt));
434 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
435 WM.
DecCoef(15 + iCnt, 28, Tmp(iCnt));
441 WM.
Add(10, 16, MDeltag2);
443 WM.
Add(10, 25, O1Wedged1Wedge);
446 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
447 WM.
PutCoef(9 + iCnt, 28, TmpPrime(iCnt));
448 WM.
PutCoef(9 + iCnt, 32, Tmp(iCnt));
452 WM.
Add(22, 4, MDeltag1);
456 WM.
Add(22, 25, O2Wedged2Wedge);
459 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
460 WM.
DecCoef(21 + iCnt, 28, TmpPrime(iCnt));
461 WM.
DecCoef(21 + iCnt, 32, Tmp(iCnt));
469 WM.
Add(29, 4, O1Wedged1Wedge);
471 WM.
Add(29, 16, O2Wedged2Wedge);
476 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
488 Vec3 O1mO2(Omega1 - Omega2);
490 Vec3 TmpPrime2 = e2b.
Cross(e3a.Cross(O1mO2));
491 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
492 WM.
PutCoef(32, 3 + iCnt, TmpPrime(iCnt));
493 WM.
PutCoef(32, 15 + iCnt, TmpPrime2(iCnt));
505 DEBUGCOUT(
"Entering UniversalHingeJoint::InitialAssRes()" << std::endl);
515 integer iNode1FirstVelIndex = iNode1FirstPosIndex + 6;
517 integer iNode2FirstVelIndex = iNode2FirstPosIndex + 6;
519 integer iReactionPrimeIndex = iFirstReactionIndex + 4;
522 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
523 WorkVec.
PutRowIndex(iCnt, iNode1FirstPosIndex + iCnt);
524 WorkVec.
PutRowIndex(6 + iCnt, iNode1FirstVelIndex + iCnt);
525 WorkVec.
PutRowIndex(12 + iCnt, iNode2FirstPosIndex + iCnt);
526 WorkVec.
PutRowIndex(18 + iCnt, iNode2FirstVelIndex + iCnt);
529 for (
int iCnt = 1; iCnt <= 8; iCnt++) {
530 WorkVec.
PutRowIndex(24 + iCnt, iFirstReactionIndex+iCnt);
544 F =
Vec3(XCurr, iFirstReactionIndex + 1);
545 dM = XCurr(iFirstReactionIndex + 4);
546 Vec3 FPrime(XCurr, iReactionPrimeIndex + 1);
547 doublereal dMPrime(XCurr(iReactionPrimeIndex + 4));
554 Vec3 O1Wedged1(Omega1.Cross(d1Tmp));
555 Vec3 O2Wedged2(Omega2.Cross(d2Tmp));
563 Vec3 MPrimeTmp(e3a.Cross(MTmp.Cross(Omega2)) + e2b.Cross(e3a)*dMPrime);
570 WorkVec.
Sub(7, FPrime);
571 WorkVec.
Sub(10, d1Tmp.
Cross(FPrime) - O1Wedged1.
Cross(F) - MPrimeTmp);
578 WorkVec.
Add(19, FPrime);
579 WorkVec.
Add(22, d2Tmp.
Cross(FPrime) + O2Wedged2.
Cross(F) + MPrimeTmp);
582 WorkVec.
Add(25, x1 + d1Tmp - x2 - d2Tmp);
585 WorkVec.
Add(29, v1 + O1Wedged1 - v2 - O2Wedged2);
612 Joint(uL, pDO, fOut),
613 pNode1(pN1), pNode2(pN2),
617 R1h(R1hTmp), R2h(R2hTmp), dM(0.), od(od)
654 DEBUGCOUT(
"Entering UniversalRotationJoint::AssJac()" << std::endl);
674 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
677 WM.
PutRowIndex(3 + iCnt, iNode2FirstMomIndex + iCnt);
678 WM.
PutColIndex(3 + iCnt, iNode2FirstPosIndex + iCnt);
695 Vec3 MTmp = e2b*(
dM*dCoef);
700 WM.
Sub(0 + 1, 0 + 1, MWedgee3aWedge);
701 WM.
Add(0 + 1, 3 + 1, e3aWedgeMWedge);
703 WM.
Add(3 + 1, 0 + 1, MWedgee3aWedge);
704 WM.
Sub(3 + 1, 3 + 1, e3aWedgeMWedge);
707 Vec3 Tmp(e2b.Cross(e3a));
709 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
712 WM.
DecCoef(3 + iCnt, 6 + 1, d);
716 WM.
DecCoef(6 + 1, 3 + iCnt, d);
730 DEBUGCOUT(
"Entering UniversalRotationJoint::AssRes()" << std::endl);
744 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
745 WorkVec.
PutRowIndex(iCnt, iNode1FirstMomIndex + iCnt);
746 WorkVec.
PutRowIndex(3 + iCnt, iNode2FirstMomIndex + iCnt);
750 WorkVec.
PutRowIndex(6 + 1, iFirstReactionIndex + 1);
753 dM = XCurr(iFirstReactionIndex+1);
763 Vec3 MTmp(e2b.Cross(e3a)*
dM);
766 WorkVec.
Sub(1, MTmp);
769 WorkVec.
Add(4, MTmp);
774 WorkVec.
PutCoef(6 + 1, (e3a*e2b)/dCoef);
788 Var_Phi = OH.CreateRotationVar(name,
"",
od,
"global");
803 Vec3 vTmp(R2Tmp.GetVec(2).Cross(R1Tmp.GetVec(3)));
804 Mat3x3 RTmp(R2Tmp.Transpose()*R1Tmp);
888 DEBUGCOUT(
"Entering UniversalRotationJoint::InitialAssJac()" << std::endl);
904 integer iNode1FirstVelIndex = iNode1FirstPosIndex + 6;
906 integer iNode2FirstVelIndex = iNode2FirstPosIndex + 6;
908 integer iReactionPrimeIndex = iFirstReactionIndex + 1;
916 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
919 WM.
PutRowIndex(3 + iCnt, iNode1FirstVelIndex + iCnt);
920 WM.
PutColIndex(3 + iCnt, iNode1FirstVelIndex + iCnt);
921 WM.
PutRowIndex(6 + iCnt, iNode2FirstPosIndex + iCnt);
922 WM.
PutColIndex(6 + iCnt, iNode2FirstPosIndex + iCnt);
923 WM.
PutRowIndex(9 + iCnt, iNode2FirstVelIndex + iCnt);
924 WM.
PutColIndex(9 + iCnt, iNode2FirstVelIndex + iCnt);
928 for (
int iCnt = 1; iCnt <= 2; iCnt++) {
929 WM.
PutRowIndex(12 + iCnt, iFirstReactionIndex + iCnt);
930 WM.
PutColIndex(12 + iCnt, iFirstReactionIndex + iCnt);
939 doublereal dMPrime(XCurr(iReactionPrimeIndex+1));
949 Vec3 MPrimeTmp(e2b*dMPrime);
959 Vec3 Tmp(e2b.Cross(e3a));
967 if (Tmp.Dot() < std::numeric_limits<doublereal>::epsilon()) {
968 silent_cerr(
"CardanoRotationJoint(" <<
GetLabel() <<
"): "
969 "first and second node hinge axes are (nearly) orthogonal"
974 Vec3 TmpPrime(e2b.Cross(Omega1.Cross(e3a)) - e3a.Cross(Omega2.Cross(e2b)));
979 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
980 WM.
PutCoef(iCnt, 13, Tmp.dGet(iCnt));
986 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
987 WM.
DecCoef(6 + iCnt, 13, Tmp(iCnt));
991 WM.
Sub(4, 1, MDeltag1);
993 WM.
Add(4, 7, MDeltag2);
996 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
997 WM.
PutCoef(9 + iCnt, 13, TmpPrime(iCnt));
998 WM.
PutCoef(9 + iCnt, 14, Tmp(iCnt));
1005 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
1006 WM.
DecCoef(3 + iCnt, 13, TmpPrime(iCnt));
1007 WM.
DecCoef(3 + iCnt, 14, Tmp(iCnt));
1012 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
1024 Vec3 O1mO2(Omega1 - Omega2);
1026 Vec3 TmpPrime2 = e2b.
Cross(e3a.Cross(O1mO2));
1027 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
1028 WM.
PutCoef(14, iCnt, TmpPrime(iCnt));
1029 WM.
PutCoef(14, 6 + iCnt, TmpPrime2(iCnt));
1041 DEBUGCOUT(
"Entering UniversalRotationJoint::InitialAssRes()" << std::endl);
1051 integer iNode1FirstVelIndex = iNode1FirstPosIndex + 6;
1053 integer iNode2FirstVelIndex = iNode2FirstPosIndex + 6;
1055 integer iReactionPrimeIndex = iFirstReactionIndex + 1;
1058 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
1059 WorkVec.
PutRowIndex(iCnt, iNode1FirstPosIndex + iCnt);
1060 WorkVec.
PutRowIndex(3 + iCnt, iNode1FirstVelIndex + iCnt);
1061 WorkVec.
PutRowIndex(6 + iCnt, iNode2FirstPosIndex + iCnt);
1062 WorkVec.
PutRowIndex(9 + iCnt, iNode2FirstVelIndex + iCnt);
1065 for (
int iCnt = 1; iCnt <= 2; iCnt++) {
1066 WorkVec.
PutRowIndex(12 + iCnt, iFirstReactionIndex + iCnt);
1076 dM = XCurr(iFirstReactionIndex + 1);
1077 doublereal dMPrime(XCurr(iReactionPrimeIndex + 1));
1086 Vec3 MPrimeTmp(e3a.Cross(MTmp.Cross(Omega2)) + e2b.Cross(e3a)*dMPrime);
1089 WorkVec.
Sub(1, MTmp.Cross(e3a));
1092 WorkVec.
Sub(4, MPrimeTmp);
1095 WorkVec.
Add(7, MTmp.Cross(e3a));
1098 WorkVec.
Add(10, MPrimeTmp);
1122 Joint(uL, pDO, fOut),
1124 X0(X0Tmp), R0(R0Tmp), d(dTmp), Rh(RhTmp), F(
Zero3), dM(0.)
1143 "reference, node, ",
d.
Write(out,
", ") <<
", "
1144 "hinge, reference, node, "
1147 "reference, global, ",
X0.
Write(out,
", ") <<
", "
1148 "reference, global, "
1164 DEBUGCOUT(
"Entering UniversalPinJoint::AssJac()" << std::endl);
1178 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
1183 for (
int iCnt = 1; iCnt <= 4; iCnt++) {
1184 WM.
PutRowIndex(6 + iCnt, iFirstReactionIndex + iCnt);
1185 WM.
PutColIndex(6 + iCnt, iFirstReactionIndex + iCnt);
1192 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
1193 WM.
PutCoef(iCnt, 6 + iCnt, -1.);
1201 Vec3 MTmp(e2*(
dM*dCoef));
1208 Vec3 Tmp(e2.Cross(e3));
1210 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
1218 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
1220 WM.
PutCoef(6 + iCnt, iCnt, -1.);
1224 WM.
PutCoef(6 + 3 + 1, 3 + iCnt, -d);
1240 DEBUGCOUT(
"Entering UniversalPinJoint::AssRes()" << std::endl);
1252 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
1253 WorkVec.
PutRowIndex(iCnt, iFirstMomentumIndex + iCnt);
1257 for (
int iCnt = 1; iCnt <= 4; iCnt++) {
1258 WorkVec.
PutRowIndex(6 + iCnt, iFirstReactionIndex + iCnt);
1261 F =
Vec3(XCurr, iFirstReactionIndex + 1);
1262 dM = XCurr(iFirstReactionIndex + 4);
1273 WorkVec.
Add(4, dTmp.Cross(
F) + e2.Cross(e3)*
dM);
1277 WorkVec.
Add(7, (x + dTmp -
X0)/dCoef);
1279 WorkVec.
PutCoef(10, e3.Dot(e2)/dCoef);
1305 DEBUGCOUT(
"Entering UniversalPinJoint::InitialAssJac()" << std::endl);
1319 integer iFirstVelocityIndex = iFirstPositionIndex + 6;
1321 integer iReactionPrimeIndex = iFirstReactionIndex + 4;
1324 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
1327 WM.
PutRowIndex(6 + iCnt, iFirstVelocityIndex + iCnt);
1328 WM.
PutColIndex(6 + iCnt, iFirstVelocityIndex + iCnt);
1331 for (
int iCnt = 1; iCnt <= 8; iCnt++) {
1332 WM.
PutRowIndex(12 + iCnt, iFirstReactionIndex + iCnt);
1333 WM.
PutColIndex(12 + iCnt, iFirstReactionIndex + iCnt);
1340 Vec3 FPrime(XCurr, iReactionPrimeIndex + 1);
1341 doublereal dMPrime(XCurr(iReactionPrimeIndex + 4));
1344 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
1346 WM.
PutCoef(iCnt, 12 + iCnt, 1.);
1349 WM.
PutCoef(6 + iCnt, 16 + iCnt, 1.);
1352 WM.
PutCoef(12 + iCnt, iCnt, -1.);
1355 WM.
PutCoef(16 + iCnt, 6 + iCnt, -1.);
1365 Vec3 Tmp(e2.Cross(e3));
1373 if (Tmp.Dot() < std::numeric_limits<doublereal>::epsilon()) {
1374 silent_cerr(
"CardanoPinJoint(" <<
GetLabel() <<
"): "
1375 "node and fixed point hinge axes are (nearly) orthogonal"
1380 Vec3 TmpPrime(e3.Cross(e2.Cross(Omega)));
1385 Vec3 MPrimeTmp(e2*dMPrime);
1402 WM.
Add(10, 13, OWedgedWedge);
1405 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
1410 WM.
PutCoef(9 + iCnt, 16, TmpPrime(iCnt));
1417 WM.
Add(17, 4, OWedgedWedge);
1421 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
1431 TmpPrime = e2.
Cross(Omega.Cross(e3));
1432 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
1433 WM.
PutCoef(20, 3 + iCnt, TmpPrime(iCnt));
1445 DEBUGCOUT(
"Entering UniversalPinJoint::InitialAssRes()" << std::endl);
1455 integer iFirstVelocityIndex = iFirstPositionIndex + 6;
1457 integer iReactionPrimeIndex = iFirstReactionIndex + 4;
1460 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
1461 WorkVec.
PutRowIndex(iCnt, iFirstPositionIndex + iCnt);
1462 WorkVec.
PutRowIndex(6 + iCnt, iFirstVelocityIndex + iCnt);
1465 for (
int iCnt = 1; iCnt <= 8; iCnt++) {
1466 WorkVec.
PutRowIndex(12 + iCnt, iFirstReactionIndex + iCnt);
1475 F =
Vec3(XCurr, iFirstReactionIndex + 1);
1476 dM = XCurr(iFirstReactionIndex + 4);
1477 Vec3 FPrime(XCurr, iReactionPrimeIndex + 1);
1478 doublereal dMPrime(XCurr(iReactionPrimeIndex + 4));
1485 Vec3 Tmp(e2.Cross(e3));
1487 Vec3 TmpPrime(e3.Cross(e2.Cross(Omega)));
1493 Vec3 OWedged(Omega.Cross(dTmp));
1498 Vec3 MPrimeTmp(e3.Cross(MTmp.Cross(Omega)) + e2.Cross(e3)*dMPrime);
1505 WorkVec.
Sub(7, FPrime);
1506 WorkVec.
Sub(10, dTmp.
Cross(FPrime) + OWedged.
Cross(F) + MPrimeTmp);
1509 WorkVec.
Add(13, x + dTmp -
X0);
1515 WorkVec.
Add(17, v + OWedged);
1518 Tmp = e3.Cross(Omega);
~UniversalHingeJoint(void)
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
std::ostream & Write(std::ostream &out, const char *sFill=" ") const
virtual const Mat3x3 & GetRRef(void) const
virtual bool bToBeOutput(void) const
#define MBDYN_EXCEPT_ARGS
virtual void ResizeReset(integer)
const MatCross_Manip MatCross
bool UseNetCDF(int out) const
void WorkSpaceDim(integer *piNumRows, integer *piNumCols) const
FullSubMatrixHandler & SetFull(void)
virtual const Mat3x3 & GetRCurr(void) const
void Add(integer iRow, integer iCol, const Vec3 &v)
void Output(OutputHandler &OH) const
std::ostream & Write(std::ostream &out, const FullMatrixHandler &m, const char *s, const char *s2)
virtual void Sub(integer iRow, const Vec3 &v)
void PutCoef(integer iRow, integer iCol, const doublereal &dCoef)
const StructNode * pNode2
virtual const Vec3 & GetWRef(void) const
virtual void Output(OutputHandler &OH) const
void IncCoef(integer iRow, integer iCol, const doublereal &dCoef)
Vec3 GetVec(unsigned short int i) const
const StructNode * pNode1
VariableSubMatrixHandler & AssJac(VariableSubMatrixHandler &WorkMat, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
Vec3 VecRot(const Mat3x3 &Phi)
void DecCoef(integer iRow, integer iCol, const doublereal &dCoef)
~UniversalRotationJoint(void)
virtual std::ostream & Restart(std::ostream &out) const
virtual void PutRowIndex(integer iSubRow, integer iRow)=0
virtual std::ostream & Restart(std::ostream &out) const
Vec3 MatR2EulerAngles313(const Mat3x3 &R)
virtual void InitialWorkSpaceDim(integer *piNumRows, integer *piNumCols) const
SubVectorHandler & InitialAssRes(SubVectorHandler &WorkVec, const VectorHandler &XCurr)
UniversalRotationJoint(unsigned int uL, const DofOwner *pDO, const StructNode *pN1, const StructNode *pN2, const Mat3x3 &R1hTmp, const Mat3x3 &R2hTmp, const OrientationDescription &od, flag fOut)
SubVectorHandler & AssRes(SubVectorHandler &WorkVec, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
VariableSubMatrixHandler & InitialAssJac(VariableSubMatrixHandler &WorkMat, const VectorHandler &XCurr)
virtual std::ostream & Restart(std::ostream &out) const
long GetCurrentStep(void) const
VariableSubMatrixHandler & AssJac(VariableSubMatrixHandler &WorkMat, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
VariableSubMatrixHandler & InitialAssJac(VariableSubMatrixHandler &WorkMat, const VectorHandler &XCurr)
Vec3 MatR2EulerAngles123(const Mat3x3 &R)
virtual integer iGetFirstMomentumIndex(void) const =0
virtual integer iGetFirstPositionIndex(void) const
virtual void InitialWorkSpaceDim(integer *piNumRows, integer *piNumCols) const
virtual const Vec3 & GetWCurr(void) const
SubVectorHandler & InitialAssRes(SubVectorHandler &WorkVec, const VectorHandler &XCurr)
void Output(OutputHandler &OH) const
virtual std::ostream & Restart(std::ostream &out) const
UniversalHingeJoint(unsigned int uL, const DofOwner *pDO, const StructNode *pN1, const StructNode *pN2, const Vec3 &dTmp1, const Vec3 &dTmp2, const Mat3x3 &R1hTmp, const Mat3x3 &R2hTmp, flag fOut)
std::ostream & Joints(void) const
#define ASSERT(expression)
const StructNode * pNode2
virtual void WorkSpaceDim(integer *piNumRows, integer *piNumCols) const
virtual void PutCoef(integer iRow, const doublereal &dCoef)=0
VectorExpression< VectorCrossExpr< VectorLhsExpr, VectorRhsExpr >, 3 > Cross(const VectorExpression< VectorLhsExpr, 3 > &u, const VectorExpression< VectorRhsExpr, 3 > &v)
SubVectorHandler & InitialAssRes(SubVectorHandler &WorkVec, const VectorHandler &XCurr)
virtual void OutputPrepare_int(const std::string &type, OutputHandler &OH, std::string &name)
Vec3 MatR2EulerAngles(const Mat3x3 &R)
virtual const Vec3 & GetXCurr(void) const
virtual void Add(integer iRow, const Vec3 &v)
virtual void ResizeReset(integer, integer)
void WorkSpaceDim(integer *piNumRows, integer *piNumCols) const
Mat3x3 Transpose(void) const
SubVectorHandler & AssRes(SubVectorHandler &WorkVec, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
const MatCrossCross_Manip MatCrossCross
void PutRowIndex(integer iSubRow, integer iRow)
void OutputPrepare(OutputHandler &OH)
const doublereal * pGetVec(void) const
Vec3 MatR2EulerAngles321(const Mat3x3 &R)
const StructNode * pNode1
virtual const Vec3 & GetVCurr(void) const
void Sub(integer iRow, integer iCol, const Vec3 &v)
OrientationDescription od
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
UniversalPinJoint(unsigned int uL, const DofOwner *pDO, const StructNode *pN, const Vec3 &X0Tmp, const Mat3x3 &R0Tmp, const Vec3 &dTmp, const Mat3x3 &RhTmp, flag fOut)
SubVectorHandler & AssRes(SubVectorHandler &WorkVec, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
virtual void InitialWorkSpaceDim(integer *piNumRows, integer *piNumCols) const
bool UseText(int out) const
VariableSubMatrixHandler & InitialAssJac(VariableSubMatrixHandler &WorkMat, const VectorHandler &XCurr)