71 virtual std::ostream&
DescribeDof(std::ostream& out,
const char *prefix,
bool bInitial)
const;
72 virtual std::ostream&
DescribeEq(std::ostream& out,
const char *prefix,
bool bInitial)
const;
92 std::ostream&
Restart(std::ostream& out)
const;
135 unsigned uLabel,
const DofOwner *pDO,
154 for (
int i = 0; i < 2; ++i) {
162 "Module: InlineFriction\n"
164 " This element implements a inline joint with friction\n"
166 " inline friction,\n"
167 " node1, (label) <node1>,\n"
168 " [ offset, (Vec3) <offset>, ]\n"
169 " [ hinge, (Mat3x3) <orientation>, ]\n"
170 " node2, (label) <node2>,\n"
171 " [ offset, (Vec3) <offset>, ]\n"
172 " coulomb friction coefficient, (real) <muc>,\n"
173 " static friction coefficient, (real) <mus>,\n"
174 " sliding velocity coefficient, (real) <vs>,\n"
175 " [ sliding velocity exponent, (real) <i>, ]\n"
176 " micro slip displacement, (real) <delta>,\n"
177 " [ initial stiction state, (real) <z0>, ]\n"
178 " [ initial stiction derivative, (real) <zP0>, ]\n"
179 " [ viscous friction coefficient, (real) <kv>, ]\n"
180 " [ stiction state equation scale, (real) <PhiScale> ]\n"
193 silent_cerr(
"inline friction(" <<
GetLabel() <<
"): keyword \"node1\" expected at line " << HP.
GetLineData() << std::endl);
200 silent_cerr(
"inline friction(" <<
GetLabel() <<
"): structural node expected at line " << HP.
GetLineData() << std::endl);
215 silent_cerr(
"inline friction(" <<
GetLabel() <<
"): keyword \"node2\" expected at line " << HP.
GetLineData() << std::endl);
222 silent_cerr(
"inline friction(" <<
GetLabel() <<
"): structural node expected at line " << HP.
GetLineData() << std::endl);
232 if (HP.
IsKeyWord(
"coulomb" "friction" "coefficient")) {
236 silent_cerr(
"inline friction(" <<
GetLabel() <<
"): coulomb friction coefficient must be greater than zero at line " << HP.
GetLineData() << std::endl);
240 if (HP.
IsKeyWord(
"static" "friction" "coefficient")) {
247 silent_cerr(
"inline friction(" <<
GetLabel() <<
"): static friction coefficient must be greater than or equal to zero at line " << HP.
GetLineData() << std::endl);
251 if (HP.
IsKeyWord(
"sliding" "velocity" "coefficient")) {
256 silent_cerr(
"inline friction(" <<
GetLabel() <<
"): sliding velocity coefficient must be greater than zero at line " << HP.
GetLineData() << std::endl);
260 if (HP.
IsKeyWord(
"sliding" "velocity" "exponent")) {
264 if (!HP.
IsKeyWord(
"micro" "slip" "displacement")) {
265 silent_cerr(
"inline friction(" <<
GetLabel() <<
"): keyword \"micro slip displacement\" expected at line " << HP.
GetLineData() << std::endl);
272 silent_cerr(
"inline friction(" <<
GetLabel() <<
"): micro slip displacement must be greater than zero at line " << HP.
GetLineData() << std::endl);
276 if (HP.
IsKeyWord(
"initial" "stiction" "state")) {
280 if (std::abs(
z) > 1.) {
281 silent_cerr(
"inline friction(" <<
GetLabel() <<
"): initial stiction state must be between -1 and 1 at line " << HP.
GetLineData() << std::endl);
285 if (HP.
IsKeyWord(
"initial" "stiction" "derivative")) {
293 if (HP.
IsKeyWord(
"viscous" "friction" "coefficient")) {
298 silent_cerr(
"inline friction(" <<
GetLabel() <<
"): viscous friction coefficient must be greater than or equal to zero at line " << HP.
GetLineData() << std::endl);
302 if (HP.
IsKeyWord(
"stiction" "state" "equation" "scale")) {
307 silent_cerr(
"inline friction(" <<
GetLabel() <<
"): stiction state equation scale must not be equal to zero at line " << HP.
GetLineData() << std::endl);
315 out <<
"inline friction: " <<
GetLabel() <<
" "
338 return 2u + 1u * (
muc > 0.);
373 out << prefix << iFirstIndex + 1 <<
"->" << iFirstIndex + 2 <<
": reaction forces [lambda1, lambda2]" << std::endl;
376 out << prefix << iFirstIndex + 3 <<
"->" << iFirstIndex + 4 <<
": reaction force derivatives [lambdaP1, lambdaP2]" << std::endl;
377 }
else if (
muc > 0) {
378 out << prefix << iFirstIndex + 3 <<
": stiction state [z]" << std::endl;
388 out << prefix << iFirstIndex + 1 <<
"->" << iFirstIndex + 2 <<
": position constraints [c1, c2]" << std::endl;
391 out << prefix << iFirstIndex + 3 <<
"->" << iFirstIndex + 4 <<
": velocity constraints [cP1, cP2]" << std::endl;
392 }
else if (
muc > 0) {
393 out << prefix << iFirstIndex + 3 <<
": stick slip transition [Phi]" << std::endl;
406 static const struct {
422 for (
int i = 0; i < N; ++i) {
423 if (0 == strcmp(data[i].name, s)) {
424 return data[i].index;
458 const double v =
SlidingVelocity(X1, R1, XP1, omega1, X2, R2, XP2, omega2);
462 silent_cerr(
"inline friction(" <<
GetLabel() <<
"): invalid private data index " << i << std::endl);
484 *piNumRows = *piNumCols = 14 + 1 * (
muc > 0);
507 for (
integer i = 1; i <= 6; ++i) {
508 WorkMat.
PutRowIndex(i, iFirstMomentumIndexNode1 + i);
509 WorkMat.
PutColIndex(i, iFirstPositionIndexNode1 + i);
510 WorkMat.
PutRowIndex(i + 6, iFirstMomentumIndexNode2 + i);
511 WorkMat.
PutColIndex(i + 6, iFirstPositionIndexNode2 + i);
514 for (
integer i = 1; i <= iNumDof; ++i) {
530 const Vec3 R2o2 = R2 *
o2;
531 const Vec3 R2_0o2 = R2_0 *
o2;
532 const Vec3 l1 = X2 + R2o2 - X1;
541 const Vec3 dDeltaXP_dX1_T = -omega1.
Cross(R1e1);
543 - omega1_0.
Cross((l1).Cross(R1e1));
544 const Vec3 dDeltaXP_dXP1_T = -R1e1;
545 const Vec3 dDeltaXP_dgP1_T = -l1.
Cross(R1e1);
546 const Vec3 dDeltaXP_dX2_T = omega1.
Cross(R1e1);
548 const Vec3& dDeltaXP_dXP2_T = R1e1;
549 const Vec3 dDeltaXP_dgP2_T = R2o2.
Cross(R1e1);
563 if (lambda_res != 0) {
564 for (
int i = 0; i < 2; ++i) {
565 dtau_dlambda[i] = mu *
lambda[i] *
z / (lambda_res *
delta);
568 for (
int i = 0; i < 2; ++i) {
574 const Vec3 dF1_dz = R1e1 * dtau_dz;
576 const Vec3 dM2_dz = (-R2o2).
Cross(dF1_dz);
580 const Vec3 dPhi_dX1_T = dDeltaXP_dX1_T * alpha;
581 const Vec3 dPhi_dg1_T = dDeltaXP_dg1_T * alpha;
582 const Vec3 dPhi_dXP1_T = dDeltaXP_dXP1_T * alpha;
583 const Vec3 dPhi_dgP1_T = dDeltaXP_dgP1_T * alpha;
584 const Vec3 dPhi_dX2_T = dDeltaXP_dX2_T * alpha;
585 const Vec3 dPhi_dg2_T = dDeltaXP_dg2_T * alpha;
586 const Vec3 dPhi_dXP2_T = dDeltaXP_dXP2_T * alpha;
587 const Vec3 dPhi_dgP2_T = dDeltaXP_dgP2_T * alpha;
592 WorkMat.
Put(1, 15, -dF1_dz * dCoef);
593 WorkMat.
Put(4, 15, -dM1_dz * dCoef);
594 WorkMat.
Put(7, 15, dF1_dz * dCoef);
595 WorkMat.
Put(10, 15, -dM2_dz * dCoef);
596 WorkMat.
PutT(15, 1, (dPhi_dXP1_T + dPhi_dX1_T * dCoef) * (-
PhiScale));
597 WorkMat.
PutT(15, 4, (dPhi_dgP1_T + dPhi_dg1_T * dCoef) * (-
PhiScale));
598 WorkMat.
PutT(15, 7, (dPhi_dXP2_T + dPhi_dX2_T * dCoef) * (-
PhiScale));
599 WorkMat.
PutT(15, 10, (dPhi_dgP2_T + dPhi_dg2_T * dCoef) * (-
PhiScale));
604 for (
int i = 0; i < 2; ++i)
610 const Vec3 dtau_dX1_T = dDeltaXP_dX1_T * dtau_dDeltaXP;
611 const Vec3 dtau_dg1_T = dDeltaXP_dg1_T * dtau_dDeltaXP;
612 const Vec3 dtau_dXP1_T = dDeltaXP_dXP1_T * dtau_dDeltaXP;
613 const Vec3 dtau_dgP1_T = dDeltaXP_dgP1_T * dtau_dDeltaXP;
614 const Vec3 dtau_dX2_T = dDeltaXP_dX2_T * dtau_dDeltaXP;
615 const Vec3 dtau_dg2_T = dDeltaXP_dg2_T * dtau_dDeltaXP;
616 const Vec3 dtau_dXP2_T = dDeltaXP_dXP2_T * dtau_dDeltaXP;
617 const Vec3 dtau_dgP2_T = dDeltaXP_dgP2_T * dtau_dDeltaXP;
624 const Mat3x3 dF1_dXP1 = R1e1.
Tens(dtau_dXP1_T);
625 const Mat3x3 dF1_dgP1 = R1e1.
Tens(dtau_dgP1_T);
628 const Mat3x3 dF1_dXP2 = R1e1.
Tens(dtau_dXP2_T);
629 const Mat3x3 dF1_dgP2 = R1e1.
Tens(dtau_dgP2_T);
630 const Vec3 dF1_dlambda1 = R1e1 * dtau_dlambda[
L1] + R1e2;
631 const Vec3 dF1_dlambda2 = R1e1 * dtau_dlambda[
L2] + R1e3;
641 const Vec3 dM1_dlambda1 = l1.
Cross(dF1_dlambda1);
642 const Vec3 dM1_dlambda2 = l1.
Cross(dF1_dlambda2);
652 const Vec3 dM2_dlambda1 = (-R2o2).
Cross(dF1_dlambda1);
653 const Vec3 dM2_dlambda2 = (-R2o2).
Cross(dF1_dlambda2);
655 const Vec3 dc1_dX1_T = -R1e2;
657 const Vec3& dc1_dX2_T = R1e2;
658 const Vec3 dc1_dg2_T = R2_0o2.
Cross(R1e2);
660 const Vec3 dc2_dX1_T = -R1e3;
662 const Vec3& dc2_dX2_T = R1e3;
663 const Vec3 dc2_dg2_T = R2_0o2.
Cross(R1e3);
665 WorkMat.
Put(1, 1, -dF1_dXP1 - dF1_dX1 * dCoef);
666 WorkMat.
Put(1, 4, -dF1_dgP1 - dF1_dg1 * dCoef);
667 WorkMat.
Put(1, 7, -dF1_dXP2 - dF1_dX2 * dCoef);
668 WorkMat.
Put(1, 10, -dF1_dgP2 - dF1_dg2 * dCoef);
669 WorkMat.
Put(1, 13, -dF1_dlambda1);
670 WorkMat.
Put(1, 14, -dF1_dlambda2);
672 WorkMat.
Put(4, 1, -dM1_dXP1 - dM1_dX1 * dCoef);
673 WorkMat.
Put(4, 4, -dM1_dgP1 - dM1_dg1 * dCoef);
674 WorkMat.
Put(4, 7, -dM1_dXP2 - dM1_dX2 * dCoef);
675 WorkMat.
Put(4, 10, -dM1_dgP2 - dM1_dg2 * dCoef);
676 WorkMat.
Put(4, 13, -dM1_dlambda1);
677 WorkMat.
Put(4, 14, -dM1_dlambda2);
679 WorkMat.
Put(7, 1, dF1_dXP1 + dF1_dX1 * dCoef);
680 WorkMat.
Put(7, 4, dF1_dgP1 + dF1_dg1 * dCoef);
681 WorkMat.
Put(7, 7, dF1_dXP2 + dF1_dX2 * dCoef);
682 WorkMat.
Put(7, 10, dF1_dgP2 + dF1_dg2 * dCoef);
683 WorkMat.
Put(7, 13, dF1_dlambda1);
684 WorkMat.
Put(7, 14, dF1_dlambda2);
686 WorkMat.
Put(10, 1, -dM2_dXP1 - dM2_dX1 * dCoef);
687 WorkMat.
Put(10, 4, -dM2_dgP1 - dM2_dg1 * dCoef);
688 WorkMat.
Put(10, 7, -dM2_dXP2 - dM2_dX2 * dCoef);
689 WorkMat.
Put(10, 10, -dM2_dgP2 - dM2_dg2 * dCoef);
690 WorkMat.
Put(10, 13, -dM2_dlambda1);
691 WorkMat.
Put(10, 14, -dM2_dlambda2);
693 WorkMat.
PutT(13, 1, -dc1_dX1_T);
694 WorkMat.
PutT(13, 4, -dc1_dg1_T);
695 WorkMat.
PutT(13, 7, -dc1_dX2_T);
696 WorkMat.
PutT(13, 10, -dc1_dg2_T);
698 WorkMat.
PutT(14, 1, -dc2_dX1_T);
699 WorkMat.
PutT(14, 4, -dc2_dg1_T);
700 WorkMat.
PutT(14, 7, -dc2_dX2_T);
701 WorkMat.
PutT(14, 10, -dc2_dg2_T);
722 for (
integer i = 1; i <= 6; ++i) {
723 WorkVec.
PutRowIndex(i, iFirstMomentumIndexNode1 + i);
724 WorkVec.
PutRowIndex(i + 6, iFirstMomentumIndexNode2 + i);
727 for (
integer i = 1; i <= iNumDof; ++i) {
731 for (
int i = 1; i <= 2; ++i)
732 lambda[i - 1] = XCurr(iFirstIndex + i);
739 const Vec3 R2o2 = R2 *
o2;
740 const Vec3 l1 = X2 + R2o2 - X1;
751 z = XCurr(iFirstIndex + 3);
752 zP = XPrimeCurr(iFirstIndex + 3);
773 for (
int i = 1; i <= 2; ++i) {
790 connectedNodes[0] =
pNode1;
791 connectedNodes[1] =
pNode2;
801 for (
int i = 1; i <= 2; ++i)
828 *piNumRows = *piNumCols = 28;
859 for (
integer i = 1; i <= 12; ++i) {
866 for (
integer i = 1; i <= 4; ++i) {
873 for (
int i = 1; i <= 2; ++i) {
875 lambdaP[i - 1] = XCurr.
dGetCoef(iFirstIndex + i + 2);
880 const Vec3 R2o2 = R2 *
o2;
881 const Vec3 R2_0o2 = R2_0 *
o2;
882 const Vec3 l1 = X2 + R2o2 - X1;
883 const Vec3 lP1 = XP2 + omega2.
Cross(R2o2) - XP1;
891 const Vec3& dF1_dlambda1 = R1e2;
892 const Vec3& dF1_dlambda2 = R1e3;
896 const Mat3x3 dM1_dX2 = -dM1_dX1;
898 const Vec3 dM1_dlambda1 = l1.
Cross(dF1_dlambda1);
899 const Vec3 dM1_dlambda2 = l1.
Cross(dF1_dlambda2);
904 const Vec3 dFP1_dlambda1 = omega1.
Cross(R1e2);
905 const Vec3 dFP1_dlambda2 = omega1.
Cross(R1e3);
906 const Vec3& dFP1_dlambdaP1 = R1e2;
907 const Vec3& dFP1_dlambdaP2 = R1e3;
912 const Mat3x3 dMP1_domega1 = l1.
Cross(dFP1_domega1);
917 const Vec3 dMP1_dlambda1 = lP1.
Cross(dF1_dlambda1) + l1.
Cross(dFP1_dlambda1);
918 const Vec3 dMP1_dlambda2 = lP1.
Cross(dF1_dlambda2) + l1.
Cross(dFP1_dlambda2);
919 const Vec3 dMP1_dlambdaP1 = l1.
Cross(dFP1_dlambdaP1);
920 const Vec3 dMP1_dlambdaP2 = l1.
Cross(dFP1_dlambdaP2);
924 const Vec3 dM2_dlambda1 = R2o2.
Cross(-dF1_dlambda1);
925 const Vec3 dM2_dlambda2 = R2o2.
Cross(-dF1_dlambda2);
928 const Mat3x3 dMP2_domega1 = (-R2o2).
Cross(dFP1_domega1);
931 const Vec3 dMP2_dlambda1 = (-omega2.
Cross(R2o2)).
Cross(dF1_dlambda1) - R2o2.
Cross(dFP1_dlambda1);
932 const Vec3 dMP2_dlambda2 = (-omega2.
Cross(R2o2)).
Cross(dF1_dlambda2) - R2o2.
Cross(dFP1_dlambda2);
933 const Vec3 dMP2_dlambdaP1 = -R2o2.
Cross(dFP1_dlambdaP1);
934 const Vec3 dMP2_dlambdaP2 = -R2o2.
Cross(dFP1_dlambdaP2);
936 const Vec3 dc1_dX1_T = -R1e2;
938 const Vec3& dc1_dX2_T = R1e2;
939 const Vec3 dc1_dg2_T = R2_0o2.
Cross(R1e2);
941 const Vec3 dc2_dX1_T = -R1e3;
943 const Vec3& dc2_dX2_T = R1e3;
944 const Vec3 dc2_dg2_T = R2_0o2.
Cross(R1e3);
946 const Vec3 dcP1_dX1_T = -omega1.
Cross(R1e2);
948 const Vec3 dcP1_dXP1_T = -R1e2;
949 const Vec3 dcP1_domega1_T = -l1.
Cross(R1e2);
950 const Vec3 dcP1_dX2_T = omega1.
Cross(R1e2);
951 const Vec3 dcP1_dg2_T = R2_0o2.
Cross((omega1 - omega2).
Cross(R1e2));
952 const Vec3& dcP1_dXP2_T = R1e2;
953 const Vec3 dcP1_domega2_T = R2o2.
Cross(R1e2);
955 const Vec3 dcP2_dX1_T = -omega1.
Cross(R1e3);
957 const Vec3 dcP2_dXP1_T = -R1e3;
958 const Vec3 dcP2_domega1_T = -l1.
Cross(R1e3);
959 const Vec3 dcP2_dX2_T = omega1.
Cross(R1e3);
960 const Vec3 dcP2_dg2_T = R2_0o2.
Cross((omega1 - omega2).
Cross(R1e3));
961 const Vec3& dcP2_dXP2_T = R1e3;
962 const Vec3 dcP2_domega2_T = R2o2.
Cross(R1e3);
964 WorkMat.
Put( 1, 4, -dF1_dg1);
965 WorkMat.
Put( 1, 25, -dF1_dlambda1);
966 WorkMat.
Put( 1, 26, -dF1_dlambda2);
968 WorkMat.
Put( 4, 1, -dM1_dX1);
969 WorkMat.
Put( 4, 4, -dM1_dg1);
970 WorkMat.
Put( 4, 13, -dM1_dX2);
971 WorkMat.
Put( 4, 16, -dM1_dg2);
972 WorkMat.
Put( 4, 25, -dM1_dlambda1);
973 WorkMat.
Put( 4, 26, -dM1_dlambda2);
975 WorkMat.
Put( 7, 4, -dFP1_dg1);
976 WorkMat.
Put( 7, 10, -dFP1_domega1);
977 WorkMat.
Put( 7, 25, -dFP1_dlambda1);
978 WorkMat.
Put( 7, 26, -dFP1_dlambda2);
979 WorkMat.
Put( 7, 27, -dFP1_dlambdaP1);
980 WorkMat.
Put( 7, 28, -dFP1_dlambdaP2);
982 WorkMat.
Put(10, 1, -dMP1_dX1);
983 WorkMat.
Put(10, 4, -dMP1_dg1);
984 WorkMat.
Put(10, 7, -dMP1_dXP1);
985 WorkMat.
Put(10, 10, -dMP1_domega1);
986 WorkMat.
Put(10, 13, -dMP1_dX2);
987 WorkMat.
Put(10, 16, -dMP1_dg2);
988 WorkMat.
Put(10, 19, -dMP1_dXP2);
989 WorkMat.
Put(10, 22, -dMP1_domega2);
990 WorkMat.
Put(10, 25, -dMP1_dlambda1);
991 WorkMat.
Put(10, 26, -dMP1_dlambda2);
992 WorkMat.
Put(10, 27, -dMP1_dlambdaP1);
993 WorkMat.
Put(10, 28, -dMP1_dlambdaP2);
995 WorkMat.
Put(13, 4, dF1_dg1);
996 WorkMat.
Put(13, 25, dF1_dlambda1);
997 WorkMat.
Put(13, 26, dF1_dlambda2);
999 WorkMat.
Put(16, 4, -dM2_dg1);
1000 WorkMat.
Put(16, 16, -dM2_dg2);
1001 WorkMat.
Put(16, 25, -dM2_dlambda1);
1002 WorkMat.
Put(16, 26, -dM2_dlambda2);
1004 WorkMat.
Put(19, 4, dFP1_dg1);
1005 WorkMat.
Put(19, 10, dFP1_domega1);
1006 WorkMat.
Put(19, 25, dFP1_dlambda1);
1007 WorkMat.
Put(19, 26, dFP1_dlambda2);
1008 WorkMat.
Put(19, 27, dFP1_dlambdaP1);
1009 WorkMat.
Put(19, 28, dFP1_dlambdaP2);
1011 WorkMat.
Put(22, 4, -dMP2_dg1);
1012 WorkMat.
Put(22, 10, -dMP2_domega1);
1013 WorkMat.
Put(22, 16, -dMP2_dg2);
1014 WorkMat.
Put(22, 22, -dMP2_domega2);
1015 WorkMat.
Put(22, 25, -dMP2_dlambda1);
1016 WorkMat.
Put(22, 26, -dMP2_dlambda2);
1017 WorkMat.
Put(22, 27, -dMP2_dlambdaP1);
1018 WorkMat.
Put(22, 28, -dMP2_dlambdaP2);
1020 WorkMat.
PutT(25, 1, -dc1_dX1_T);
1021 WorkMat.
PutT(25, 4, -dc1_dg1_T);
1022 WorkMat.
PutT(25, 13, -dc1_dX2_T);
1023 WorkMat.
PutT(25, 16, -dc1_dg2_T);
1025 WorkMat.
PutT(26, 1, -dc2_dX1_T);
1026 WorkMat.
PutT(26, 4, -dc2_dg1_T);
1027 WorkMat.
PutT(26, 13, -dc2_dX2_T);
1028 WorkMat.
PutT(26, 16, -dc2_dg2_T);
1030 WorkMat.
PutT(27, 1, -dcP1_dX1_T);
1031 WorkMat.
PutT(27, 4, -dcP1_dg1_T);
1032 WorkMat.
PutT(27, 7, -dcP1_dXP1_T);
1033 WorkMat.
PutT(27, 10, -dcP1_domega1_T);
1034 WorkMat.
PutT(27, 13, -dcP1_dX2_T);
1035 WorkMat.
PutT(27, 16, -dcP1_dg2_T);
1036 WorkMat.
PutT(27, 19, -dcP1_dXP2_T);
1037 WorkMat.
PutT(27, 22, -dcP1_domega2_T);
1039 WorkMat.
PutT(28, 1, -dcP2_dX1_T);
1040 WorkMat.
PutT(28, 4, -dcP2_dg1_T);
1041 WorkMat.
PutT(28, 7, -dcP2_dXP1_T);
1042 WorkMat.
PutT(28, 10, -dcP2_domega1_T);
1043 WorkMat.
PutT(28, 13, -dcP2_dX2_T);
1044 WorkMat.
PutT(28, 16, -dcP2_dg2_T);
1045 WorkMat.
PutT(28, 19, -dcP2_dXP2_T);
1046 WorkMat.
PutT(28, 22, -dcP2_domega2_T);
1075 for (
integer i = 1; i <= 12; ++i) {
1077 WorkVec.
PutRowIndex(i + 12, iFirstIndexNode2 + i);
1080 for (
integer i = 1; i <= 4; ++i) {
1086 for (
int i = 1; i <= 2; ++i) {
1088 lambdaP[i - 1] = XCurr.
dGetCoef(iFirstIndex + i + 2);
1091 const Vec3 R2o2 = R2 *
o2;
1092 const Vec3 l1 = X2 + R2o2 - X1;
1099 const Vec3 F2 = -F1;
1101 const Vec3 FP2 = -FP1;
1107 WorkVec.
Put( 1, F1);
1108 WorkVec.
Put( 4, M1);
1109 WorkVec.
Put( 7, FP1);
1110 WorkVec.
Put(10, MP1);
1111 WorkVec.
Put(13, F2);
1112 WorkVec.
Put(16, M2);
1113 WorkVec.
Put(19, FP2);
1114 WorkVec.
Put(22, MP2);
1116 for (
int i = 1; i <= 2; ++i) {
1133 for (
int i = 0; i < 2; ++i)
1136 lambda_res =
sqrt(lambda_res);
1159 if (!
SetUDE(
"inline" "friction", rf))
1168 #ifndef STATIC_MODULES
1177 silent_cerr(
"inline friction: "
1178 "module_init(" << module_name <<
") "
1179 "failed" << std::endl);
1189 #endif // ! STATIC_MODULE
flag fReadOutput(MBDynParser &HP, const T &t) const
virtual doublereal dGetPrivData(unsigned int i) const
GradientExpression< UnaryExpr< FuncExp, Expr > > exp(const GradientExpression< Expr > &u)
Mat3x3 GetRotRel(const ReferenceFrame &rf)
void PutColIndex(integer iSubCol, integer iCol)
const Vec3 Zero3(0., 0., 0.)
Vec3 Cross(const Vec3 &v) const
virtual DofOrder::Order GetEqType(unsigned int i) const
virtual const Mat3x3 & GetRRef(void) const
virtual bool bToBeOutput(void) const
virtual unsigned int iGetPrivDataIdx(const char *s) const
GradientExpression< BinaryExpr< FuncPow, LhsExpr, RhsExpr > > pow(const GradientExpression< LhsExpr > &u, const GradientExpression< RhsExpr > &v)
#define MBDYN_EXCEPT_ARGS
virtual void ResizeReset(integer)
const MatCross_Manip MatCross
FullSubMatrixHandler & SetFull(void)
virtual const Mat3x3 & GetRCurr(void) const
void PutT(integer iRow, integer iCol, const Vec3 &v)
bool inline_friction_set(void)
std::ostream & Restart(std::ostream &out) const
doublereal Dot(const Vec3 &v) const
InlineFriction(unsigned uLabel, const DofOwner *pDO, DataManager *pDM, MBDynParser &HP)
virtual unsigned int iGetNumPrivData(void) const
void Put(integer iRow, integer iCol, const Vec3 &v)
VariableSubMatrixHandler & AssJac(VariableSubMatrixHandler &WorkMat, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
virtual ~InlineFriction(void)
const Mat3x3 Eye3(1., 0., 0., 0., 1., 0., 0., 0., 1.)
void PutCoef(integer iRow, integer iCol, const doublereal &dCoef)
Vec3 GetCol(unsigned short int i) const
doublereal FrictionCoefficient(doublereal DeltaXP) const
virtual void WorkSpaceDim(integer *piNumRows, integer *piNumCols) const
virtual const doublereal & dGetCoef(integer iRow) const =0
virtual const Vec3 & GetWRef(void) const
doublereal FrictionForce(doublereal DeltaXP) const
std::vector< Hint * > Hints
virtual void InitialWorkSpaceDim(integer *piNumRows, integer *piNumCols) const
Vec3 MulTV(const Vec3 &v) const
virtual void PutRowIndex(integer iSubRow, integer iRow)=0
int iGetNumConnectedNodes(void) const
SubVectorHandler & InitialAssRes(SubVectorHandler &WorkVec, const VectorHandler &XCurr)
virtual std::ostream & DescribeDof(std::ostream &out, const char *prefix, bool bInitial) const
void SetValue(DataManager *pDM, VectorHandler &X, VectorHandler &XP, SimulationEntity::Hints *ph)
void GetConnectedNodes(std::vector< const Node * > &connectedNodes) const
Vec3 GetPosRel(const ReferenceFrame &rf)
int module_init(const char *module_name, void *pdm, void *php)
This function registers our user defined element for the math parser.
virtual bool IsKeyWord(const char *sKeyWord)
std::ostream & Loadable(void) const
SubVectorHandler & AssRes(SubVectorHandler &WorkVec, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
doublereal copysign(doublereal x, doublereal y)
virtual DofOrder::Order GetDofType(unsigned int i) const
LagrangeMultiplierIndex_t
doublereal SlidingVelocity(const Vec3 &X1, const Mat3x3 &R1, const Vec3 &XP1, const Vec3 &omega1, const Vec3 &X2, const Mat3x3 &R2, const Vec3 &XP2, const Vec3 &omega2) const
virtual integer iGetFirstMomentumIndex(void) const =0
virtual integer iGetFirstPositionIndex(void) const
virtual const Vec3 & GetWCurr(void) const
doublereal NormalForceMagnitude() const
virtual unsigned int iGetNumDof(void) const
#define ASSERT(expression)
Mat3x3 Tens(const Vec3 &v) const
GradientExpression< UnaryExpr< FuncSqrt, Expr > > sqrt(const GradientExpression< Expr > &u)
VariableSubMatrixHandler & InitialAssJac(VariableSubMatrixHandler &WorkMat, const VectorHandler &XCurr)
virtual std::ostream & DescribeEq(std::ostream &out, const char *prefix, bool bInitial) 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)
virtual const Vec3 & GetXCurr(void) const
virtual void Output(OutputHandler &OH) const
virtual void ResizeReset(integer, integer)
const MatCrossCross_Manip MatCrossCross
virtual void Put(integer iRow, const Vec3 &v)
void PutRowIndex(integer iSubRow, integer iRow)
std::ostream & GetLogFile(void) const
bool SetUDE(const std::string &s, UserDefinedElemRead *rude)
virtual unsigned int iGetInitialNumDof(void) const
virtual const Vec3 & GetVCurr(void) const
static const doublereal a
virtual void SetOutputFlag(flag f=flag(1))
virtual integer iGetFirstIndex(void) const
virtual HighParser::ErrOut GetLineData(void) const
unsigned int GetLabel(void) const
Node * ReadNode(MBDynParser &HP, Node::Type type) const
bool UseText(int out) const
virtual doublereal GetReal(const doublereal &dDefval=0.0)