62 "Author: Louis Gagnon <louis.gagnon.10@ulaval.ca> \n"
63 "Organization: Departement de genie mecanique \n"
64 " Universite Laval \n"
65 " http://www.gmc.ulaval.ca \n"
66 " Pierangelo Masarati <masarati@aero.polimi.it> \n"
67 " Marco Morandini <morandini@aero.polimi.it> \n"
68 "Organization: Dipartimento di Ingegneria Aerospaziale \n"
69 " Politecnico di Milano \n"
70 " http://www.aero.polimi.it \n"
72 "L. Gagnon, M. J. Richard, P. Masarati, M. Morandini, and G. Dore. Multibody simulation of tires operating on an uneven road. In Multibody Dynamics 2011, 4-7 July 2011"
73 " And soon coming : L. Gagnon, M. J. Richard, P. Masarati, M. Morandini, and G. Dore. A Free Implicit Rigid Ring Tire Model"
74 " All rights reserved \n"
75 " Wheel4 requires the ginac libraries to be installed \n"
84 " - The Ring and the Wheel structural nodes must be connected \n"
85 " by a 6 DoF viscoelastic element \n"
109 if (dWheelAxle < std::numeric_limits<doublereal>::epsilon()) {
110 silent_cerr(
"Wheel4(" <<
GetLabel() <<
"): "
111 "wheel axle is too small "
112 "for numeric limits" << std::endl);
226 std::vector<int> row;
227 for (
int jCnt = 0; jCnt < 3; jCnt++) {
238 out <<
"wheel4: " << uLabel
261 NcFile *pBinFile = OH.pGetBinFile();
264 int l = snprintf(buf,
sizeof(buf),
"loadable.wheel4.%lu",
277 strcpy(&buf[l],
"Fint");
278 Var_Fint = pBinFile->add_var(buf, ncDouble,
279 OH.DimTime(), OH.DimV3());
285 strcpy(&buf[l],
"Xpar");
286 Var_Xpar = pBinFile->add_var(buf, ncDouble,
287 OH.DimTime(), OH.DimV3());
293 strcpy(&buf[l],
"Xparp");
294 Var_Xparp = pBinFile->add_var(buf, ncDouble,
295 OH.DimTime(), OH.DimV3());
302 strcpy(&buf[l],
"dXxProj");
303 Var_dXxProj = pBinFile->add_var(buf, ncDouble,
304 OH.DimTime(), OH.DimV1());
308 if (!Var_dXxProj->add_att(
"description",
"patch center point x-value of the road profile (attention: this is not the same thing as the patch position"))
throw DataManager::ErrGeneric(
MBDYN_EXCEPT_ARGS);
312 strcpy(&buf[l],
"dRoad");
313 Var_dRoad = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV1());
319 strcpy(&buf[l],
"F");
320 Var_F = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV3());
326 strcpy(&buf[l],
"Fn");
327 Var_Fn = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV1());
333 strcpy(&buf[l],
"debug");
334 Var_debug = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV1());
340 strcpy(&buf[l],
"dSr");
341 Var_dSr = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV1());
347 strcpy(&buf[l],
"ddistM");
348 Var_ddistM = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV1());
354 strcpy(&buf[l],
"Fcent");
355 Var_Fcent = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV1());
361 strcpy(&buf[l],
"dLs");
362 Var_dLs = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV1());
368 strcpy(&buf[l],
"R_e");
369 Var_R_e = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV1());
375 strcpy(&buf[l],
"dSa");
376 Var_dSa = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV1());
382 strcpy(&buf[l],
"dvax");
383 Var_dvax = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV1());
389 strcpy(&buf[l],
"dvx");
390 Var_dvx = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV1());
396 strcpy(&buf[l],
"dvay");
397 Var_dvay = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV1());
403 strcpy(&buf[l],
"dMuY");
404 Var_dMuY = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV1());
410 strcpy(&buf[l],
"dMuX");
411 Var_dMuX = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV1());
417 strcpy(&buf[l],
"KE");
418 Var_KE = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV1());
424 strcpy(&buf[l],
"PE");
425 Var_PE = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV1());
431 strcpy(&buf[l],
"E");
432 Var_E = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV1());
438 strcpy(&buf[l],
"dRoadAhead");
439 Var_dRoadAhead = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV1());
445 strcpy(&buf[l],
"dRoadBehind");
446 Var_dRoadBehind = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV1());
452 strcpy(&buf[l],
"dCt");
453 Var_dCt = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV1());
459 strcpy(&buf[l],
"M");
460 Var_M = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV3());
466 strcpy(&buf[l],
"distM");
467 Var_distM = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV3());
473 strcpy(&buf[l],
"n");
474 Var_n = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV3());
480 strcpy(&buf[l],
"Xpa");
481 Var_Xpa = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV3());
487 strcpy(&buf[l],
"Vpa");
488 Var_Vpa = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV3());
494 strcpy(&buf[l],
"Vpar");
495 Var_Vpar = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV3());
501 strcpy(&buf[l],
"fwd");
502 Var_fwd = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV3());
508 strcpy(&buf[l],
"fwdRing");
509 Var_fwdRing = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV3());
515 strcpy(&buf[l],
"fwdRingFlat");
516 Var_fwdRingFlat = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV3());
522 strcpy(&buf[l],
"pcRing");
523 Var_pcRing = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV3());
529 strcpy(&buf[l],
"VparWheel");
530 Var_VparWheel = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV3());
536 strcpy(&buf[l],
"Fr");
537 Var_Fr = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV3());
543 strcpy(&buf[l],
"Mz");
544 Var_Mz = pBinFile->add_var(buf, ncDouble, OH.DimTime(), OH.DimV3());
747 Vec3 dFnewdFintz =
k;
768 Vec3 dFnewdVx = dFnewdFintx*dFintxdVx+dFnewdFinty*dFintydVx+dFnewdFintz*dFintzdVx;
769 Vec3 dFnewdXx = dFnewdFintx*dFintxdXx+dFnewdFinty*dFintydXx+dFnewdFintz*dFintzdXx;
770 Vec3 dFnewdVy = dFnewdFintx*dFintxdVy+dFnewdFinty*dFintydVy+dFnewdFintz*dFintzdVy;
771 Vec3 dFnewdXy = dFnewdFintx*dFintxdXy+dFnewdFinty*dFintydXy+dFnewdFintz*dFintzdXy;
772 Vec3 dFnewdVz = dFnewdFintx*dFintxdVz+dFnewdFinty*dFintydVz+dFnewdFintz*dFintzdVz;
773 Vec3 dFnewdXz = dFnewdFintx*dFintxdXz+dFnewdFinty*dFintydXz+dFnewdFintz*dFintzdXz;
782 WM.
PutCoef(1, 1,
Mpa - dCoef*(-dFnewdVx(1)+dFdVx(1)));
783 WM.
PutCoef(1, 2, -dCoef*(-dFnewdXx(1)+dFdXx(1)));
786 WM.
PutCoef(1, 3, dCoef*(dFnewdVy(1)-dFdVy(1)));
787 WM.
PutCoef(1, 4, dCoef*(dFnewdXy(1)-dFdXy(1)));
789 WM.
PutCoef(3, 3,
Mpa - dCoef*(-dFnewdVy(2)+dFdVy(2)));
790 WM.
PutCoef(3, 4, dCoef*(dFnewdXy(2)-dFdXy(2)));
793 WM.
PutCoef(3, 1, dCoef*(dFnewdVx(2)-dFdVx(2)));
794 WM.
PutCoef(3, 2, dCoef*(dFnewdXx(2)-dFdXx(2)));
800 Vec3 dFrintdFnewy =
j;
801 Vec3 dFrintdFnewz =
n;
802 Vec3 dFrintdVx = dFrintdFnewx*dFnewdVx(1)+dFrintdFnewy*dFnewdVx(2)+dFrintdFnewz*dFnewdVx(3);
803 Vec3 dFrintdVy = dFrintdFnewx*dFnewdVy(1)+dFrintdFnewy*dFnewdVy(2)+dFrintdFnewz*dFnewdVy(3);
804 Vec3 dFrintdVz = dFrintdFnewx*dFnewdVz(1)+dFrintdFnewy*dFnewdVz(2)+dFrintdFnewz*dFnewdVz(3);
805 Vec3 dFrintdXx = dFrintdFnewx*dFnewdXx(1)+dFrintdFnewy*dFnewdXx(2)+dFrintdFnewz*dFnewdXx(3);
806 Vec3 dFrintdXy = dFrintdFnewx*dFnewdXy(1)+dFrintdFnewy*dFnewdXy(2)+dFrintdFnewz*dFnewdXy(3);
807 Vec3 dFrintdXz = dFrintdFnewx*dFnewdXz(1)+dFrintdFnewy*dFnewdXz(2)+dFrintdFnewz*dFnewdXz(3);
811 WM.
PutCoef(5, 1, -dCoef*(dFrintdVx(1)));
812 WM.
PutCoef(5, 2, -dCoef*(dFrintdXx(1)));
813 WM.
PutCoef(5, 3, -dCoef*(dFrintdVy(1)));
814 WM.
PutCoef(5, 4, -dCoef*(dFrintdXy(1)));
815 WM.
PutCoef(6, 1, -dCoef*(dFrintdVx(2)));
816 WM.
PutCoef(6, 2, -dCoef*(dFrintdXx(2)));
817 WM.
PutCoef(6, 3, -dCoef*(dFrintdVy(2)));
818 WM.
PutCoef(6, 4, -dCoef*(dFrintdXy(2)));
819 WM.
PutCoef(7, 1, -dCoef*(dFrintdVx(3)));
820 WM.
PutCoef(7, 2, -dCoef*(dFrintdXx(3)));
821 WM.
PutCoef(7, 3, -dCoef*(dFrintdVy(3)));
822 WM.
PutCoef(7, 4, -dCoef*(dFrintdXy(3)));
835 WM.
PutCoef(1, 5, -(dFnewdVx(1)+dCoef*dFnewdXx(1)));
836 WM.
PutCoef(1, 6, -(dFnewdVy(1)+dCoef*dFnewdXy(1)));
837 WM.
PutCoef(3, 6, -(dFnewdVy(2)+dCoef*dFnewdXy(2)));
838 WM.
PutCoef(3, 5, -(dFnewdVx(2)+dCoef*dFnewdXx(2)));
846 WM.
PutCoef(1, 7, -dFxpatch_dZp - dCoef * dFxpatch_dZ);
847 WM.
PutCoef(3, 7, -dFypatch_dZp - dCoef * dFypatch_dZ);
865 Vec3 Gr1r = -dR1new_dRvr.
Cross(Rvr)*dCoef;
866 Vec3 Gr3r = -dR3new_dRvr.
Cross(Rvr)*dCoef;
881 Vec3 dR5new_dRvr = dR5_dRvr;
884 Vec3 dRr6_dRvr = dR3new_dRvr;
922 Vec3 dRr8_dRvr =
Vec3(dRrM_dRvrx(1),dRrM_dRvry(1),dRrM_dRvrz(1));
923 Vec3 dRr9_dRvr =
Vec3(dRrM_dRvrx(2),dRrM_dRvry(2),dRrM_dRvrz(2));
924 Vec3 dRr10_dRvr =
Vec3(dRrM_dRvrx(3),dRrM_dRvry(3),dRrM_dRvrz(3));
928 Vec3 Gr10r = -dRr10_dRvr.
Cross(Rvr)*dCoef;
952 Vec3 dM_dXrx = -dM_dXx;
953 Vec3 dM_dXrxp = -dM_dVx;
954 Vec3 dM_dXry = -dM_dXy;
955 Vec3 dM_dXryp = -dM_dVy;
956 Vec3 dM_dXrz = -dM_dXz;
957 Vec3 dM_dXrzp = -dM_dVz;
959 WM.
PutCoef(8, 1, -dCoef*dM_dVx(1));
960 WM.
PutCoef(8, 2, -dCoef*dM_dXx(1));
961 WM.
PutCoef(8, 3, -dCoef*dM_dVy(1));
962 WM.
PutCoef(8, 4, -dCoef*dM_dXy(1));
963 WM.
PutCoef(8, 5, -dCoef*dM_dXrx(1)-dM_dXrxp(1));
964 WM.
PutCoef(8, 6, -dCoef*dM_dXry(1)-dM_dXryp(1));
965 WM.
PutCoef(8, 7, -dCoef*dM_dXrz(1)-dM_dXrzp(1));
966 WM.
PutCoef(9, 1, -dCoef*dM_dVx(2));
967 WM.
PutCoef(9, 2, -dCoef*dM_dXx(2));
968 WM.
PutCoef(9, 3, -dCoef*dM_dVy(2));
969 WM.
PutCoef(9, 4, -dCoef*dM_dXy(2));
970 WM.
PutCoef(9, 5, -dCoef*dM_dXrx(2)-dM_dXrxp(2));
971 WM.
PutCoef(9, 6, -dCoef*dM_dXry(2)-dM_dXryp(2));
972 WM.
PutCoef(9, 7, -dCoef*dM_dXrz(2)-dM_dXrzp(2));
973 WM.
PutCoef(10, 1, -dCoef*dM_dVx(3));
974 WM.
PutCoef(10, 2, -dCoef*dM_dXx(3));
975 WM.
PutCoef(10, 3, -dCoef*dM_dVy(3));
976 WM.
PutCoef(10, 4, -dCoef*dM_dXy(3));
977 WM.
PutCoef(10, 5, -dCoef*dM_dXrx(3)-dM_dXrxp(3));
978 WM.
PutCoef(10, 6, -dCoef*dM_dXry(3)-dM_dXryp(3));
979 WM.
PutCoef(10, 7, -dCoef*dM_dXrz(3)-dM_dXrzp(3));
986 WM.
PutCoef(5, 5, dFrintdVx(1) + dCoef*dFrintdXx(1));
987 WM.
PutCoef(5, 6, dFrintdVy(1) + dCoef*dFrintdXy(1));
988 WM.
PutCoef(5, 7, dFrintdVz(1) + dCoef*dFrintdXz(1));
991 WM.
PutCoef(6, 5, dFrintdVx(2) + dCoef*dFrintdXx(2));
992 WM.
PutCoef(6, 6, dFrintdVy(2) + dCoef*dFrintdXy(2));
993 WM.
PutCoef(6, 7, dFrintdVz(2) + dCoef*dFrintdXz(2));
996 WM.
PutCoef(7, 5, dFrintdVx(3) + dCoef*dFrintdXx(3));
997 WM.
PutCoef(7, 6, dFrintdVy(3) + dCoef*dFrintdXy(3));
998 WM.
PutCoef(7, 7, dFrintdVz(3) + dCoef*dFrintdXz(3));
1046 Vec3 dr1_dW(dr1_dWx,dr1_dWy,dr1_dWz);
1047 Vec3 dr1_dgdot(dr1_dW + refW.
Cross(dr1_dW) * dCoef);
1048 Vec3 n_dr1_dXp =
Vec3(dr1_dXxp,dr1_dXyp,dr1_dXzp)*(-1);
1050 WM.
PutCoef(1, 11, n_dr1_dXp(1));
1051 WM.
PutCoef(1, 12, n_dr1_dXp(2));
1052 WM.
PutCoef(1, 13, n_dr1_dXp(3));
1070 WM.
PutCoef(1, 14, -dr1_dgdot(1)-Gr1(1));
1071 WM.
PutCoef(1, 15, -dr1_dgdot(2)-Gr1(2));
1072 WM.
PutCoef(1, 16, -dr1_dgdot(3)-Gr1(3));
1086 Vec3 dr3_dW(dr3_dWx,dr3_dWy,dr3_dWz);
1087 Vec3 dr3_dgdot(dr3_dW + refW.
Cross(dr3_dW) * dCoef);
1088 Vec3 n_dr3_dXp =
Vec3(dr3_dXxp,dr3_dXyp,dr3_dXzp)*(-1);
1090 WM.
PutCoef(3, 11, n_dr3_dXp(1));
1091 WM.
PutCoef(3, 12, n_dr3_dXp(2));
1092 WM.
PutCoef(3, 13, n_dr3_dXp(3));
1093 WM.
PutCoef(3, 14, -dr3_dgdot(1)-Gr3(1));
1094 WM.
PutCoef(3, 15, -dr3_dgdot(2)-Gr3(2));
1095 WM.
PutCoef(3, 16, -dr3_dgdot(3)-Gr3(3));
1109 Vec3 dM_dVwx = dM_dAlpha*dAlpha_dVw(1);
1110 Vec3 dM_dVwy = dM_dAlpha*dAlpha_dVw(2);
1111 Vec3 dM_dVwz = dM_dAlpha*dAlpha_dVw(3);
1113 WM.
PutCoef(8, 11, -dM_dVwx(1));
1114 WM.
PutCoef(8, 12, -dM_dVwy(1));
1115 WM.
PutCoef(8, 13, -dM_dVwz(1));
1116 WM.
PutCoef(9, 11, -dM_dVwx(2));
1117 WM.
PutCoef(9, 12, -dM_dVwy(2));
1118 WM.
PutCoef(9, 13, -dM_dVwz(2));
1119 WM.
PutCoef(10, 11, -dM_dVwx(3));
1120 WM.
PutCoef(10, 12, -dM_dVwy(3));
1121 WM.
PutCoef(10, 13, -dM_dVwz(3));
1125 Vec3 dM_dRvx = dM_dAlpha*dAlpha_dRv(1);
1126 Vec3 dM_dRvy = dM_dAlpha*dAlpha_dRv(2);
1127 Vec3 dM_dRvz = dM_dAlpha*dAlpha_dRv(3);
1128 Vec3 dR8_dRv =
Vec3(dM_dRvx(1),dM_dRvy(1),dM_dRvz(1));
1129 Vec3 dR9_dRv =
Vec3(dM_dRvx(2),dM_dRvy(2),dM_dRvz(2));
1130 Vec3 dR10_dRv =
Vec3(dM_dRvx(3),dM_dRvy(3),dM_dRvz(3));
1248 dXxProjAhead =
CapLoop(dXxProjAhead);
1249 dXxProjBehind =
CapLoop(dXxProjBehind);
1259 if (
fabs(
n(3)) < std::numeric_limits<doublereal>::epsilon()) {
1260 silent_cerr(
"Wheel4(" <<
GetLabel() <<
"): "
1261 "a road segment is vertical, "
1262 "wheel4 cannot properly deal with such a road" << std::endl);
1277 dDebug2 = -std::numeric_limits<doublereal>::max();
1295 doublereal dt_maxHeight = -std::numeric_limits<doublereal>::max();
1296 doublereal dt_minHeight = std::numeric_limits<doublereal>::max();
1300 dt_maxHeight = fmax( dt_maxHeight,
pRoad->
dGet(
CapLoop(dt_dXxProj_dLsNow)) );
1301 dt_minHeight = fmin( dt_minHeight,
pRoad->
dGet(
CapLoop(dt_dXxProj_dLsNow)) );
1302 dt_dXxProj_dLsNow +=
dt_Res;
1305 doublereal dt_stepHeight = fmax( dt_maxHeight - dt_minHeight ,1e-15);
1316 for (
int jCnt = 1; jCnt <= dt_nStepsNow; jCnt++)
1331 dt_maxHeight = -std::numeric_limits<doublereal>::max();
1332 dt_minHeight = std::numeric_limits<doublereal>::max();
1336 dt_maxHeight = fmax( dt_maxHeight,
pRoad->
dGet(
CapLoop(dt_dXxProj_dLsNow)) );
1337 dt_minHeight = fmin( dt_minHeight,
pRoad->
dGet(
CapLoop(dt_dXxProj_dLsNow)) );
1338 dt_dXxProj_dLsNow +=
dt_Res;
1340 dt_stepInflRatio = (dt_maxHeight - dt_minHeight)/dt_stepHeight;
1385 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
1398 if (signChg >=2) b_dtInc = 0;
1399 if (signChg ==3) dt_divFT =
dt_divF3;
1400 if (signChg >=4) dt_divFT =
dt_divF4;
1449 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
1451 WorkVec.
PutRowIndex(4 + iCnt, iRingFirstMomIndex + iCnt);
1457 for (
int iCnt = 1; iCnt <= 4; iCnt++) {
1469 dVPx = XPrimeCurr(iFirstIndex + 1);
1470 dXPx = XPrimeCurr(iFirstIndex + 2);
1471 dVx = XCurr(iFirstIndex + 1);
1472 dXx = XCurr(iFirstIndex + 2);
1474 dVPy = XPrimeCurr(iFirstIndex + 3);
1475 dXPy = XPrimeCurr(iFirstIndex + 4);
1476 dVy = XCurr(iFirstIndex + 3);
1477 dXy = XCurr(iFirstIndex + 4);
1483 if (d < std::numeric_limits<doublereal>::epsilon()) {
1484 silent_cerr(
"Wheel4(" <<
GetLabel() <<
"): "
1485 "wheel axle is (nearly) orthogonal "
1486 "to the ground" << std::endl);
1497 if (dRing < std::numeric_limits<doublereal>::epsilon()) {
1498 silent_cerr(
"Wheel4(" <<
GetLabel() <<
"): "
1499 "ring axle is (nearly) orthogonal "
1500 "to the ground" << std::endl);
1542 if (dRingFlat < std::numeric_limits<doublereal>::epsilon()) {
1543 silent_cerr(
"Wheel4(" <<
GetLabel() <<
"): "
1544 "ringFlat axle is (nearly) orthogonal "
1545 "to the ground" << std::endl);
1568 if (
ddistM < std::numeric_limits<doublereal>::epsilon()) {
1569 silent_cerr(
"Wheel4(" <<
GetLabel() <<
"): "
1570 "distance between patch and ring center is (nearly) zero, adjust your elements or initial distance "
1687 WorkVec.
Add(5, Fint_ring);
1739 while (Xuncapped >
RDL) Xuncapped-=
RDL;
1749 XCurr.
PutCoef(iFirstIndex + 3, 0);
1750 XCurr.
PutCoef(iFirstIndex + 1, 0);
1795 connectedNodes.resize(2);
1797 connectedNodes[0] =
pWheel;
1798 connectedNodes[1] =
pRing;
1812 return out <<
"# not implemented yet" << std::endl;
1875 unsigned uLabel,
const DofOwner *pDO,
1884 "Module: timestep \n"
1885 "Author: Louis Gagnon < louis.gagnon.10@ulaval.ca \n"
1886 "Organization: Universite Laval \n"
1890 " All rights reserved \n"
1969 for (
unsigned iCnt = 1; iCnt <
pWheelsE.size(); iCnt++) {
1984 connectedNodes.resize(0);
1998 return out <<
"# TimeStep: not implemented" << std::endl;
2050 if (!
SetUDE(
"rigid" "ring" "tire", rf)) {
2052 silent_cerr(
"RigidRingTire: "
2053 "module_init(" << module_name <<
") "
2054 "failed" << std::endl);
2061 while (pHP->
IsArg()) {
2064 silent_cerr(
"RigidRingTire: "
2065 "unable to get arg; "
2066 "module_init(" << module_name <<
") "
2067 "failed" << std::endl);
2074 silent_cerr(
"Wheel4: "
2075 "unable to set parser for name \"" << s <<
"\"; "
2076 "module_init(" << module_name <<
") "
2077 "failed" << std::endl);
2083 if (!
SetUDE(
"timestep", rf2)) {
2085 silent_cerr(
"module-timestep: "
2086 "module_init(" << module_name <<
") "
2087 "failed" << std::endl);
flag fReadOutput(MBDynParser &HP, const T &t) const
void PutColIndex(integer iSubCol, integer iCol)
integer iGetNumCols(void) const
void GetConnectedNodes(std::vector< const Node * > &connectedNodes) const
Vec3 Cross(const Vec3 &v) const
virtual bool bToBeOutput(void) const
GradientExpression< BinaryExpr< FuncPow, LhsExpr, RhsExpr > > pow(const GradientExpression< LhsExpr > &u, const GradientExpression< RhsExpr > &v)
#define MBDYN_EXCEPT_ARGS
virtual void ResizeReset(integer)
virtual integer GetInt(integer iDefval=0)
bool UseNetCDF(int out) const
FullSubMatrixHandler & SetFull(void)
virtual const Mat3x3 & GetRCurr(void) const
Elem * ReadElem(MBDynParser &HP, Elem::Type type) const
doublereal Dot(const Vec3 &v) const
virtual DofOrder::Order GetEqType(unsigned int i) const
unsigned int iGetNumPrivData(void) const
Wheel4(unsigned uLabel, const DofOwner *pDO, DataManager *pDM, MBDynParser &HP)
void PutCoef(integer iRow, integer iCol, const doublereal &dCoef)
const DriveHandler * pGetDrvHdl(void) const
SubVectorHandler & AssRes(SubVectorHandler &WorkVec, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
virtual const Vec3 & GetWRef(void) const
Vec3 EBEMult(const Vec3 &v) const
std::vector< Hint * > Hints
GradientExpression< UnaryExpr< FuncFabs, Expr > > fabs(const GradientExpression< Expr > &u)
virtual void WorkSpaceDim(integer *piNumRows, integer *piNumCols) const
virtual doublereal dGetP(const doublereal &dVar) const
unsigned int iGetNumPrivData(void) const
void AfterPredict(VectorHandler &X, VectorHandler &XP)
virtual void PutRowIndex(integer iSubRow, integer iRow)=0
const doublereal & dGetCoef(integer iRow, integer iCol) const
void SetValue(DataManager *pDM, VectorHandler &X, VectorHandler &XP, SimulationEntity::Hints *ph)
void AfterConvergence(const VectorHandler &X, const VectorHandler &XP)
SubVectorHandler & InitialAssRes(SubVectorHandler &WorkVec, const VectorHandler &XCurr)
VariableSubMatrixHandler & AssJac(VariableSubMatrixHandler &WorkMat, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
unsigned int iGetPrivDataIdx(const char *s) const
DataManager::ElemContainerType::const_iterator begin(Elem::Type t) const
GradientExpression< UnaryExpr< FuncLog, Expr > > log(const GradientExpression< Expr > &u)
virtual bool IsKeyWord(const char *sKeyWord)
std::ostream & Loadable(void) const
SubVectorHandler & InitialAssRes(SubVectorHandler &WorkVec, const VectorHandler &XCurr)
long GetCurrentStep(void) const
doublereal copysign(doublereal x, doublereal y)
VariableSubMatrixHandler & AssJac(VariableSubMatrixHandler &WorkMat, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
doublereal dGetPrivData(unsigned int i) const
virtual unsigned int iGetInitialNumDof(void) const
std::vector< std::vector< int > > FintSignCk
virtual integer iGetFirstMomentumIndex(void) const =0
virtual integer iGetFirstPositionIndex(void) const
virtual const Vec3 & GetWCurr(void) const
void SetValue(DataManager *pDM, VectorHandler &X, VectorHandler &XP, SimulationEntity::Hints *ph)
void GetConnectedNodes(std::vector< const Node * > &connectedNodes) const
virtual DofOrder::Order GetDofType(unsigned int i) const
DotTraits< VectorExprLhs, VectorExprRhs, N_rows, N_rows >::ExpressionType Dot(const VectorExpression< VectorExprLhs, N_rows > &u, const VectorExpression< VectorExprRhs, N_rows > &v)
virtual void InitialWorkSpaceDim(integer *piNumRows, integer *piNumCols) const
int sign(const doublereal x)
doublereal CapLoop(doublereal Xuncapped) const
bool IsOpen(int out) const
std::vector< Elem * > pWheelsE
#define ASSERT(expression)
int iGetNumConnectedNodes(void) const
virtual void InitialWorkSpaceDim(integer *piNumRows, integer *piNumCols) const
GradientExpression< UnaryExpr< FuncSqrt, Expr > > sqrt(const GradientExpression< Expr > &u)
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 Add(integer iRow, const Vec3 &v)
virtual void OutputPrepare(OutputHandler &OH)
virtual void ResizeReset(integer, integer)
virtual doublereal dGetPrivData(unsigned int i) const
virtual doublereal dGet(const doublereal &dVar) const =0
virtual void Output(OutputHandler &OH) const
Vec3 GetVecRel(const ReferenceFrame &rf)
virtual std::string GetString(const std::string &sDefVal)
void PutRowIndex(integer iSubRow, integer iRow)
doublereal dGetPrivData(unsigned int i) const
doublereal sec(doublereal x) const
const doublereal * pGetVec(void) const
std::ostream & GetLogFile(void) const
bool SetUDE(const std::string &s, UserDefinedElemRead *rude)
TimeStep(unsigned uLabel, const DofOwner *pDO, DataManager *pDM, MBDynParser &HP)
void Set(const DriveCaller *pDC)
doublereal dGet(const doublereal &dVar) const
std::ostream & Restart(std::ostream &out) const
int module_init(const char *module_name, void *pdm, void *php)
This function registers our user defined element for the math parser.
std::ostream & Restart(std::ostream &out) const
virtual const Vec3 & GetVCurr(void) const
DriveCaller * GetDriveCaller(bool bDeferred=false)
VariableSubMatrixHandler & InitialAssJac(VariableSubMatrixHandler &WorkMat, const VectorHandler &XCurr)
unsigned int iGetPrivDataIdx(const char *s) const
virtual void SetOutputFlag(flag f=flag(1))
virtual void WorkSpaceDim(integer *piNumRows, integer *piNumCols) const
static doublereal buf[BUFSIZE]
virtual integer iGetFirstIndex(void) const
int iGetNumConnectedNodes(void) const
VariableSubMatrixHandler & InitialAssJac(VariableSubMatrixHandler &WorkMat, const VectorHandler &XCurr)
GradientExpression< BinaryExpr< FuncAtan2, LhsExpr, RhsExpr > > atan2(const GradientExpression< LhsExpr > &u, const GradientExpression< RhsExpr > &v)
virtual void Output(OutputHandler &OH) const
virtual void SetInitialValue(VectorHandler &XCurr)
static std::stack< const HighParser * > pHP
GradientExpression< UnaryExpr< FuncTan, Expr > > tan(const GradientExpression< Expr > &u)
virtual unsigned int iGetInitialNumDof(void) const
unsigned int GetLabel(void) const
Node * ReadNode(MBDynParser &HP, Node::Type type) const
DataManager::ElemContainerType::const_iterator end(Elem::Type t) const
virtual Vec3 GetVec3(void)
virtual unsigned int iGetNumDof(void) const
virtual void Resize(integer iNewSize)=0
SubVectorHandler & AssRes(SubVectorHandler &WorkVec, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
bool UseText(int out) const
virtual doublereal GetReal(const doublereal &dDefval=0.0)