MBDyn-1.7.3
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups
UniversalHingeJoint Class Reference

#include <univj.h>

Inheritance diagram for UniversalHingeJoint:
Collaboration diagram for UniversalHingeJoint:

Public Member Functions

 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)
 
 ~UniversalHingeJoint (void)
 
virtual std::ostream & Restart (std::ostream &out) const
 
virtual Joint::Type GetJointType (void) const
 
virtual unsigned int iGetNumDof (void) const
 
DofOrder::Order GetDofType (unsigned int i) const
 
void WorkSpaceDim (integer *piNumRows, integer *piNumCols) const
 
VariableSubMatrixHandlerAssJac (VariableSubMatrixHandler &WorkMat, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
 
SubVectorHandlerAssRes (SubVectorHandler &WorkVec, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
 
void Output (OutputHandler &OH) const
 
virtual unsigned int iGetInitialNumDof (void) const
 
virtual void InitialWorkSpaceDim (integer *piNumRows, integer *piNumCols) const
 
VariableSubMatrixHandlerInitialAssJac (VariableSubMatrixHandler &WorkMat, const VectorHandler &XCurr)
 
SubVectorHandlerInitialAssRes (SubVectorHandler &WorkVec, const VectorHandler &XCurr)
 
virtual void GetConnectedNodes (std::vector< const Node * > &connectedNodes) const
 
- Public Member Functions inherited from Elem
 Elem (unsigned int uL, flag fOut)
 
virtual ~Elem (void)
 
virtual std::ostream & DescribeDof (std::ostream &out, const char *prefix="", bool bInitial=false) const
 
virtual void DescribeDof (std::vector< std::string > &desc, bool bInitial=false, int i=-1) const
 
virtual std::ostream & DescribeEq (std::ostream &out, const char *prefix="", bool bInitial=false) const
 
virtual void DescribeEq (std::vector< std::string > &desc, bool bInitial=false, int i=-1) const
 
virtual void AssMats (VariableSubMatrixHandler &WorkMatA, VariableSubMatrixHandler &WorkMatB, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
 
virtual bool bInverseDynamics (void) const
 
void SetInverseDynamicsFlags (unsigned uIDF)
 
unsigned GetInverseDynamicsFlags (void) const
 
bool bIsErgonomy (void) const
 
bool bIsRightHandSide (void) const
 
virtual VariableSubMatrixHandlerAssJac (VariableSubMatrixHandler &WorkMat, const VectorHandler &XCurr)
 
virtual SubVectorHandlerAssRes (SubVectorHandler &WorkVec, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr, const VectorHandler &XPrimePrimeCurr, InverseDynamics::Order iOrder=InverseDynamics::INVERSE_DYNAMICS)
 
virtual int GetNumConnectedNodes (void) const
 
- Public Member Functions inherited from WithLabel
 WithLabel (unsigned int uL=0, const std::string &sN="")
 
virtual ~WithLabel (void)
 
void PutLabel (unsigned int uL)
 
void PutName (const std::string &sN)
 
unsigned int GetLabel (void) const
 
const std::string & GetName (void) const
 
- Public Member Functions inherited from SimulationEntity
 SimulationEntity (void)
 
virtual ~SimulationEntity (void)
 
virtual bool bIsValidIndex (unsigned int i) const
 
virtual DofOrder::Order GetEqType (unsigned int i) const
 
virtual HintParseHint (DataManager *pDM, const char *s) const
 
virtual void BeforePredict (VectorHandler &, VectorHandler &, VectorHandler &, VectorHandler &) const
 
virtual void AfterPredict (VectorHandler &X, VectorHandler &XP)
 
virtual void Update (const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
 
virtual void DerivativesUpdate (const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
 
virtual void AfterConvergence (const VectorHandler &X, const VectorHandler &XP)
 
virtual void AfterConvergence (const VectorHandler &X, const VectorHandler &XP, const VectorHandler &XPP)
 
virtual unsigned int iGetNumPrivData (void) const
 
virtual unsigned int iGetPrivDataIdx (const char *s) const
 
virtual doublereal dGetPrivData (unsigned int i) const
 
virtual std::ostream & OutputAppend (std::ostream &out) const
 
virtual void ReadInitialState (MBDynParser &HP)
 
- Public Member Functions inherited from ToBeOutput
 ToBeOutput (flag fOut=fDefaultOut)
 
virtual ~ToBeOutput (void)
 
virtual void OutputPrepare (OutputHandler &OH)
 
virtual void Output (OutputHandler &OH, const VectorHandler &X, const VectorHandler &XP) const
 
virtual flag fToBeOutput (void) const
 
virtual bool bToBeOutput (void) const
 
virtual void SetOutputFlag (flag f=flag(1))
 
- Public Member Functions inherited from Joint
 Joint (unsigned int uL, const DofOwner *pD, flag fOut)
 
virtual ~Joint (void)
 
virtual Elem::Type GetElemType (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
 
virtual void SetInitialValue (VectorHandler &)
 
virtual void SetValue (DataManager *pDM, VectorHandler &, VectorHandler &, SimulationEntity::Hints *ph=0)
 
virtual void Update (const VectorHandler &XCurr, InverseDynamics::Order iOrder=InverseDynamics::INVERSE_DYNAMICS)
 
bool bIsPrescribedMotion (void) const
 
bool bIsTorque (void) const
 
- Public Member Functions inherited from ElemGravityOwner
 ElemGravityOwner (unsigned int uL, flag fOut)
 
virtual ~ElemGravityOwner (void)
 
virtual doublereal dGetM (void) const
 
Vec3 GetS (void) const
 
Mat3x3 GetJ (void) const
 
Vec3 GetB (void) const
 
Vec3 GetG (void) const
 
- Public Member Functions inherited from GravityOwner
 GravityOwner (void)
 
virtual ~GravityOwner (void)
 
void PutGravity (const Gravity *pG)
 
virtual bool bGetGravity (const Vec3 &X, Vec3 &Acc) const
 
- Public Member Functions inherited from ElemWithDofs
 ElemWithDofs (unsigned int uL, const DofOwner *pDO, flag fOut)
 
virtual ~ElemWithDofs (void)
 
- Public Member Functions inherited from DofOwnerOwner
 DofOwnerOwner (const DofOwner *pDO)
 
virtual ~DofOwnerOwner ()
 
virtual const DofOwnerpGetDofOwner (void) const
 
virtual integer iGetFirstIndex (void) const
 
- Public Member Functions inherited from InitialAssemblyElem
 InitialAssemblyElem (unsigned int uL, flag fOut)
 
virtual ~InitialAssemblyElem (void)
 
- Public Member Functions inherited from SubjectToInitialAssembly
 SubjectToInitialAssembly (void)
 
virtual ~SubjectToInitialAssembly (void)
 

Private Attributes

const StructNodepNode1
 
const StructNodepNode2
 
Vec3 d1
 
Mat3x3 R1h
 
Vec3 d2
 
Mat3x3 R2h
 
Vec3 F
 
doublereal dM
 

Additional Inherited Members

- Public Types inherited from Elem
enum  Type {
  UNKNOWN = -1, AIRPROPERTIES = 0, INDUCEDVELOCITY, AUTOMATICSTRUCTURAL,
  GRAVITY, BODY, JOINT, JOINT_REGULARIZATION,
  BEAM, PLATE, FORCE, INERTIA,
  ELECTRICBULK, ELECTRIC, THERMAL, HYDRAULIC,
  BULK, LOADABLE, DRIVEN, EXTERNAL,
  AEROMODAL, AERODYNAMIC, GENEL, SOCKETSTREAM_OUTPUT,
  RTAI_OUTPUT = SOCKETSTREAM_OUTPUT, LASTELEMTYPE
}
 
- Public Types inherited from SimulationEntity
typedef std::vector< Hint * > Hints
 
- Public Types inherited from ToBeOutput
enum  { OUTPUT = 0x1U, OUTPUT_MASK = 0xFU, OUTPUT_PRIVATE = 0x10U, OUTPUT_PRIVATE_MASK = ~OUTPUT_MASK }
 
- Public Types inherited from Joint
enum  Type {
  UNKNOWN = -1, DISTANCE = 0, DISTANCEWITHOFFSET, CLAMP,
  SPHERICALHINGE, PIN, UNIVERSALHINGE, UNIVERSALROTATION,
  UNIVERSALPIN, PLANEHINGE, PLANEROTATION, PLANEPIN,
  AXIALROTATION, PLANEDISP, PLANEDISPPIN, INPLANE,
  INPLANECONTACT, J_INLINE, ROD, RODBEZIER,
  DEFORMABLEHINGE, DEFORMABLEDISPJOINT, DEFORMABLEJOINT, DEFORMABLEAXIALJOINT,
  VISCOUSBODY, LINEARVELOCITY, ANGULARVELOCITY, LINEARACCELERATION,
  ANGULARACCELERATION, PRISMATIC, DRIVEHINGE, DRIVEDISP,
  DRIVEDISPPIN, IMPOSEDORIENTATION, IMPOSEDDISP, IMPOSEDDISPPIN,
  IMPOSEDKINEMATICS, BEAMSLIDER, BRAKE, GIMBAL,
  POINT_SURFACE_CONTACT, TOTALJOINT, TOTALPINJOINT, TOTALEQUATION,
  TOTALREACTION, MODAL, SCREWJOINT, LASTJOINTTYPE
}
 
- Protected Member Functions inherited from Joint
virtual void OutputPrepare_int (const std::string &type, OutputHandler &OH, std::string &name)
 
- Protected Member Functions inherited from ElemGravityOwner
virtual Vec3 GetS_int (void) const
 
virtual Mat3x3 GetJ_int (void) const
 
virtual Vec3 GetB_int (void) const
 
virtual Vec3 GetG_int (void) const
 
- Protected Attributes inherited from WithLabel
unsigned int uLabel
 
std::string sName
 
- Protected Attributes inherited from ToBeOutput
flag fOutput
 
- Protected Attributes inherited from GravityOwner
GravitypGravity
 

Detailed Description

Definition at line 43 of file univj.h.

Constructor & Destructor Documentation

UniversalHingeJoint::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 
)

Definition at line 44 of file univj.cc.

References NO_OP.

53 : Elem(uL, fOut),
54 Joint(uL, pDO, fOut),
55 pNode1(pN1), pNode2(pN2),
56 d1(dTmp1), R1h(R1hTmp), d2(dTmp2), R2h(R2hTmp), F(Zero3), dM(0.)
57 {
58  NO_OP;
59 }
const Vec3 Zero3(0., 0., 0.)
Joint(unsigned int uL, const DofOwner *pD, flag fOut)
Definition: joint.cc:83
const StructNode * pNode2
Definition: univj.h:49
#define NO_OP
Definition: myassert.h:74
const StructNode * pNode1
Definition: univj.h:48
doublereal dM
Definition: univj.h:55
Elem(unsigned int uL, flag fOut)
Definition: elem.cc:41
UniversalHingeJoint::~UniversalHingeJoint ( void  )

Definition at line 63 of file univj.cc.

References NO_OP.

64 {
65  NO_OP;
66 }
#define NO_OP
Definition: myassert.h:74

Member Function Documentation

VariableSubMatrixHandler & UniversalHingeJoint::AssJac ( VariableSubMatrixHandler WorkMat,
doublereal  dCoef,
const VectorHandler XCurr,
const VectorHandler XPrimeCurr 
)
virtual

Implements Elem.

Definition at line 92 of file univj.cc.

References FullSubMatrixHandler::Add(), d1, d2, DEBUGCOUT, dM, F, StructNode::GetRRef(), Mat3x3::GetVec(), DofOwnerOwner::iGetFirstIndex(), StructDispNode::iGetFirstMomentumIndex(), StructDispNode::iGetFirstPositionIndex(), MatCross, MatCrossCross, pNode1, pNode2, FullSubMatrixHandler::PutCoef(), FullSubMatrixHandler::PutColIndex(), FullSubMatrixHandler::PutRowIndex(), R1h, R2h, FullSubMatrixHandler::ResizeReset(), VariableSubMatrixHandler::SetFull(), FullSubMatrixHandler::Sub(), and WorkSpaceDim().

96 {
97  DEBUGCOUT("Entering UniversalHingeJoint::AssJac()" << std::endl);
98 
99  FullSubMatrixHandler& WM = WorkMat.SetFull();
100 
101  /* Ridimensiona la sottomatrice in base alle esigenze */
102  integer iNumRows = 0;
103  integer iNumCols = 0;
104  WorkSpaceDim(&iNumRows, &iNumCols);
105  WM.ResizeReset(iNumRows, iNumCols);
106 
107  /* Recupera gli indici delle varie incognite */
108  integer iNode1FirstPosIndex = pNode1->iGetFirstPositionIndex();
109  integer iNode1FirstMomIndex = pNode1->iGetFirstMomentumIndex();
110  integer iNode2FirstPosIndex = pNode2->iGetFirstPositionIndex();
111  integer iNode2FirstMomIndex = pNode2->iGetFirstMomentumIndex();
112  integer iFirstReactionIndex = iGetFirstIndex();
113 
114  /* Recupera i dati che servono */
115  const Mat3x3& R1(pNode1->GetRRef());
116  const Mat3x3& R2(pNode2->GetRRef());
117  Vec3 d1Tmp(R1*d1);
118  Vec3 d2Tmp(R2*d2);
119 
120  /* Suppongo che le reazioni F, M siano gia' state aggiornate da AssRes;
121  * ricordo che la forza F e' nel sistema globale, mentre la coppia M
122  * e' nel sistema locale ed il terzo termine, M(3), e' nullo in quanto
123  * diretto come l'asse attorno al quale la rotazione e' consentita */
124 
125  /* Setta gli indici delle equazioni */
126  for (int iCnt = 1; iCnt <= 6; iCnt++) {
127  WM.PutRowIndex(iCnt, iNode1FirstMomIndex + iCnt);
128  WM.PutColIndex(iCnt, iNode1FirstPosIndex + iCnt);
129  WM.PutRowIndex(6 + iCnt, iNode2FirstMomIndex + iCnt);
130  WM.PutColIndex(6 + iCnt, iNode2FirstPosIndex + iCnt);
131  }
132 
133  for (int iCnt = 1; iCnt <= 4; iCnt++) {
134  WM.PutRowIndex(12 + iCnt, iFirstReactionIndex + iCnt);
135  WM.PutColIndex(12 + iCnt, iFirstReactionIndex + iCnt);
136  }
137 
138  /* Contributo della forza alle equazioni di equilibrio dei due nodi */
139  for (int iCnt = 1; iCnt <= 3; iCnt++) {
140  WM.PutCoef(iCnt, 12 + iCnt, 1.);
141  WM.PutCoef(6 + iCnt, 12 + iCnt, -1.);
142  }
143 
144  WM.Add(4, 13, Mat3x3(MatCross, d1Tmp));
145  WM.Sub(10, 13, Mat3x3(MatCross, d2Tmp));
146 
147  /* Moltiplica la forza ed il momento per il coefficiente del metodo */
148  Vec3 FTmp(F*dCoef);
149 
150  Vec3 e3a(R1*R1h.GetVec(3));
151  Vec3 e2b(R2*R2h.GetVec(2));
152  Vec3 MTmp = e2b*(dM*dCoef);
153 
154  Mat3x3 MWedgee3aWedge(MatCrossCross, MTmp, e3a);
155  Mat3x3 e3aWedgeMWedge(MatCrossCross, e3a, MTmp);
156 
157  WM.Add(4, 4, Mat3x3(MatCrossCross, FTmp, d1Tmp) - MWedgee3aWedge);
158  WM.Add(4, 10, e3aWedgeMWedge);
159 
160  WM.Add(10, 4, MWedgee3aWedge);
161  WM.Sub(10, 10, Mat3x3(MatCrossCross, FTmp, d2Tmp) + e3aWedgeMWedge);
162 
163  /* Contributo del momento alle equazioni di equilibrio dei nodi */
164  Vec3 Tmp(e2b.Cross(e3a));
165 
166  for (int iCnt = 1; iCnt <= 3; iCnt++) {
167  doublereal d = Tmp(iCnt);
168  WM.PutCoef(3 + iCnt, 16, d);
169  WM.PutCoef(9 + iCnt, 16, -d);
170  }
171 
172  /* Modifica: divido le equazioni di vincolo per dCoef */
173 
174  /* Equazioni di vincolo degli spostamenti */
175  for (int iCnt = 1; iCnt <= 3; iCnt++) {
176  WM.PutCoef(12 + iCnt, iCnt, 1.);
177  WM.PutCoef(12 + iCnt, 6 + iCnt, -1.);
178  }
179 
180  WM.Sub(13, 4, Mat3x3(MatCross, d1Tmp));
181  WM.Add(13, 10, Mat3x3(MatCross, d2Tmp));
182 
183  /* Equazione di vincolo del momento
184  *
185  * Attenzione: bisogna scrivere il vettore trasposto
186  * (Sb[1]^T*(Sa[3]/\))*dCoef
187  * Questo pero' e' uguale a:
188  * (-Sa[3]/\*Sb[1])^T*dCoef,
189  * che puo' essere ulteriormente semplificato:
190  * (Sa[3].Cross(Sb[1])*(-dCoef))^T;
191  */
192 
193  for (int iCnt = 1; iCnt <= 3; iCnt++) {
194  doublereal d = Tmp(iCnt);
195  WM.PutCoef(16, 3 + iCnt, d);
196  WM.PutCoef(16, 9 + iCnt, -d);
197  }
198 
199  return WorkMat;
200 }
void PutColIndex(integer iSubCol, integer iCol)
Definition: submat.h:325
virtual const Mat3x3 & GetRRef(void) const
Definition: strnode.h:1006
Definition: matvec3.h:98
const MatCross_Manip MatCross
Definition: matvec3.cc:639
FullSubMatrixHandler & SetFull(void)
Definition: submat.h:1168
void Add(integer iRow, integer iCol, const Vec3 &v)
Definition: submat.cc:209
void PutCoef(integer iRow, integer iCol, const doublereal &dCoef)
Definition: submat.h:672
const StructNode * pNode2
Definition: univj.h:49
Vec3 GetVec(unsigned short int i) const
Definition: matvec3.h:893
const StructNode * pNode1
Definition: univj.h:48
doublereal dM
Definition: univj.h:55
#define DEBUGCOUT(msg)
Definition: myassert.h:232
virtual integer iGetFirstMomentumIndex(void) const =0
virtual integer iGetFirstPositionIndex(void) const
Definition: strnode.h:452
virtual void ResizeReset(integer, integer)
Definition: submat.cc:182
void WorkSpaceDim(integer *piNumRows, integer *piNumCols) const
Definition: univj.h:84
const MatCrossCross_Manip MatCrossCross
Definition: matvec3.cc:640
void PutRowIndex(integer iSubRow, integer iRow)
Definition: submat.h:311
void Sub(integer iRow, integer iCol, const Vec3 &v)
Definition: submat.cc:215
virtual integer iGetFirstIndex(void) const
Definition: dofown.h:127
double doublereal
Definition: colamd.c:52
long int integer
Definition: colamd.c:51

Here is the call graph for this function:

SubVectorHandler & UniversalHingeJoint::AssRes ( SubVectorHandler WorkVec,
doublereal  dCoef,
const VectorHandler XCurr,
const VectorHandler XPrimeCurr 
)
virtual

Implements Elem.

Definition at line 205 of file univj.cc.

References VectorHandler::Add(), ASSERT, Vec3::Cross(), d1, d2, DEBUGCOUT, dM, F, StructNode::GetRCurr(), Mat3x3::GetVec(), StructDispNode::GetXCurr(), DofOwnerOwner::iGetFirstIndex(), StructDispNode::iGetFirstMomentumIndex(), pNode1, pNode2, VectorHandler::PutCoef(), SubVectorHandler::PutRowIndex(), R1h, R2h, VectorHandler::ResizeReset(), VectorHandler::Sub(), and WorkSpaceDim().

209 {
210  DEBUGCOUT("Entering UniversalHingeJoint::AssRes()" << std::endl);
211 
212  /* Dimensiona e resetta la matrice di lavoro */
213  integer iNumRows = 0;
214  integer iNumCols = 0;
215  WorkSpaceDim(&iNumRows, &iNumCols);
216  WorkVec.ResizeReset(iNumRows);
217 
218  /* Indici */
219  integer iNode1FirstMomIndex = pNode1->iGetFirstMomentumIndex();
220  integer iNode2FirstMomIndex = pNode2->iGetFirstMomentumIndex();
221  integer iFirstReactionIndex = iGetFirstIndex();
222 
223  /* Indici dei nodi */
224  for (int iCnt = 1; iCnt <= 6; iCnt++) {
225  WorkVec.PutRowIndex(iCnt, iNode1FirstMomIndex + iCnt);
226  WorkVec.PutRowIndex(6 + iCnt, iNode2FirstMomIndex + iCnt);
227  }
228 
229  /* Indici del vincolo */
230  for (int iCnt = 1; iCnt <= 4; iCnt++) {
231  WorkVec.PutRowIndex(12 + iCnt, iFirstReactionIndex + iCnt);
232  }
233 
234  /* Aggiorna i dati propri */
235  F = Vec3(XCurr, iFirstReactionIndex + 1);
236  dM = XCurr(iFirstReactionIndex + 4);
237 
238  /* Recupera i dati */
239  const Vec3& x1(pNode1->GetXCurr());
240  const Vec3& x2(pNode2->GetXCurr());
241  const Mat3x3& R1(pNode1->GetRCurr());
242  const Mat3x3& R2(pNode2->GetRCurr());
243 
244  /* Costruisce i dati propri nella configurazione corrente */
245  Vec3 dTmp1(R1*d1);
246  Vec3 dTmp2(R2*d2);
247 
248  Vec3 e3a(R1*R1h.GetVec(3));
249  Vec3 e2b(R2*R2h.GetVec(2));
250 
251  Vec3 MTmp(e2b.Cross(e3a)*dM);
252 
253  /* Equazioni di equilibrio, nodo 1 */
254  WorkVec.Sub(1, F);
255  WorkVec.Sub(4, dTmp1.Cross(F) + MTmp);
256 
257  /* Equazioni di equilibrio, nodo 2 */
258  WorkVec.Add(7, F);
259  WorkVec.Add(10, dTmp2.Cross(F) + MTmp);
260 
261  /* Modifica: divido le equazioni di vincolo per dCoef */
262  ASSERT(dCoef != 0.);
263 
264  /* Equazione di vincolo di posizione */
265  WorkVec.Add(13, (x2 + dTmp2 - x1 - dTmp1)/dCoef);
266 
267  /* Equazione di vincolo di rotazione */
268  WorkVec.PutCoef(16, (e3a*e2b)/dCoef);
269 
270  return WorkVec;
271 }
Definition: matvec3.h:98
virtual void ResizeReset(integer)
Definition: vh.cc:55
virtual const Mat3x3 & GetRCurr(void) const
Definition: strnode.h:1012
virtual void Sub(integer iRow, const Vec3 &v)
Definition: vh.cc:78
const StructNode * pNode2
Definition: univj.h:49
Vec3 GetVec(unsigned short int i) const
Definition: matvec3.h:893
const StructNode * pNode1
Definition: univj.h:48
virtual void PutRowIndex(integer iSubRow, integer iRow)=0
doublereal dM
Definition: univj.h:55
#define DEBUGCOUT(msg)
Definition: myassert.h:232
virtual integer iGetFirstMomentumIndex(void) const =0
#define ASSERT(expression)
Definition: colamd.c:977
virtual void PutCoef(integer iRow, const doublereal &dCoef)=0
virtual const Vec3 & GetXCurr(void) const
Definition: strnode.h:310
virtual void Add(integer iRow, const Vec3 &v)
Definition: vh.cc:63
void WorkSpaceDim(integer *piNumRows, integer *piNumCols) const
Definition: univj.h:84
virtual integer iGetFirstIndex(void) const
Definition: dofown.h:127
long int integer
Definition: colamd.c:51

Here is the call graph for this function:

virtual void UniversalHingeJoint::GetConnectedNodes ( std::vector< const Node * > &  connectedNodes) const
inlinevirtual

Reimplemented from Elem.

Definition at line 125 of file univj.h.

References pNode1, and pNode2.

125  {
126  connectedNodes.resize(2);
127  connectedNodes[0] = pNode1;
128  connectedNodes[1] = pNode2;
129  };
const StructNode * pNode2
Definition: univj.h:49
const StructNode * pNode1
Definition: univj.h:48
DofOrder::Order UniversalHingeJoint::GetDofType ( unsigned int  i) const
inlinevirtual

Reimplemented from Elem.

Definition at line 79 of file univj.h.

References DofOrder::ALGEBRAIC, and ASSERT.

79  {
80  ASSERT(i >= 0 && i < 4);
81  return DofOrder::ALGEBRAIC;
82  };
#define ASSERT(expression)
Definition: colamd.c:977
virtual Joint::Type UniversalHingeJoint::GetJointType ( void  ) const
inlinevirtual

Implements Joint.

Definition at line 71 of file univj.h.

References Joint::UNIVERSALHINGE.

71  {
72  return Joint::UNIVERSALHINGE;
73  };
virtual unsigned int UniversalHingeJoint::iGetInitialNumDof ( void  ) const
inlinevirtual

Implements SubjectToInitialAssembly.

Definition at line 102 of file univj.h.

102  {
103  return 8;
104  };
virtual unsigned int UniversalHingeJoint::iGetNumDof ( void  ) const
inlinevirtual

Reimplemented from Elem.

Definition at line 75 of file univj.h.

75  {
76  return 4;
77  };
VariableSubMatrixHandler & UniversalHingeJoint::InitialAssJac ( VariableSubMatrixHandler WorkMat,
const VectorHandler XCurr 
)
virtual

Implements SubjectToInitialAssembly.

Definition at line 293 of file univj.cc.

References FullSubMatrixHandler::Add(), Vec3::Cross(), d1, d2, DEBUGCOUT, FullSubMatrixHandler::DecCoef(), dM, F, WithLabel::GetLabel(), StructNode::GetRRef(), Mat3x3::GetVec(), StructNode::GetWRef(), DofOwnerOwner::iGetFirstIndex(), StructDispNode::iGetFirstPositionIndex(), FullSubMatrixHandler::IncCoef(), InitialWorkSpaceDim(), MatCross, MatCrossCross, MBDYN_EXCEPT_ARGS, pNode1, pNode2, FullSubMatrixHandler::PutCoef(), FullSubMatrixHandler::PutColIndex(), FullSubMatrixHandler::PutRowIndex(), R1h, R2h, FullSubMatrixHandler::ResizeReset(), VariableSubMatrixHandler::SetFull(), and FullSubMatrixHandler::Sub().

295 {
296  DEBUGCOUT("Entering UniversalHingeJoint::InitialAssJac()" << std::endl);
297 
298  /* Per ora usa la matrice piena; eventualmente si puo'
299  * passare a quella sparsa quando si ottimizza */
300  FullSubMatrixHandler& WM = WorkMat.SetFull();
301 
302  /* Dimensiona e resetta la matrice di lavoro */
303  integer iNumRows = 0;
304  integer iNumCols = 0;
305  InitialWorkSpaceDim(&iNumRows, &iNumCols);
306  WM.ResizeReset(iNumRows, iNumCols);
307 
308  /* Equazioni: vedi joints.dvi */
309 
310  /* Indici */
311  integer iNode1FirstPosIndex = pNode1->iGetFirstPositionIndex();
312  integer iNode1FirstVelIndex = iNode1FirstPosIndex + 6;
313  integer iNode2FirstPosIndex = pNode2->iGetFirstPositionIndex();
314  integer iNode2FirstVelIndex = iNode2FirstPosIndex + 6;
315  integer iFirstReactionIndex = iGetFirstIndex();
316  integer iReactionPrimeIndex = iFirstReactionIndex + 4;
317 
318  /* Nota: le reazioni vincolari sono:
319  * Forza, 3 incognite, riferimento globale,
320  * Momento, 1 incognita, riferimento locale
321  */
322 
323  /* Setta gli indici dei nodi */
324  for (int iCnt = 1; iCnt <= 6; iCnt++) {
325  WM.PutRowIndex(iCnt, iNode1FirstPosIndex + iCnt);
326  WM.PutColIndex(iCnt, iNode1FirstPosIndex + 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);
333  }
334 
335  /* Setta gli indici delle reazioni */
336  for (int iCnt = 1; iCnt <= 8; iCnt++) {
337  WM.PutRowIndex(24 + iCnt, iFirstReactionIndex + iCnt);
338  WM.PutColIndex(24 + iCnt, iFirstReactionIndex + iCnt);
339  }
340 
341  /* Matrici identita' */
342  for (int iCnt = 1; iCnt <= 3; iCnt++) {
343  /* Contributo di forza all'equazione della forza, nodo 1 */
344  WM.IncCoef(iCnt, 24 + iCnt, 1.);
345 
346  /* Contrib. di der. di forza all'eq. della der. della forza, nodo 1 */
347  WM.IncCoef(6 + iCnt, 28 + iCnt, 1.);
348 
349  /* Contributo di forza all'equazione della forza, nodo 2 */
350  WM.DecCoef(12 + iCnt, 24 + iCnt, 1.);
351 
352  /* Contrib. di der. di forza all'eq. della der. della forza, nodo 2 */
353  WM.DecCoef(18 + iCnt, 28 + iCnt, 1.);
354 
355  /* Equazione di vincolo, nodo 1 */
356  WM.DecCoef(24 + iCnt, iCnt, 1.);
357 
358  /* Derivata dell'equazione di vincolo, nodo 1 */
359  WM.DecCoef(28 + iCnt, 6 + iCnt, 1.);
360 
361  /* Equazione di vincolo, nodo 2 */
362  WM.IncCoef(24 + iCnt, 12 + iCnt, 1.);
363 
364  /* Derivata dell'equazione di vincolo, nodo 2 */
365  WM.IncCoef(28 + iCnt, 18 + iCnt, 1.);
366  }
367 
368  /* Recupera i dati */
369  const Mat3x3& R1(pNode1->GetRRef());
370  const Mat3x3& R2(pNode2->GetRRef());
371  const Vec3& Omega1(pNode1->GetWRef());
372  const Vec3& Omega2(pNode2->GetWRef());
373  /* F ed M sono gia' state aggiornate da InitialAssRes */
374  Vec3 FPrime(XCurr, iReactionPrimeIndex+1);
375  doublereal dMPrime(XCurr(iReactionPrimeIndex+4));
376 
377  /* Distanze e matrici di rotazione dai nodi alla cerniera
378  * nel sistema globale */
379  Vec3 d1Tmp(R1*d1);
380  Vec3 d2Tmp(R2*d2);
381 
382  Vec3 e3a(R1*R1h.GetVec(3));
383  Vec3 e2b(R2*R2h.GetVec(2));
384 
385  /* Ruota il momento e la sua derivata con le matrici della cerniera
386  * rispetto ai nodi */
387  Vec3 MTmp(e2b*dM);
388  Vec3 MPrimeTmp(e2b*dMPrime);
389 
390  /* Matrici F/\d1/\, -F/\d2/\ */
391  Mat3x3 FWedged1Wedge(MatCrossCross, F, d1Tmp);
392  Mat3x3 FWedged2Wedge(MatCrossCross, F, -d2Tmp);
393 
394  /* Matrici (omega1/\d1)/\, -(omega2/\d2)/\ */
395  Mat3x3 O1Wedged1Wedge(MatCross, Omega1.Cross(d1Tmp));
396  Mat3x3 O2Wedged2Wedge(MatCross, d2Tmp.Cross(Omega2));
397 
398  Mat3x3 MDeltag1((Mat3x3(MatCross, Omega2.Cross(MTmp) + MPrimeTmp)
399  + Mat3x3(MatCrossCross, MTmp, Omega1))*Mat3x3(MatCross, e3a));
400  Mat3x3 MDeltag2(Mat3x3(MatCrossCross, Omega1.Cross(e3a), MTmp)
401  + Mat3x3(MatCrossCross, e3a, MPrimeTmp)
402  + e3a.Cross(Mat3x3(MatCrossCross, Omega2, MTmp)));
403 
404  /* Vettori temporanei */
405  Vec3 Tmp(e2b.Cross(e3a));
406 
407  /* Prodotto vettore tra il versore 3 della cerniera secondo il nodo 1
408  * ed il versore 1 della cerniera secondo il nodo 2. A convergenza
409  * devono essere ortogonali, quindi il loro prodotto vettore deve essere
410  * unitario */
411 
412  /* Error handling: il programma si ferma, pero' segnala dov'e' l'errore */
413  if (Tmp.Dot() < std::numeric_limits<doublereal>::epsilon()) {
414  silent_cerr("CardanoHingeJoint(" << GetLabel() << "): "
415  "first and second node hinge axes are (nearly) orthogonal"
416  << std::endl);
418  }
419 
420  Vec3 TmpPrime(e2b.Cross(Omega1.Cross(e3a)) - e3a.Cross(Omega2.Cross(e2b)));
421 
422  /* Equazione di momento, nodo 1 */
423  WM.Add(4, 4, FWedged1Wedge - Mat3x3(MatCrossCross, MTmp, e3a));
424  WM.Add(4, 16, Mat3x3(MatCrossCross, e3a, MTmp));
425  WM.Add(4, 25, Mat3x3(MatCross, d1Tmp));
426  for (int iCnt = 1; iCnt <= 3; iCnt++) {
427  WM.PutCoef(3 + iCnt, 28, Tmp(iCnt));
428  }
429 
430  /* Equazione di momento, nodo 2 */
431  WM.Add(16, 4, Mat3x3(MatCrossCross, MTmp, e3a));
432  WM.Add(16, 16, FWedged2Wedge - Mat3x3(MatCrossCross, e3a, MTmp));
433  WM.Sub(16, 25, Mat3x3(MatCross, d2Tmp));
434  for (int iCnt = 1; iCnt <= 3; iCnt++) {
435  WM.DecCoef(15 + iCnt, 28, Tmp(iCnt));
436  }
437 
438  /* Derivata dell'equazione di momento, nodo 1 */
439  WM.Add(10, 4, (Mat3x3(MatCross, FPrime) + Mat3x3(MatCrossCross, F, Omega1))*Mat3x3(MatCross, d1Tmp) - MDeltag1);
440  WM.Add(10, 10, FWedged1Wedge - Mat3x3(MatCrossCross, MTmp, e3a));
441  WM.Add(10, 16, MDeltag2);
442  WM.Add(10, 22, Mat3x3(MatCrossCross, e3a, MTmp));
443  WM.Add(10, 25, O1Wedged1Wedge);
444  WM.Add(10, 29, Mat3x3(MatCross, d1Tmp));
445 
446  for (int iCnt = 1; iCnt <= 3; iCnt++) {
447  WM.PutCoef(9 + iCnt, 28, TmpPrime(iCnt));
448  WM.PutCoef(9 + iCnt, 32, Tmp(iCnt));
449  }
450 
451  /* Derivata dell'equazione di momento, nodo 2 */
452  WM.Add(22, 4, MDeltag1);
453  WM.Add(22, 10, Mat3x3(MatCrossCross, MTmp, e3a));
454  WM.Sub(22, 16, (Mat3x3(MatCross, FPrime) + Mat3x3(MatCrossCross, F, Omega2))*Mat3x3(MatCross, d2Tmp) + MDeltag2);
455  WM.Add(22, 22, FWedged2Wedge - Mat3x3(MatCrossCross, e3a, MTmp));
456  WM.Add(22, 25, O2Wedged2Wedge);
457  WM.Sub(22, 29, Mat3x3(MatCross, d2Tmp));
458 
459  for (int iCnt = 1; iCnt <= 3; iCnt++) {
460  WM.DecCoef(21 + iCnt, 28, TmpPrime(iCnt));
461  WM.DecCoef(21 + iCnt, 32, Tmp(iCnt));
462  }
463 
464  /* Equazione di vincolo di posizione */
465  WM.Add(25, 4, Mat3x3(MatCross, d1Tmp));
466  WM.Sub(25, 16, Mat3x3(MatCross, d2Tmp));
467 
468  /* Derivata dell'equazione di vincolo di posizione */
469  WM.Add(29, 4, O1Wedged1Wedge);
470  WM.Add(29, 10, Mat3x3(MatCross, d1Tmp));
471  WM.Add(29, 16, O2Wedged2Wedge);
472  WM.Sub(29, 22, Mat3x3(MatCross, d2Tmp));
473 
474  /* Equazioni di vincolo di rotazione: e2b~e3a */
475 
476  for (int iCnt = 1; iCnt <= 3; iCnt++) {
477  doublereal d = Tmp(iCnt);
478  WM.IncCoef(28, 3 + iCnt, d);
479  WM.DecCoef(28, 15 + iCnt, d);
480 
481  /* Queste sono per la derivata dell'equazione, sono qui solo per
482  * ottimizzazione */
483  WM.IncCoef(32, 9 + iCnt, d);
484  WM.DecCoef(32, 21 + iCnt, d);
485  }
486 
487  /* Derivate delle equazioni di vincolo di rotazione: e2b~e3a */
488  Vec3 O1mO2(Omega1 - Omega2);
489  TmpPrime = e3a.Cross(O1mO2.Cross(e2b));
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));
494  }
495 
496  return WorkMat;
497 }
void PutColIndex(integer iSubCol, integer iCol)
Definition: submat.h:325
Vec3 Cross(const Vec3 &v) const
Definition: matvec3.h:218
virtual const Mat3x3 & GetRRef(void) const
Definition: strnode.h:1006
#define MBDYN_EXCEPT_ARGS
Definition: except.h:63
Definition: matvec3.h:98
const MatCross_Manip MatCross
Definition: matvec3.cc:639
FullSubMatrixHandler & SetFull(void)
Definition: submat.h:1168
void Add(integer iRow, integer iCol, const Vec3 &v)
Definition: submat.cc:209
void PutCoef(integer iRow, integer iCol, const doublereal &dCoef)
Definition: submat.h:672
const StructNode * pNode2
Definition: univj.h:49
virtual const Vec3 & GetWRef(void) const
Definition: strnode.h:1024
void IncCoef(integer iRow, integer iCol, const doublereal &dCoef)
Definition: submat.h:683
Vec3 GetVec(unsigned short int i) const
Definition: matvec3.h:893
const StructNode * pNode1
Definition: univj.h:48
void DecCoef(integer iRow, integer iCol, const doublereal &dCoef)
Definition: submat.h:694
virtual void InitialWorkSpaceDim(integer *piNumRows, integer *piNumCols) const
Definition: univj.h:106
doublereal dM
Definition: univj.h:55
#define DEBUGCOUT(msg)
Definition: myassert.h:232
virtual integer iGetFirstPositionIndex(void) const
Definition: strnode.h:452
virtual void ResizeReset(integer, integer)
Definition: submat.cc:182
const MatCrossCross_Manip MatCrossCross
Definition: matvec3.cc:640
void PutRowIndex(integer iSubRow, integer iRow)
Definition: submat.h:311
void Sub(integer iRow, integer iCol, const Vec3 &v)
Definition: submat.cc:215
virtual integer iGetFirstIndex(void) const
Definition: dofown.h:127
double doublereal
Definition: colamd.c:52
long int integer
Definition: colamd.c:51
unsigned int GetLabel(void) const
Definition: withlab.cc:62

Here is the call graph for this function:

SubVectorHandler & UniversalHingeJoint::InitialAssRes ( SubVectorHandler WorkVec,
const VectorHandler XCurr 
)
virtual

Implements SubjectToInitialAssembly.

Definition at line 502 of file univj.cc.

References VectorHandler::Add(), Vec3::Cross(), grad::Cross(), d1, d2, DEBUGCOUT, dM, F, StructNode::GetRCurr(), StructDispNode::GetVCurr(), Mat3x3::GetVec(), StructNode::GetWCurr(), StructDispNode::GetXCurr(), DofOwnerOwner::iGetFirstIndex(), StructDispNode::iGetFirstPositionIndex(), InitialWorkSpaceDim(), pNode1, pNode2, VectorHandler::PutCoef(), SubVectorHandler::PutRowIndex(), R1h, R2h, VectorHandler::ResizeReset(), and VectorHandler::Sub().

504 {
505  DEBUGCOUT("Entering UniversalHingeJoint::InitialAssRes()" << std::endl);
506 
507  /* Dimensiona e resetta la matrice di lavoro */
508  integer iNumRows = 0;
509  integer iNumCols = 0;
510  InitialWorkSpaceDim(&iNumRows, &iNumCols);
511  WorkVec.ResizeReset(iNumRows);
512 
513  /* Indici */
514  integer iNode1FirstPosIndex = pNode1->iGetFirstPositionIndex();
515  integer iNode1FirstVelIndex = iNode1FirstPosIndex + 6;
516  integer iNode2FirstPosIndex = pNode2->iGetFirstPositionIndex();
517  integer iNode2FirstVelIndex = iNode2FirstPosIndex + 6;
518  integer iFirstReactionIndex = iGetFirstIndex();
519  integer iReactionPrimeIndex = iFirstReactionIndex + 4;
520 
521  /* Setta gli indici */
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);
527  }
528 
529  for (int iCnt = 1; iCnt <= 8; iCnt++) {
530  WorkVec.PutRowIndex(24 + iCnt, iFirstReactionIndex+iCnt);
531  }
532 
533  /* Recupera i dati */
534  const Vec3& x1(pNode1->GetXCurr());
535  const Vec3& x2(pNode2->GetXCurr());
536  const Vec3& v1(pNode1->GetVCurr());
537  const Vec3& v2(pNode2->GetVCurr());
538  const Mat3x3& R1(pNode1->GetRCurr());
539  const Mat3x3& R2(pNode2->GetRCurr());
540  const Vec3& Omega1(pNode1->GetWCurr());
541  const Vec3& Omega2(pNode2->GetWCurr());
542 
543  /* Aggiorna F ed M, che restano anche per InitialAssJac */
544  F = Vec3(XCurr, iFirstReactionIndex + 1);
545  dM = XCurr(iFirstReactionIndex + 4);
546  Vec3 FPrime(XCurr, iReactionPrimeIndex + 1);
547  doublereal dMPrime(XCurr(iReactionPrimeIndex + 4));
548 
549  /* Distanza nel sistema globale */
550  Vec3 d1Tmp(R1*d1);
551  Vec3 d2Tmp(R2*d2);
552 
553  /* Vettori omega1/\d1, -omega2/\d2 */
554  Vec3 O1Wedged1(Omega1.Cross(d1Tmp));
555  Vec3 O2Wedged2(Omega2.Cross(d2Tmp));
556 
557  Vec3 e3a(R1*R1h.GetVec(3));
558  Vec3 e2b(R2*R2h.GetVec(2));
559 
560  /* Ruota il momento e la sua derivata con le matrici della cerniera
561  * rispetto ai nodi */
562  Vec3 MTmp(e2b*dM);
563  Vec3 MPrimeTmp(e3a.Cross(MTmp.Cross(Omega2)) + e2b.Cross(e3a)*dMPrime);
564 
565  /* Equazioni di equilibrio, nodo 1 */
566  WorkVec.Sub(1, F);
567  WorkVec.Sub(4, d1Tmp.Cross(F) + MTmp.Cross(e3a));
568 
569  /* Derivate delle equazioni di equilibrio, nodo 1 */
570  WorkVec.Sub(7, FPrime);
571  WorkVec.Sub(10, d1Tmp.Cross(FPrime) - O1Wedged1.Cross(F) - MPrimeTmp);
572 
573  /* Equazioni di equilibrio, nodo 2 */
574  WorkVec.Add(13, F);
575  WorkVec.Add(16, d2Tmp.Cross(F) + MTmp.Cross(e3a));
576 
577  /* Derivate delle equazioni di equilibrio, nodo 2 */
578  WorkVec.Add(19, FPrime);
579  WorkVec.Add(22, d2Tmp.Cross(FPrime) + O2Wedged2.Cross(F) + MPrimeTmp);
580 
581  /* Equazione di vincolo di posizione */
582  WorkVec.Add(25, x1 + d1Tmp - x2 - d2Tmp);
583 
584  /* Derivata dell'equazione di vincolo di posizione */
585  WorkVec.Add(29, v1 + O1Wedged1 - v2 - O2Wedged2);
586 
587  /* Equazioni di vincolo di rotazione */
588  WorkVec.PutCoef(28, e2b*e3a);
589 
590  /* Derivate delle equazioni di vincolo di rotazione: e2b~e3a */
591  Vec3 Tmp((Omega1 - Omega2).Cross(e3a));
592  WorkVec.PutCoef(32, e2b*Tmp);
593 
594  return WorkVec;
595 }
Definition: matvec3.h:98
virtual void ResizeReset(integer)
Definition: vh.cc:55
virtual const Mat3x3 & GetRCurr(void) const
Definition: strnode.h:1012
virtual void Sub(integer iRow, const Vec3 &v)
Definition: vh.cc:78
const StructNode * pNode2
Definition: univj.h:49
Vec3 GetVec(unsigned short int i) const
Definition: matvec3.h:893
const StructNode * pNode1
Definition: univj.h:48
virtual void PutRowIndex(integer iSubRow, integer iRow)=0
virtual void InitialWorkSpaceDim(integer *piNumRows, integer *piNumCols) const
Definition: univj.h:106
doublereal dM
Definition: univj.h:55
#define DEBUGCOUT(msg)
Definition: myassert.h:232
virtual integer iGetFirstPositionIndex(void) const
Definition: strnode.h:452
virtual const Vec3 & GetWCurr(void) const
Definition: strnode.h:1030
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)
Definition: matvec.h:3248
virtual const Vec3 & GetXCurr(void) const
Definition: strnode.h:310
virtual void Add(integer iRow, const Vec3 &v)
Definition: vh.cc:63
virtual const Vec3 & GetVCurr(void) const
Definition: strnode.h:322
virtual integer iGetFirstIndex(void) const
Definition: dofown.h:127
double doublereal
Definition: colamd.c:52
long int integer
Definition: colamd.c:51

Here is the call graph for this function:

virtual void UniversalHingeJoint::InitialWorkSpaceDim ( integer piNumRows,
integer piNumCols 
) const
inlinevirtual

Implements SubjectToInitialAssembly.

Definition at line 106 of file univj.h.

Referenced by InitialAssJac(), and InitialAssRes().

106  {
107  *piNumRows = 32;
108  *piNumCols = 32;
109  };
void UniversalHingeJoint::Output ( OutputHandler OH) const
virtual

Reimplemented from ToBeOutput.

Definition at line 275 of file univj.cc.

References ToBeOutput::bToBeOutput(), dM, dRaDegr, F, WithLabel::GetLabel(), StructNode::GetRCurr(), OutputHandler::Joints(), MatR2EulerAngles(), Joint::Output(), pNode1, pNode2, R1h, and R2h.

276 {
277  if (bToBeOutput()) {
278  Mat3x3 R1Tmp(pNode1->GetRCurr()*R1h);
279  Mat3x3 R2Tmp(pNode2->GetRCurr()*R2h);
280 
281  Vec3 vTmp(R2Tmp.GetVec(2).Cross(R1Tmp.GetVec(3)));
282 
283  Joint::Output(OH.Joints(), "CardanoHinge", GetLabel(),
284  R1Tmp.Transpose()*F, Vec3(dM, 0., 0.), F, vTmp*dM)
285  << " " << MatR2EulerAngles(R2Tmp.MulTM(R1Tmp))*dRaDegr
286  << std::endl;
287  }
288 }
virtual bool bToBeOutput(void) const
Definition: output.cc:890
Definition: matvec3.h:98
virtual const Mat3x3 & GetRCurr(void) const
Definition: strnode.h:1012
const StructNode * pNode2
Definition: univj.h:49
const StructNode * pNode1
Definition: univj.h:48
doublereal dM
Definition: univj.h:55
const doublereal dRaDegr
Definition: matvec3.cc:884
std::ostream & Joints(void) const
Definition: output.h:443
Vec3 MatR2EulerAngles(const Mat3x3 &R)
Definition: matvec3.cc:887
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
Definition: joint.cc:138
unsigned int GetLabel(void) const
Definition: withlab.cc:62

Here is the call graph for this function:

std::ostream & UniversalHingeJoint::Restart ( std::ostream &  out) const
virtual

Implements Elem.

Definition at line 71 of file univj.cc.

References d1, d2, WithLabel::GetLabel(), Mat3x3::GetVec(), pNode1, pNode2, R1h, R2h, Joint::Restart(), Write(), and Vec3::Write().

72 {
73  Joint::Restart(out) << ", universal hinge, "
74  << pNode1->GetLabel() << ", "
75  "reference, node, ", d1.Write(out, ", ") << ", "
76  "hinge, reference, node, "
77  "1, ", (R1h.GetVec(1)).Write(out, ", ") << ", "
78  "2, ", (R1h.GetVec(2)).Write(out, ", ") << ", "
79  << pNode2->GetLabel() << ", "
80  "reference, node, ", d2.Write(out, ", ") << ", "
81  "hinge, reference, node, "
82  "1, ", (R2h.GetVec(1)).Write(out, ", ") << ", "
83  "2, ", (R2h.GetVec(2)).Write(out, ", ") << ";"
84  << std::endl;
85 
86  return out;
87 }
std::ostream & Write(std::ostream &out, const char *sFill=" ") const
Definition: matvec3.cc:738
std::ostream & Write(std::ostream &out, const FullMatrixHandler &m, const char *s, const char *s2)
Definition: fullmh.cc:376
const StructNode * pNode2
Definition: univj.h:49
Vec3 GetVec(unsigned short int i) const
Definition: matvec3.h:893
const StructNode * pNode1
Definition: univj.h:48
virtual std::ostream & Restart(std::ostream &out) const
Definition: joint.h:195
unsigned int GetLabel(void) const
Definition: withlab.cc:62

Here is the call graph for this function:

void UniversalHingeJoint::WorkSpaceDim ( integer piNumRows,
integer piNumCols 
) const
inlinevirtual

Implements Elem.

Definition at line 84 of file univj.h.

Referenced by AssJac(), and AssRes().

84  {
85  *piNumRows = 16;
86  *piNumCols = 16;
87  };

Member Data Documentation

Vec3 UniversalHingeJoint::d1
private

Definition at line 50 of file univj.h.

Referenced by AssJac(), AssRes(), InitialAssJac(), InitialAssRes(), and Restart().

Vec3 UniversalHingeJoint::d2
private

Definition at line 52 of file univj.h.

Referenced by AssJac(), AssRes(), InitialAssJac(), InitialAssRes(), and Restart().

doublereal UniversalHingeJoint::dM
private

Definition at line 55 of file univj.h.

Referenced by AssJac(), AssRes(), InitialAssJac(), InitialAssRes(), and Output().

Vec3 UniversalHingeJoint::F
private

Definition at line 54 of file univj.h.

Referenced by AssJac(), AssRes(), InitialAssJac(), InitialAssRes(), and Output().

const StructNode* UniversalHingeJoint::pNode1
private

Definition at line 48 of file univj.h.

Referenced by AssJac(), AssRes(), GetConnectedNodes(), InitialAssJac(), InitialAssRes(), Output(), and Restart().

const StructNode* UniversalHingeJoint::pNode2
private

Definition at line 49 of file univj.h.

Referenced by AssJac(), AssRes(), GetConnectedNodes(), InitialAssJac(), InitialAssRes(), Output(), and Restart().

Mat3x3 UniversalHingeJoint::R1h
private

Definition at line 51 of file univj.h.

Referenced by AssJac(), AssRes(), InitialAssJac(), InitialAssRes(), Output(), and Restart().

Mat3x3 UniversalHingeJoint::R2h
private

Definition at line 53 of file univj.h.

Referenced by AssJac(), AssRes(), InitialAssJac(), InitialAssRes(), Output(), and Restart().


The documentation for this class was generated from the following files: