56 pNode1(pN1), pNode2(pN2),
57 tilde_f1(tilde_f1), tilde_f2(tilde_f2),
58 tilde_R1h(tilde_R1h), tilde_R2h(tilde_R2h),
59 tilde_R1hT_tilde_f1(tilde_R1h.
Transpose()*tilde_f1),
92 WMA.
Sub(6 + 1, 4, MTmp);
94 WMA.
Add(4, 6 + 1, MTmp);
102 WMA.
Sub(4, 6 + 4, MTmp);
103 WMA.
Add(6 + 4, 6 + 4, MTmp);
118 WMA.
Sub(6 + 1, 1, DTmp);
121 WMA.
Sub(1, 6 + 1, DTmp);
122 WMA.
Add(6 + 1, 6 + 1, DTmp);
127 WMA.
Add(6 + 1, 4, MTmp);
131 WMA.
Add(1, 6 + 4, MTmp);
132 WMA.
Sub(6 + 1, 6 + 4, MTmp);
136 MTmp = d1.
Cross(DTmp);
142 WMA.
Sub(4, 6 + 1, MTmp);
151 MTmp = d2.
Cross(DTmp);
154 WMA.
Sub(6 + 4, 1, MTmp);
157 WMA.
Add(6 + 4, 6 + 1, MTmp);
181 WMB.
Sub(4, 6 + 1, MTmp);
185 WMB.
Sub(6 + 4, 1, MTmp);
186 WMB.
Add(6 + 4, 6 + 1, MTmp);
191 WMB.
Add(1, 6 + 4, MTmp);
192 WMB.
Sub(6 + 1, 6 + 4, MTmp);
195 WMB.
Sub(6 + 4, 6 + 4, d2.
Cross(MTmp));
201 WMB.
Add(6 + 1, 4, MTmp);
210 WMA.
Add(6 + 1, 1, CTmp);
211 WMA.
Add(1, 6 + 1, CTmp);
212 WMA.
Sub(6 + 1, 6 + 1, CTmp);
214 MTmp = d1.
Cross(CTmp);
217 WMA.
Add(4, 6 + 1, MTmp);
219 MTmp = d2.
Cross(CTmp);
221 WMA.
Add(6 + 4, 1, MTmp);
222 WMA.
Sub(6 + 4, 6 + 1, MTmp);
230 WMA.
Add(6 + 1, 4, MTmp);
239 WMA.
Add(1, 6 + 4, MTmp);
240 WMA.
Sub(6 + 1, 6 + 4, MTmp);
243 WMA.
Sub(6 + 4, 6 + 4, d2.
Cross(MTmp));
268 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
271 WM.
PutRowIndex(6 + iCnt, iNode2FirstMomIndex + iCnt);
272 WM.
PutColIndex(6 + iCnt, iNode2FirstPosIndex + iCnt);
304 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
307 WMA.
PutRowIndex(6 + iCnt, iNode2FirstMomIndex + iCnt);
308 WMA.
PutColIndex(6 + iCnt, iNode2FirstPosIndex + iCnt);
312 WMB.
PutRowIndex(6 + iCnt, iNode2FirstMomIndex + iCnt);
313 WMB.
PutColIndex(6 + iCnt, iNode2FirstPosIndex + iCnt);
325 tilde_f1.
Write(out,
", ") <<
", hinge, reference, node, 1, ",
329 tilde_f2.
Write(out,
", ") <<
", hinge, reference, node, 1, ",
333 return pGetConstLaw()->Restart(out) <<
';' << std::endl;
345 Var_tilde_d = OH.CreateVar<
Vec3>(name +
"d",
"m",
346 "relative position in local frame (x, y, z)");
347 Var_tilde_dPrime = OH.CreateVar<
Vec3>(name +
"dPrime",
"m/s",
348 "relative linear velocity in local frame (x, y, z)");
349 Var_d = OH.CreateVar<
Vec3>(name +
"D",
"m",
350 "relative position in global frame (x, y, z)");
351 Var_dPrime = OH.CreateVar<
Vec3>(name +
"DPrime",
"m/s",
352 "relative linear velocity in global frame (x, y, z)");
403 for (
unsigned i = 0; i < ph->size(); i++) {
425 }
else if (dynamic_cast<Joint::ReactionsHint *>(pjh)) {
441 if (strncasecmp(s,
"offset{" ,
STRLENOF(
"offset{" )) == 0)
445 if (strcmp(&s[1],
"}") != 0) {
457 }
else if (strncasecmp(s,
"hinge{" ,
STRLENOF(
"hinge{" )) == 0) {
460 if (strcmp(&s[1],
"}") != 0) {
510 size_t l =
STRLENOF(
"constitutiveLaw.");
511 if (strncmp(s,
"constitutiveLaw.", l) == 0) {
578 return GetF()(i - 6);
595 const Vec3& tilde_f1,
596 const Vec3& tilde_f2,
601 DeformableDispJoint(uL, pDO, pCL, pN1, pN2, tilde_f1, tilde_f2, tilde_R1h, tilde_R2h, fOut)
646 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
649 WMA.
PutRowIndex(6 + iCnt, iNode2FirstMomIndex + iCnt);
650 WMA.
PutColIndex(6 + iCnt, iNode2FirstPosIndex + iCnt);
687 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
688 WorkVec.
PutRowIndex(iCnt, iNode1FirstMomIndex + iCnt);
689 WorkVec.
PutRowIndex(6 + iCnt, iNode2FirstMomIndex + iCnt);
706 AfterPredict(const_cast<VectorHandler&>(XCurr), const_cast<VectorHandler&>(XCurr));
735 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
736 WorkVec.
PutRowIndex(iCnt, iNode1FirstMomIndex + iCnt);
737 WorkVec.
PutRowIndex(6 + iCnt, iNode2FirstMomIndex + iCnt);
779 WorkVec.
Add(4, d1.Cross(
F));
780 WorkVec.
Sub(6 + 1,
F);
781 WorkVec.
Sub(6 + 4, d2.Cross(
F));
820 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
823 WM.
PutRowIndex(6 + iCnt, iNode2FirstPosIndex + iCnt);
824 WM.
PutColIndex(6 + iCnt, iNode2FirstPosIndex + iCnt);
848 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
849 WorkVec.
PutRowIndex(iCnt, iNode1FirstPosIndex + iCnt);
850 WorkVec.
PutRowIndex(6 + iCnt, iNode2FirstPosIndex + iCnt);
868 const Vec3& tilde_f1,
869 const Vec3& tilde_f2,
874 DeformableDispJoint(uL, pDO, pCL, pN1, pN2, tilde_f1, tilde_f2, tilde_R1h, tilde_R2h, fOut)
919 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
922 WMA.
PutRowIndex(6 + iCnt, iNode2FirstMomIndex + iCnt);
923 WMA.
PutColIndex(6 + iCnt, iNode2FirstPosIndex + iCnt);
960 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
961 WorkVec.
PutRowIndex(iCnt, iNode1FirstMomIndex + iCnt);
962 WorkVec.
PutRowIndex(6 + iCnt, iNode2FirstMomIndex + iCnt);
993 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
994 WorkVec.
PutRowIndex(iCnt, iNode1FirstMomIndex + iCnt);
995 WorkVec.
PutRowIndex(6 + iCnt, iNode2FirstMomIndex + iCnt);
1010 Mat3x3 hat_R(R1h*tilde_R);
1029 Vec3 dCrossF(d.Cross(
F));
1031 WorkVec.
Add(4, f1.Cross(
F) + hat_I*dCrossF);
1032 WorkVec.
Sub(6 + 1,
F);
1033 WorkVec.
Sub(6 + 4, f2.Cross(
F) - hat_I.
MulTV(dCrossF));
1075 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
1078 WM.
PutRowIndex(6 + iCnt, iNode2FirstPosIndex + iCnt);
1079 WM.
PutColIndex(6 + iCnt, iNode2FirstPosIndex + iCnt);
1103 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
1104 WorkVec.
PutRowIndex(iCnt, iNode1FirstPosIndex + iCnt);
1105 WorkVec.
PutRowIndex(6 + iCnt, iNode2FirstPosIndex + iCnt);
1123 const Vec3& tilde_f1,
1124 const Vec3& tilde_f2,
1129 DeformableDispJoint(uL, pDO, pCL, pN1, pN2, tilde_f1, tilde_f2, tilde_R1h, tilde_R2h, fOut)
1181 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
1182 WorkVec.
PutRowIndex(iCnt, iNode1FirstMomIndex + iCnt);
1183 WorkVec.
PutRowIndex(6 + iCnt, iNode2FirstMomIndex + iCnt);
1214 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
1215 WorkVec.
PutRowIndex(iCnt, iNode1FirstMomIndex + iCnt);
1216 WorkVec.
PutRowIndex(6 + iCnt, iNode2FirstMomIndex + iCnt);
1266 WorkVec.
Add(4, d1.Cross(F));
1267 WorkVec.
Sub(6 + 1, F);
1268 WorkVec.
Sub(6 + 4, d2.Cross(F));
1275 Mat3x3 R1hT(R1h.Transpose());
1309 integer iNode1FirstVelIndex = iNode1FirstPosIndex + 6;
1311 integer iNode2FirstVelIndex = iNode2FirstPosIndex + 6;
1314 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
1317 WM.
PutColIndex(6 + iCnt, iNode1FirstVelIndex + iCnt);
1319 WM.
PutRowIndex(6 + iCnt, iNode2FirstPosIndex + iCnt);
1320 WM.
PutColIndex(12 + iCnt, iNode2FirstPosIndex + iCnt);
1321 WM.
PutColIndex(18 + iCnt, iNode2FirstVelIndex + iCnt);
1360 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
1361 WorkVec.
PutRowIndex(iCnt, iNode1FirstPosIndex + iCnt);
1362 WorkVec.
PutRowIndex(6 + iCnt, iNode2FirstPosIndex + iCnt);
1373 tilde_d = R1h.Transpose()*(g2*(4./(4. + g2.Dot()))
1374 - g1*(4./(4. + g1.Dot())));
1396 const Vec3& tilde_f1,
1397 const Vec3& tilde_f2,
1402 DeformableDispJoint(uL, pDO, pCL, pN1, pN2, tilde_f1, tilde_f2, tilde_R1h, tilde_R2h, fOut)
1409 Mat3x3 R1hT(R1h.Transpose());
1458 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
1459 WorkVec.
PutRowIndex(iCnt, iNode1FirstMomIndex + iCnt);
1460 WorkVec.
PutRowIndex(6 + iCnt, iNode2FirstMomIndex + iCnt);
1491 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
1492 WorkVec.
PutRowIndex(iCnt, iNode1FirstMomIndex + iCnt);
1493 WorkVec.
PutRowIndex(6 + iCnt, iNode2FirstMomIndex + iCnt);
1530 Mat3x3 R1hT(R1h.Transpose());
1544 WorkVec.
Add(4, d1.Cross(F));
1545 WorkVec.
Sub(6 + 1, F);
1546 WorkVec.
Sub(6 + 4, d2.Cross(F));
1553 Mat3x3 R1hT(R1h.Transpose());
1588 integer iNode1FirstVelIndex = iNode1FirstPosIndex + 6;
1590 integer iNode2FirstVelIndex = iNode2FirstPosIndex + 6;
1593 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
1596 WM.
PutColIndex(6 + iCnt, iNode1FirstVelIndex + iCnt);
1598 WM.
PutRowIndex(6 + iCnt, iNode2FirstPosIndex + iCnt);
1599 WM.
PutColIndex(12 + iCnt, iNode2FirstPosIndex + iCnt);
1600 WM.
PutColIndex(18 + iCnt, iNode2FirstVelIndex + iCnt);
1618 WM.
Add(4, 6 + 1, FDE);
1619 WM.
Sub(1, 6 + 1, FDE);
1621 WM.
Add(1, 4, FDEPrime);
1622 WM.
Add(4, 6 + 4, FDEPrime);
1624 WM.
Sub(1, 6 + 4, FDEPrime);
1625 WM.
Sub(4, 4, FDEPrime);
1646 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
1647 WorkVec.
PutRowIndex(iCnt, iNode1FirstPosIndex + iCnt);
1648 WorkVec.
PutRowIndex(6 + iCnt, iNode2FirstPosIndex + iCnt);
1655 Mat3x3 R1hT(R1h.Transpose());
1668 WorkVec.
Add(4, d1.Cross(F));
1669 WorkVec.
Sub(6 + 1, F);
1670 WorkVec.
Sub(6 + 4, d2.Cross(F));
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
~ElasticDispJointInv(void)
virtual const Mat3x3 & GetRRef(void) const
virtual bool bToBeOutput(void) const
MatrixExpression< TransposedMatrix< MatrixDirectExpr< Matrix< T, N_rows, N_cols > > >, N_cols, N_rows > Transpose(const Matrix< T, N_rows, N_cols > &A)
ElasticDispJoint(unsigned int uL, const DofOwner *pDO, const ConstitutiveLaw3D *pCL, const StructNode *pN1, const StructNode *pN2, const Vec3 &tilde_f1, const Vec3 &tilde_f2, const Mat3x3 &tilde_R1, const Mat3x3 &tilde_R2, flag fOut)
ConstitutiveLaw< T, Tder > * pGetConstLaw(void) const
virtual void ResizeReset(integer)
virtual SubVectorHandler & InitialAssRes(SubVectorHandler &WorkVec, const VectorHandler &XCurr)
const MatCross_Manip MatCross
bool UseNetCDF(int out) const
virtual const Vec3 & GetgCurr(void) const
FullSubMatrixHandler & SetFull(void)
virtual const Mat3x3 & GetRCurr(void) const
virtual Node::Type GetNodeType(void) const
virtual void AfterPredict(VectorHandler &X, VectorHandler &XP)
bool bIsErgonomy(void) const
void Add(integer iRow, integer iCol, const Vec3 &v)
virtual unsigned int iGetPrivDataIdx(const char *s) const
virtual Hint * ParseHint(DataManager *pDM, const char *s) const
std::ostream & Write(std::ostream &out, const FullMatrixHandler &m, const char *s, const char *s2)
void Update(const VectorHandler &XCurr, InverseDynamics::Order iOrder=InverseDynamics::INVERSE_DYNAMICS)
virtual void Sub(integer iRow, const Vec3 &v)
virtual void AfterConvergence(const VectorHandler &X, const VectorHandler &XP)
const Tder & GetFDE(void) const
const Mat3x3 Eye3(1., 0., 0., 0., 1., 0., 0., 0., 1.)
virtual unsigned int iGetNumPrivData(void) const
virtual VariableSubMatrixHandler & InitialAssJac(VariableSubMatrixHandler &WorkMat, const VectorHandler &XCurr)
virtual const Vec3 & GetWRef(void) const
void Update(const VectorHandler &XCurr, InverseDynamics::Order iOrder=InverseDynamics::INVERSE_DYNAMICS)
std::vector< Hint * > Hints
Vec3 GetVec(unsigned short int i) const
Vec3 VecRot(const Mat3x3 &Phi)
virtual VariableSubMatrixHandler & InitialAssJac(VariableSubMatrixHandler &WorkMat, const VectorHandler &XCurr)
Vec3 MulTV(const Vec3 &v) const
virtual void AfterConvergence(const VectorHandler &X, const VectorHandler &XP)
void AssMats(FullSubMatrixHandler &WMA, FullSubMatrixHandler &WMB, doublereal dCoef)
~ViscoElasticDispJoint(void)
void Update(const VectorHandler &XCurr, InverseDynamics::Order iOrder=InverseDynamics::INVERSE_DYNAMICS)
virtual void PutRowIndex(integer iSubRow, integer iRow)=0
virtual void AfterConvergence(const VectorHandler &X, const VectorHandler &XP)
virtual SubVectorHandler & AssRes(SubVectorHandler &WorkVec, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
void AssMats(FullSubMatrixHandler &WMA, FullSubMatrixHandler &WMB, doublereal dCoef)
virtual SubVectorHandler & InitialAssRes(SubVectorHandler &WorkVec, const VectorHandler &XCurr)
Matrix< T, 2, 2 > Inv(const Matrix< T, 2, 2 > &A)
virtual void InitialWorkSpaceDim(integer *piNumRows, integer *piNumCols) const
long GetCurrentStep(void) const
virtual void AfterConvergence(const VectorHandler &X, const VectorHandler &XP)
virtual void AfterPredict(VectorHandler &X, VectorHandler &XP)
ViscousDispJoint(unsigned int uL, const DofOwner *pDO, const ConstitutiveLaw3D *pCL, const StructNode *pN1, const StructNode *pN2, const Vec3 &tilde_f1, const Vec3 &tilde_f2, const Mat3x3 &tilde_R1, const Mat3x3 &tilde_R2, flag fOut)
Mat3x3 Rot(const Vec3 &phi)
virtual integer iGetFirstMomentumIndex(void) const =0
virtual integer iGetFirstPositionIndex(void) const
virtual const Vec3 & GetWCurr(void) const
VariableSubMatrixHandler & AssJac(VariableSubMatrixHandler &WorkMat, const VectorHandler &XCurr)
virtual std::ostream & Restart(std::ostream &out) const
void AssVec(SubVectorHandler &WorkVec)
ElasticDispJointInv(unsigned int uL, const DofOwner *pDO, const ConstitutiveLaw3D *pCL, const StructNode *pN1, const StructNode *pN2, const Vec3 &tilde_f1, const Vec3 &tilde_f2, const Mat3x3 &tilde_R1, const Mat3x3 &tilde_R2, flag fOut)
std::ostream & Joints(void) const
void AfterConvergence(const T &Eps, const T &EpsPrime=mb_zero< T >())
virtual SubVectorHandler & InitialAssRes(SubVectorHandler &WorkVec, const VectorHandler &XCurr)
#define ASSERT(expression)
void AssVec(SubVectorHandler &WorkVec)
virtual void OutputPrepare_int(const std::string &type, OutputHandler &OH, std::string &name)
virtual const Vec3 & GetXCurr(void) const
virtual void Add(integer iRow, const Vec3 &v)
virtual SubVectorHandler & AssRes(SubVectorHandler &WorkVec, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
virtual void ResizeReset(integer, integer)
virtual doublereal dGetPrivData(unsigned int i) const
virtual void InitialWorkSpaceDim(integer *piNumRows, integer *piNumCols) const
Mat3x3 Transpose(void) const
const MatCrossCross_Manip MatCrossCross
void AssVec(SubVectorHandler &WorkVec)
virtual void AfterPredict(VectorHandler &X, VectorHandler &XP)
virtual VariableSubMatrixHandler & InitialAssJac(VariableSubMatrixHandler &WorkMat, const VectorHandler &XCurr)
virtual void InitialWorkSpaceDim(integer *piNumRows, integer *piNumCols) const
void PutRowIndex(integer iSubRow, integer iRow)
const T & GetF(void) const
void AssVec(SubVectorHandler &WorkVec)
ViscoElasticDispJoint(unsigned int uL, const DofOwner *pDO, const ConstitutiveLaw3D *pCL, const StructNode *pN1, const StructNode *pN2, const Vec3 &tilde_f1, const Vec3 &tilde_f2, const Mat3x3 &tilde_R1, const Mat3x3 &tilde_R2, flag fOut)
const doublereal * pGetVec(void) const
virtual void WorkSpaceDim(integer *piNumRows, integer *piNumCols) const =0
void AssMats(FullSubMatrixHandler &WorkMatA, FullSubMatrixHandler &WorkMatB, doublereal dCoef)
virtual const Vec3 & GetVCurr(void) const
void Sub(integer iRow, integer iCol, const Vec3 &v)
virtual void AfterPredict(VectorHandler &X, VectorHandler &XP)
virtual SubVectorHandler & InitialAssRes(SubVectorHandler &WorkVec, const VectorHandler &XCurr)
virtual SubVectorHandler & AssRes(SubVectorHandler &WorkVec, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
virtual void SetValue(DataManager *pDM, VectorHandler &X, VectorHandler &XP, SimulationEntity::Hints *h=0)
virtual void Update(const VectorHandler &XCurr, InverseDynamics::Order iOrder=InverseDynamics::INVERSE_DYNAMICS)
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 >())
unsigned int GetLabel(void) const
virtual SubVectorHandler & AssRes(SubVectorHandler &WorkVec, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
void AssMats(FullSubMatrixHandler &WMA, FullSubMatrixHandler &WMB, doublereal dCoef)
bool UseText(int out) const
virtual void InitialWorkSpaceDim(integer *piNumRows, integer *piNumCols) const
virtual VariableSubMatrixHandler & InitialAssJac(VariableSubMatrixHandler &WorkMat, const VectorHandler &XCurr)