77 if (dDot <= std::numeric_limits<doublereal>::epsilon()) {
78 silent_cerr(
"Rod(" <<
GetLabel() <<
"): "
79 "initial length must be non-null" << std::endl);
86 ASSERT(dLength > std::numeric_limits<doublereal>::epsilon());
117 return pGetConstLaw()->Restart(out) <<
';' << std::endl;
128 if (dCross <= std::numeric_limits<doublereal>::epsilon()) {
129 silent_cerr(
"Rod(" <<
GetLabel() <<
"): "
146 WorkMat.
Add(1, 1, K);
147 WorkMat.
Add(4, 4, K);
150 WorkMat.
Sub(1, 4, K);
151 WorkMat.
Sub(4, 1, K);
162 if (dCross <= std::numeric_limits<doublereal>::epsilon()) {
163 silent_cerr(
"Rod(" <<
GetLabel() <<
"): "
177 bool ChangeJac(
false);
204 DEBUGCOUT(
"Entering Rod::AssJac()" << std::endl);
221 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
224 WM.
PutRowIndex(3 + iCnt, iNode2FirstMomIndex + iCnt);
225 WM.
PutColIndex(3 + iCnt, iNode2FirstPosIndex + iCnt);
240 DEBUGCOUT(
"Entering Rod::AssMats()" << std::endl);
258 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
261 WMA.
PutRowIndex(3 + iCnt, iNode2FirstMomIndex + iCnt);
262 WMA.
PutColIndex(3 + iCnt, iNode2FirstPosIndex + iCnt);
275 DEBUGCOUT(
"Entering Rod::AssRes()" << std::endl);
288 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
289 WorkVec.
PutRowIndex(iCnt, iNode1FirstMomIndex + iCnt);
290 WorkVec.
PutRowIndex(3 + iCnt, iNode2FirstMomIndex + iCnt);
308 Var_dElle = OH.CreateVar<
doublereal>(name +
"l",
"m",
309 "length of the element");
310 Var_dEllePrime = OH.CreateVar<
doublereal>(name +
"lP",
"m/2",
311 "lengthening velocity of the element");
312 Var_v = OH.CreateVar<
Vec3>(name +
"v",
"m",
313 "direction unit vector");
323 ASSERT(
dElle > std::numeric_limits<doublereal>::epsilon());
347 std::ostream& out = OH.
Joints();
360 DEBUGCOUT(
"Entering Rod::InitialAssJac()" << std::endl);
375 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
378 WM.
PutRowIndex(3 + iCnt, iNode2FirstPosIndex + iCnt);
379 WM.
PutColIndex(3 + iCnt, iNode2FirstPosIndex + iCnt);
392 DEBUGCOUT(
"Entering Rod::InitialAssRes()" << std::endl);
405 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
406 WorkVec.
PutRowIndex(iCnt, iNode1FirstPosIndex + iCnt);
407 WorkVec.
PutRowIndex(3 + iCnt, iNode2FirstPosIndex + iCnt);
431 return AssJac(WorkMat, 1., XCurr, XCurr);
442 DEBUGCOUT(
"Entering Rod::AssRes()" << std::endl);
447 return AssRes(WorkVec, 1., XCurr, XPrimeCurr);
477 if (strcmp(s,
"F") == 0) {
481 if (strcmp(s,
"L") == 0) {
485 if (strcmp(s,
"LPrime") == 0) {
489 size_t l =
STRLENOF(
"constitutiveLaw.");
490 if (strncmp(s,
"constitutiveLaw.", l) == 0) {
533 Rod(uL, pDO, pCL, pN1, pN2, dLength, fOut)
557 DEBUGCOUT(
"Entering ViscoElasticRod::AssJac()" << std::endl);
574 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
577 WM.
PutRowIndex(3 + iCnt, iNode2FirstMomIndex + iCnt);
578 WM.
PutColIndex(3 + iCnt, iNode2FirstPosIndex + iCnt);
586 if (dCross <= std::numeric_limits<doublereal>::epsilon()) {
587 silent_cerr(
"ViscoElasticRod(" <<
GetLabel() <<
"): "
605 +
v.
Tens(
v*((dFDE*dCoef+dFDEPrime)/(
dL0*dCross)) )
606 +
v.
Tens(
v.
Cross( vPrime.Cross(
v*((dFDEPrime*dCoef)/(
dL0*dCross*dCross)) ) ) ));
625 DEBUGCOUT(
"Entering ViscoElasticRod::AssRes()" << std::endl);
638 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
639 WorkVec.
PutRowIndex(iCnt, iNode1FirstMomIndex + iCnt);
640 WorkVec.
PutRowIndex(3 + iCnt, iNode2FirstMomIndex + iCnt);
648 if (dCross <= std::numeric_limits<doublereal>::epsilon()) {
649 silent_cerr(
"ViscoElasticRod(" <<
GetLabel() <<
"): "
666 bool ChangeJac(
false);
692 DEBUGCOUT(
"Entering ViscoElasticRod::InitialAssJac()" << std::endl);
704 integer iNode1FirstVelIndex = iNode1FirstPosIndex+6;
706 integer iNode2FirstVelIndex = iNode2FirstPosIndex+6;
709 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
724 if (dCross <= std::numeric_limits<doublereal>::epsilon()) {
725 silent_cerr(
"ViscoElasticRod(" <<
GetLabel() <<
"): "
751 WM.
Add(1, 4, KPrime);
752 WM.
Add(4, 10, KPrime);
758 WM.
Sub(1, 10, KPrime);
759 WM.
Sub(4, 4, KPrime);
768 DEBUGCOUT(
"Entering ViscoElasticRod::InitialAssRes()" << std::endl);
781 for (
int iCnt = 1; iCnt <= 3; iCnt++) {
782 WorkVec.
PutRowIndex(iCnt, iNode1FirstPosIndex + iCnt);
783 WorkVec.
PutRowIndex(3 + iCnt, iNode2FirstPosIndex + iCnt);
791 if (dCross <= std::numeric_limits<doublereal>::epsilon()) {
792 silent_cerr(
"ViscoElasticRod(" <<
GetLabel() <<
"): "
837 Rod(uL, pDO, pCL, pN1, pN2, dLength, fOut,
true),
853 if (dDot <= std::numeric_limits<doublereal>::epsilon()) {
854 silent_cerr(
"RodWithOffset(" <<
GetLabel() <<
"): "
855 "inital length must be non-null" << std::endl);
861 ASSERT(dLength > std::numeric_limits<doublereal>::epsilon());
876 "position, reference, node, ",
f1.
Write(out,
", ") <<
", "
878 "position, reference, node, ",
f2.
Write(out,
", ") <<
", "
880 return pGetConstLaw()->Restart(out) <<
';' << std::endl;
896 DEBUGCOUT(
"Entering RodWithOffset::AssJac()" << std::endl);
913 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
916 WM.
PutRowIndex(6 + iCnt, iNode2FirstMomIndex + iCnt);
917 WM.
PutColIndex(6 + iCnt, iNode2FirstPosIndex + iCnt);
920 const Mat3x3& R1(dynamic_cast<const StructNode *>(
pNode1)->GetRRef());
921 const Mat3x3& R2(dynamic_cast<const StructNode *>(
pNode2)->GetRRef());
927 const Vec3& Omega1(dynamic_cast<const StructNode *>(
pNode1)->GetWRef());
928 const Vec3& Omega2(dynamic_cast<const StructNode *>(
pNode2)->GetWRef());
942 if (dFDEPrime != 0.) {
943 K +=
v.
Tens(vPrime*(dCoef*dFDEPrime/(dElle*dElle*
dL0)));
946 for (
unsigned iCnt = 1; iCnt <= 3; iCnt++) {
951 if (dFDEPrime != 0.) {
952 KPrime =
v.
Tens(
v*((dFDEPrime)/(
dL0*dElle*dElle)));
957 if (dFDEPrime != 0.) {
961 WM.
Add(6 + 1, 6 + 1, Tmp1);
965 WM.
Add(3 + 1, 1, Tmp2);
966 WM.
Sub(3 + 1, 6 + 1, Tmp2);
969 Tmp2 = f2Tmp.
Cross(Tmp1);
970 WM.
Add(9 + 1, 6 + 1, Tmp2);
971 WM.
Sub(9 + 1, 1, Tmp2);
974 WM.
Sub(1, 6 + 1, Tmp1);
975 WM.
Sub(6 + 1, 1, Tmp1);
979 if (dFDEPrime != 0.) {
982 WM.
Add(1, 3 + 1, Tmp3);
983 WM.
Sub(6 + 1, 3 + 1, Tmp3);
987 WM.
Add(3 + 1, 3 + 1, Tmp2);
988 Tmp2 = f2Tmp.
Cross(Tmp3);
989 WM.
Sub(9 + 1, 3 + 1, Tmp2);
992 Tmp3 = Tmp1*Mat3x3(
MatCross, -f2Tmp);
993 if (dFDEPrime != 0.) {
996 WM.
Add(6 + 1, 9 + 1, Tmp3);
997 WM.
Sub(1, 9 + 1, Tmp3);
1001 WM.
Add(9 + 1, 9 + 1, Tmp2);
1002 Tmp2 = f1Tmp.
Cross(Tmp3);
1003 WM.
Sub(3 + 1, 9 + 1, Tmp2);
1014 DEBUGCOUT(
"RodWithOffset::AssRes()" << std::endl);
1027 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
1028 WorkVec.
PutRowIndex(iCnt, iNode1FirstMomIndex + iCnt);
1029 WorkVec.
PutRowIndex(6 + iCnt, iNode2FirstMomIndex + iCnt);
1040 DEBUGCOUT(
"RodWithOffset::AssVec()" << std::endl);
1043 const Mat3x3& R1(dynamic_cast<const StructNode *>(
pNode1)->GetRCurr());
1044 const Mat3x3& R2(dynamic_cast<const StructNode *>(
pNode2)->GetRCurr());
1052 const Vec3& Omega1(dynamic_cast<const StructNode *>(
pNode1)->GetWCurr());
1053 const Vec3& Omega2(dynamic_cast<const StructNode *>(
pNode2)->GetWCurr());
1056 v = x2 + f2Tmp - x1 - f1Tmp;
1060 if (dCross <= std::numeric_limits<doublereal>::epsilon()) {
1061 silent_cerr(
"RodWithOffset(" <<
GetLabel() <<
"): "
1074 Vec3 vPrime(v2 + Omega2.
Cross(f2Tmp) - v1 - Omega1.
Cross(f1Tmp));
1078 bool ChangeJac(
false);
1092 WorkVec.
Add(3 + 1, f1Tmp.Cross(F));
1093 WorkVec.
Sub(6 + 1, F);
1094 WorkVec.
Sub(9 + 1, f2Tmp.
Cross(F));
1106 DEBUGCOUT(
"Entering RodWithOffset::InitialAssJac()" << std::endl);
1118 integer iNode1FirstVelIndex = iNode1FirstPosIndex + 6;
1120 integer iNode2FirstVelIndex = iNode2FirstPosIndex + 6;
1123 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
1126 WM.
PutColIndex(6 + iCnt, iNode1FirstVelIndex + iCnt);
1128 WM.
PutRowIndex(6 + iCnt, iNode2FirstPosIndex + iCnt);
1129 WM.
PutColIndex(12 + iCnt, iNode2FirstPosIndex + iCnt);
1130 WM.
PutColIndex(18 + iCnt, iNode2FirstVelIndex + iCnt);
1133 const Mat3x3& R1(dynamic_cast<const StructNode *>(
pNode1)->GetRRef());
1134 const Mat3x3& R2(dynamic_cast<const StructNode *>(
pNode2)->GetRRef());
1140 const Vec3& Omega1(dynamic_cast<const StructNode *>(
pNode1)->GetWRef());
1141 const Vec3& Omega2(dynamic_cast<const StructNode *>(
pNode2)->GetWRef());
1144 Vec3 vPrime(v2 + Omega2.
Cross(f2Tmp) - v1 - Omega1.
Cross(f1Tmp));
1155 if (dFDEPrime != 0.) {
1156 K +=
v.
Tens(vPrime*(dFDEPrime/(dElle*dElle*
dL0)));
1159 for (
unsigned iCnt = 1; iCnt <= 3; iCnt++) {
1164 if (dFDEPrime != 0.) {
1165 KPrime =
v.
Tens(
v*((dFDEPrime)/(
dL0*dElle*dElle)));
1170 WM.
Add(6 + 1, 12 + 1, K);
1174 WM.
Add(3 + 1, 1, Tmp2);
1175 WM.
Sub(3 + 1, 12 + 1, Tmp2);
1178 Tmp2 = f2Tmp.
Cross(K);
1179 WM.
Add(9 + 1, 12 + 1, Tmp2);
1180 WM.
Sub(9 + 1, 1, Tmp2);
1183 WM.
Sub(1, 12 + 1, K);
1184 WM.
Sub(6 + 1, 1, K);
1186 if (dFDEPrime != 0.) {
1188 WM.
Add(1, 6 + 1, KPrime);
1189 WM.
Add(6 + 1, 18 + 1, KPrime);
1192 Tmp2 = f1Tmp.
Cross(KPrime);
1193 WM.
Add(3 + 1, 6 + 1, Tmp2);
1194 WM.
Sub(3 + 1, 18 + 1, Tmp2);
1197 Tmp2 = f2Tmp.
Cross(KPrime);
1198 WM.
Add(9 + 1, 18 + 1, Tmp2);
1199 WM.
Sub(9 + 1, 6 + 1, Tmp2);
1202 WM.
Sub(1, 18 + 1, KPrime);
1203 WM.
Sub(6 + 1, 6 + 1, KPrime);
1208 if (dFDEPrime != 0.) {
1211 WM.
Add(1, 3 + 1, Tmp3);
1212 WM.
Sub(6 + 1, 3 + 1, Tmp3);
1216 WM.
Add(3 + 1, 3 + 1, Tmp2);
1217 Tmp2 = f2Tmp.
Cross(Tmp3);
1218 WM.
Sub(9 + 1, 3 + 1, Tmp2);
1222 if (dFDEPrime != 0.) {
1225 WM.
Add(6 + 1, 15 + 1, Tmp3);
1226 WM.
Sub(1, 15 + 1, Tmp3);
1230 WM.
Add(9 + 1, 15 + 1, Tmp2);
1231 Tmp2 = f1Tmp.
Cross(Tmp3);
1232 WM.
Sub(3 + 1, 15 + 1, Tmp2);
1234 if (dFDEPrime != 0.) {
1236 Tmp3 = KPrime*Mat3x3(
MatCross, -f1Tmp);
1237 WM.
Add(1, 9 + 1, Tmp3);
1238 WM.
Sub(6 + 1, 9 + 1, Tmp3);
1241 Tmp2 = f1Tmp.
Cross(Tmp3);
1242 WM.
Add(3 + 1, 9 + 1, Tmp2);
1243 Tmp2 = f2Tmp.
Cross(Tmp3);
1244 WM.
Sub(9 + 1, 9 + 1, Tmp2);
1247 Tmp3 = KPrime*Mat3x3(
MatCross, -f2Tmp);
1248 WM.
Add(6 + 1, 21 + 1, Tmp3);
1249 WM.
Sub(1, 21 + 1, Tmp3);
1252 Tmp2 = f2Tmp.
Cross(Tmp3);
1253 WM.
Add(9 + 1, 21 + 1, Tmp2);
1254 Tmp2 = f1Tmp.
Cross(Tmp3);
1255 WM.
Sub(3 + 1, 21 + 1, Tmp2);
1266 DEBUGCOUT(
"RodWithOffset::InitialAssRes()" << std::endl);
1279 for (
int iCnt = 1; iCnt <= 6; iCnt++) {
1280 WorkVec.
PutRowIndex(iCnt, iNode1FirstPosIndex + iCnt);
1281 WorkVec.
PutRowIndex(6 + iCnt, iNode2FirstPosIndex + iCnt);
virtual doublereal dCalcEpsilon(void)
void PutColIndex(integer iSubCol, integer iCol)
virtual void AssMats(VariableSubMatrixHandler &WorkMatA, VariableSubMatrixHandler &WorkMatB, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
const Vec3 Zero3(0., 0., 0.)
Vec3 Cross(const Vec3 &v) const
std::ostream & Write(std::ostream &out, const char *sFill=" ") const
void Update(const VectorHandler &XCurr, InverseDynamics::Order iOrder=InverseDynamics::INVERSE_DYNAMICS)
virtual bool bToBeOutput(void) const
ConstitutiveLaw< T, Tder > * pGetConstLaw(void) const
#define MBDYN_EXCEPT_ARGS
virtual void ResizeReset(integer)
ViscoElasticRod(unsigned int uL, const DofOwner *pDO, const ConstitutiveLaw1D *pCL, const StructDispNode *pN1, const StructDispNode *pN2, doublereal dLength, flag fOut)
const MatCross_Manip MatCross
bool UseNetCDF(int out) const
FullSubMatrixHandler & SetFull(void)
void AssMat(FullSubMatrixHandler &WorkMat, doublereal dCoef=1.)
virtual Node::Type GetNodeType(void) const
virtual void InitialWorkSpaceDim(integer *piNumRows, integer *piNumCols) const
doublereal Dot(const Vec3 &v) const
bool bIsErgonomy(void) const
void Add(integer iRow, integer iCol, const Vec3 &v)
virtual unsigned int iGetPrivDataIdx(const char *s) const
virtual VariableSubMatrixHandler & InitialAssJac(VariableSubMatrixHandler &WorkMat, const VectorHandler &XCurr)
virtual ~RodWithOffset(void)
void AssVec(SubVectorHandler &WorkVec)
void AssVec(SubVectorHandler &WorkVec)
virtual void Sub(integer iRow, const Vec3 &v)
const Tder & GetFDE(void) const
virtual unsigned int iGetNumPrivData(void) const
virtual std::ostream & Restart(std::ostream &out) const
virtual void WorkSpaceDim(integer *piNumRows, integer *piNumCols) const
virtual SubVectorHandler & AssRes(SubVectorHandler &WorkVec, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
virtual void PutRowIndex(integer iSubRow, integer iRow)=0
const StructDispNode * pNode2
virtual SubVectorHandler & InitialAssRes(SubVectorHandler &WorkVec, const VectorHandler &XCurr)
virtual void AfterConvergence(const VectorHandler &X, const VectorHandler &XP)
virtual SubVectorHandler & InitialAssRes(SubVectorHandler &WorkVec, const VectorHandler &XCurr)
virtual std::ostream & Restart(std::ostream &out) const
virtual std::ostream & OutputAppend(std::ostream &out) const
virtual void AfterConvergence(const VectorHandler &X, const VectorHandler &XP)
long GetCurrentStep(void) const
virtual SubVectorHandler & AssRes(SubVectorHandler &WorkVec, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
virtual bool bInverseDynamics(void) const
virtual SubVectorHandler & AssRes(SubVectorHandler &WorkVec, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
virtual unsigned int iGetNumPrivData(void) const
virtual VariableSubMatrixHandler & InitialAssJac(VariableSubMatrixHandler &WorkMat, const VectorHandler &XCurr)
RodWithOffset(unsigned int uL, const DofOwner *pDO, const ConstitutiveLaw1D *pCL, const StructNode *pN1, const StructNode *pN2, const Vec3 &f1Tmp, const Vec3 &f2Tmp, doublereal dLength, flag fOut)
virtual integer iGetFirstMomentumIndex(void) const =0
virtual integer iGetFirstPositionIndex(void) const
virtual std::ostream & Restart(std::ostream &out) const
std::ostream & Joints(void) const
void AfterConvergence(const T &Eps, const T &EpsPrime=mb_zero< T >())
#define ASSERT(expression)
Mat3x3 Tens(const Vec3 &v) const
virtual void WorkSpaceDim(integer *piNumRows, integer *piNumCols) const
GradientExpression< UnaryExpr< FuncSqrt, Expr > > sqrt(const GradientExpression< Expr > &u)
virtual void InitialWorkSpaceDim(integer *piNumRows, integer *piNumCols) const
virtual void OutputPrepare_int(const std::string &type, OutputHandler &OH, std::string &name)
virtual SubVectorHandler & InitialAssRes(SubVectorHandler &WorkVec, const VectorHandler &XCurr)
virtual const Vec3 & GetXCurr(void) const
virtual void Add(integer iRow, const Vec3 &v)
virtual void ResizeReset(integer, integer)
virtual VariableSubMatrixHandler & AssJac(VariableSubMatrixHandler &WorkMat, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
Rod(unsigned int uL, const DofOwner *pDO, const ConstitutiveLaw1D *pCL, const StructDispNode *pN1, const StructDispNode *pN2, doublereal dLength, flag fOut, bool bHasOffsets=0)
virtual ~ViscoElasticRod(void)
virtual VariableSubMatrixHandler & AssJac(VariableSubMatrixHandler &WorkMat, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
virtual doublereal dGetPrivData(unsigned int i) const
virtual void InitialWorkSpaceDim(integer *piNumRows, integer *piNumCols) const
const MatCrossCross_Manip MatCrossCross
void PutRowIndex(integer iSubRow, integer iRow)
const T & GetF(void) const
const doublereal * pGetVec(void) const
virtual void WorkSpaceDim(integer *piNumRows, integer *piNumCols) const =0
virtual const Vec3 & GetVCurr(void) const
void Sub(integer iRow, integer iCol, const Vec3 &v)
virtual void AfterConvergence(const VectorHandler &X, const VectorHandler &XP)
virtual void OutputPrepare(OutputHandler &OH)
virtual VariableSubMatrixHandler & InitialAssJac(VariableSubMatrixHandler &WorkMat, const VectorHandler &XCurr)
const StructDispNode * pNode1
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 doublereal dGetPrivData(unsigned int i) const
virtual VariableSubMatrixHandler & AssJac(VariableSubMatrixHandler &WorkMat, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
virtual void Output(OutputHandler &OH) const
virtual unsigned int iGetPrivDataIdx(const char *s) const