1941 const char* sKeyWords[] = {
1968 iNumMasses = HP.
GetInt();
1969 if (iNumMasses < 1) {
1970 silent_cerr(
"Body(" << uLabel <<
"): "
1971 "at least one mass is required in \"condense\" "
1976 iNumMasses <<
" masses will be condensed" << std::endl);
2010 bool bNegative(
false);
2012 if (HP.
IsKeyWord(
"allow" "negative" "mass")) {
2016 for (
int iCnt = 1; iCnt <= iNumMasses; iCnt++) {
2019 if (!bNegative && dMTmp < 0.) {
2020 silent_cerr(
"Body(" << uLabel <<
"): "
2021 "negative mass is not allowed at line "
2032 if (iNumMasses == 1) {
2036 STmp += XgcTmp*dMTmp;
2040 <<
") center of gravity = " << XgcTmp << std::endl);
2062 <<
") =" << std::endl << JTmp << std::endl);
2063 if (!JTmp.IsSymmetric()) {
2064 silent_cerr(
"Body(" << uLabel <<
"): "
2065 "warning, non-symmetric inertia tensor at line " << HP.
GetLineData() << std::endl);
2070 "supplied in inertial reference frame" << std::endl);
2075 JTmp = RTmp*JTmp.
MulMT(RTmp);
2078 "Inertia matrix of mass(" << iCnt <<
") "
2079 "in current frame =" << JTmp << std::endl);
2086 if (!bNegative && dm < 0.) {
2087 silent_cerr(
"Body(" << uLabel <<
"): "
2088 "negative mass is not allowed at line "
2093 if (iNumMasses > 1 && pStrNode) {
2094 if (dm < std::numeric_limits<doublereal>::epsilon()) {
2095 silent_cerr(
"Body(" << uLabel <<
"): "
2096 "mass value " << dm <<
" is too small at line "
2105 <<
"Center of mass: " << Xgc << std::endl
2106 <<
"Inertia matrix:" << std::endl << J << std::endl);
2110 const char *sElemName;
2111 const char *sNodeName;
2114 sNodeName =
"StructNode";
2117 sNodeName =
"StructDispNode";
2120 if (bStaticModel || bInverseDynamics) {
2124 silent_cerr(sElemName <<
"(" << uLabel <<
"): "
2125 "illegal structural node type "
2126 "for " << sNodeName <<
"(" << pStrDispNode->
GetLabel() <<
") "
2127 "in " << (bStaticModel ?
"static model" :
"inverse dynamics") <<
" analysis "
2135 silent_cerr(sElemName <<
"(" << uLabel <<
"): "
2136 "illegal structural node type "
2137 "for " << sNodeName <<
"(" << pStrDispNode->
GetLabel() <<
") "
2147 if (bStaticModel || bInverseDynamics) {
2154 StaticBody(uLabel, dynamic_cast<const StaticStructNode *>(pStaticDispNode),
2165 if (bInverseDynamics) {
2166 bool bIsRightHandSide(
true);
2167 bool bIsErgonomy(
true);
2169 if (HP.
IsKeyWord(
"inverse" "dynamics")) {
2170 bIsRightHandSide =
false;
2171 if (HP.
IsKeyWord(
"right" "hand" "side")) {
2175 bIsErgonomy =
false;
2183 if (bIsRightHandSide) {
2205 if (pModalNode && pRBK) {
2206 silent_cerr(
"Body(" << uLabel <<
") "
2207 "is connected to ModalNode(" << pModalNode->
GetLabel() <<
") "
2208 "which uses rigid body kinematics "
2215 ModalBody(uLabel, pModalNode, dm, Xgc, J, fOut));
2219 DynamicBody(uLabel, pDynamicStructNode, dm, Xgc, J, fOut));
2229 <<
"body: " << uLabel
2238 silent_cerr(
"semicolon expected "
flag fReadOutput(MBDynParser &HP, const T &t) const
Mat3x3 GetRotRel(const ReferenceFrame &rf)
virtual StructDispNode::Type GetStructDispNodeType(void) const
const Vec3 Zero3(0., 0., 0.)
#define MBDYN_EXCEPT_ARGS
#define DEBUGCOUTFNAME(fname)
virtual integer GetInt(integer iDefval=0)
virtual StructDispNode::Type GetStructDispNodeType(void) const
bool bIsStaticModel(void) const
void SetInverseDynamicsFlags(unsigned uIDF)
virtual bool GetYesNoOrBool(bool bDefval=false)
const Mat3x3 Zero3x3(0., 0., 0., 0., 0., 0., 0., 0., 0.)
Vec3 GetPosRel(const ReferenceFrame &rf)
virtual bool IsKeyWord(const char *sKeyWord)
Mat3x3 GetMatRel(const ReferenceFrame &rf)
const RigidBodyKinematics * pGetRBK(void) const
#define SAFENEWWITHCONSTRUCTOR(pnt, item, constructor)
const MatCrossCross_Manip MatCrossCross
std::ostream & GetLogFile(void) const
Elem * ReadVariableBody(DataManager *pDM, MBDynParser &HP, unsigned int uLabel, const StructNode *pStrNode)
Mat3x3 MulMT(const Mat3x3 &m) const
virtual HighParser::ErrOut GetLineData(void) const
unsigned int GetLabel(void) const
Node * ReadNode(MBDynParser &HP, Node::Type type) const
#define DEBUGLCOUT(level, msg)
bool bIsInverseDynamics(void) const
virtual doublereal GetReal(const doublereal &dDefval=0.0)