99         if (dAlpha < pData->Alpha[0]) {
 
  104                 if (dBeta < pData->Beta[0]) {
 
  142                 if (dBeta < pData->Beta[0]) {
 
  185                 if (dBeta < pData->Beta[0]) {
 
  220                                 = 
pData->
Data[iBeta + 1][iAlpha]*d1Alpha + 
pData->
Data[iBeta + 1][iAlpha + 1]*d2Alpha;
 
  243 : 
Elem(uLabel, fOut),
 
  249 bAlphaFirst(bAlphaFirst),
 
  332         connectedNodes.resize(1);
 
  333         connectedNodes[0] = 
pNode;
 
  353         for (
int iCnt = 1; iCnt <= 6; iCnt++) {
 
  375                         << 
" " << 
F << 
" " << 
M << std::endl;
 
  407                 if (strcmp(s, 
"alpha") == 0) {
 
  410                 } 
else if (strcmp(s, 
"beta") == 0) {
 
  492         unsigned int uLabel);
 
  508         dCoef[0] = c.
dCoef[0];
 
  509         dCoef[1] = c.
dCoef[1];
 
  510         dCoef[2] = c.
dCoef[2];
 
  511         dCoef[3] = c.
dCoef[3];
 
  512         dCoef[4] = c.
dCoef[4];
 
  513         dCoef[5] = c.
dCoef[5];
 
  553         retval.
dCoef[0] = dCoef[0]*d;
 
  554         retval.
dCoef[1] = dCoef[1]*d;
 
  555         retval.
dCoef[2] = dCoef[2]*d;
 
  556         retval.
dCoef[3] = dCoef[3]*d;
 
  557         retval.
dCoef[4] = dCoef[4]*d;
 
  558         retval.
dCoef[5] = dCoef[5]*d;
 
  568         retval.
dCoef[0] = dCoef[0]/d;
 
  569         retval.
dCoef[1] = dCoef[1]/d;
 
  570         retval.
dCoef[2] = dCoef[2]/d;
 
  571         retval.
dCoef[3] = dCoef[3]/d;
 
  572         retval.
dCoef[4] = dCoef[4]/d;
 
  573         retval.
dCoef[5] = dCoef[5]/d;
 
  585         std::ifstream in(fname.c_str());
 
  588                 silent_cerr(
"ReadGenericAerodynamicData: " 
  589                         "unable to open file \"" << fname << 
"\"" 
  599         for (c = in.get(); c == 
'%' || c == 
'#'; c = in.get()) {
 
  601                 in.getline(buf, 
sizeof(buf));
 
  606         in >> nAlpha >> 
nBeta;
 
  608         in.getline(buf, 
sizeof(buf));
 
  611                 silent_cerr(
"ReadGenericAerodynamicData(" << fname << 
"): " 
  612                         "unable to read size of data matrix " 
  613                         "from file \"" << fname << 
"\"" << std::endl);
 
  618                 silent_cerr(
"ReadGenericAerodynamicData(" << fname << 
"): " 
  619                         "invalid number of angles of attack " << nAlpha << 
" " 
  620                         "from file \"" << fname << 
"\"" << std::endl);
 
  625                 silent_cerr(
"ReadGenericAerodynamicData(" << fname << 
"): " 
  626                         "invalid number of sideslip angles " << nBeta << 
" " 
  627                         "from file \"" << fname << 
"\"" << std::endl);
 
  632         for (c = in.get(); c == 
'%' || c == 
'#'; c = in.get()) {
 
  634                 in.getline(buf, 
sizeof(buf));
 
  639                 silent_cerr(
"ReadGenericAerodynamicData(" << fname << 
"): " 
  640                         "unable to get to data " 
  641                         "in file \"" << fname << 
"\"" << std::endl);
 
  651         pData->
Alpha.resize(nAlpha);
 
  652         pData->
Beta.resize(nBeta);
 
  653         pData->
Data.resize(nBeta);
 
  655         doublereal dScaleForce = dScaleLength*dScaleLength;
 
  656         doublereal dScaleMoment = dScaleForce*dScaleLength;
 
  658                 dScaleForce, dScaleForce, dScaleForce,
 
  659                 dScaleMoment, dScaleMoment, dScaleMoment
 
  663         for (
int iBeta = 0; iBeta < 
nBeta; iBeta++) {
 
  664                 pData->
Data[iBeta].resize(nAlpha);
 
  666                 for (
int iAlpha = 0; iAlpha < 
nAlpha; iAlpha++) {
 
  674                                         if (std::abs(dErr) > std::numeric_limits<doublereal>::epsilon()) {
 
  675                                                 silent_cerr(
"ReadGenericAerodynamicData(" << fname << 
"): " 
  676                                                         "warning, alpha[0] != -pi/2 (error=" << 100*dErr/::
dAlphaMax[bAlphaFirst] << 
"%)" << std::endl);
 
  678                                 } 
else if (iAlpha == nAlpha - 1) {
 
  680                                         if (std::abs(dErr) > std::numeric_limits<doublereal>::epsilon()) {
 
  681                                                 silent_cerr(
"ReadGenericAerodynamicData(" << fname << 
"): " 
  682                                                         "warning, alpha[" << iAlpha << 
"] != pi/2 (error=" << 100*dErr/::
dAlphaMax[bAlphaFirst] << 
"%)" << std::endl);
 
  686                                 pData->
Alpha[iAlpha] = dCoef;
 
  688                         } 
else if (dCoef != pData->
Alpha[iAlpha]) {
 
  689                                 silent_cerr(
"ReadGenericAerodynamicData" 
  690                                         "(" << fname << 
"): " 
  691                                         "inconsistent data, " 
  692                                         "Alpha[" << iAlpha << 
"]" 
  694                                         "for Beta[" << iBeta << 
"]" 
  695                                                 "=" << pData->
Beta[iBeta] << 
" " 
  696                                         "differs from previous, " 
  697                                                 << pData->
Alpha[iAlpha]
 
  708                                         if (std::abs(dErr) > std::numeric_limits<doublereal>::epsilon()) {
 
  709                                                 silent_cerr(
"ReadGenericAerodynamicData(" << fname << 
"): " 
  710                                                         "warning, beta[0] != -pi (error=" << 100*dErr/::
dBetaMax[bAlphaFirst] << 
"%)" << std::endl);
 
  712                                 } 
else if (iBeta == nBeta - 1) {
 
  714                                         if (std::abs(dErr) > std::numeric_limits<doublereal>::epsilon()) {
 
  715                                                 silent_cerr(
"ReadGenericAerodynamicData(" << fname << 
"): " 
  716                                                         "warning, beta[" << iBeta << 
"] != pi (error=" << 100*dErr/::
dBetaMax[bAlphaFirst] << 
"%)" << std::endl);
 
  720                                 pData->
Beta[iBeta] = dCoef;
 
  722                         } 
else if (dCoef != pData->
Beta[iBeta]) {
 
  723                                 silent_cerr(
"ReadGenericAerodynamicData" 
  724                                         "(" << fname << 
"): " 
  725                                         "inconsistent data, " 
  726                                         "Beta[" << iBeta << 
"]" 
  728                                         "for Alpha[" << iAlpha << 
"]" 
  729                                                 "=" << pData->
Alpha[iAlpha] << 
" " 
  730                                         "differs from previous, " 
  731                                                 << pData->
Beta[iBeta]
 
  737                         for (
int iCoef = 0; iCoef < 6; iCoef++) {
 
  740                                 pData->
Data[iBeta][iAlpha].dCoef[iCoef] = dCoef*dScale[iCoef];
 
  744                         if (iAlpha < nAlpha - 1 && iBeta < nBeta - 1) {
 
  745                                 in.getline(buf, 
sizeof(buf));
 
  748                                         silent_cerr(
"ReadGenericAerodynamicData" 
  749                                                 "(" << fname << 
"): " 
  750                                                 "unable to read data past " 
  751                                                 "iAlpha=" << iAlpha << 
", " 
  752                                                 "iBeta=" << iBeta << std::endl);
 
  761         for (
int iAlpha = 0; iAlpha < 
nAlpha; iAlpha++) {
 
  762                 pData->
Alpha[iAlpha] *= dScaleAngle;
 
  768                 if ( pData->
Alpha[iAlpha] <= pData->
Alpha[iAlpha - 1]) {
 
  769                         silent_cerr(
"ReadGenericAerodynamicData" 
  770                                 "(" << fname << 
"): " 
  771                                 "strict ordering violated between " 
  772                                 "Alpha #" << iAlpha - 1 << 
" and " 
  773                                 "Alpha #" << iAlpha << std::endl);
 
  780         for (
int iBeta = 0; iBeta < 
nBeta; iBeta++) {
 
  781                 pData->
Beta[iBeta] *= dScaleAngle;
 
  787                 if ( pData->
Beta[iBeta] <= pData->
Beta[iBeta - 1]) {
 
  788                         silent_cerr(
"ReadGenericAerodynamicData" 
  789                                 "(" << fname << 
"): " 
  790                                 "strict ordering violated between " 
  791                                 "Beta #" << iBeta - 1 << 
" and " 
  792                                 "Beta #" << iBeta << std::endl);
 
  803         const DofOwner *pDO, 
unsigned int uLabel)
 
  828         if (HP.
IsKeyWord(
"reference" "surface")) {
 
  832         if (HP.
IsKeyWord(
"reference" "length")) {
 
  838                         silent_cerr(
"GenericAerodynamicForce(" << uLabel << 
"): " 
  839                                 "invalid \"alpha first\" value at line " << HP.
GetLineData() << std::endl);
 
  853                                 dScaleAngle = 
M_PI/180.;
 
  856                                 silent_cerr(
"GenericAerodynamicForce(" << uLabel << 
"): " 
  857                                         "unknown angle unit at line " << HP.
GetLineData() << std::endl);
 
  861                 } 
else if (HP.
IsKeyWord(
"scale" "angles")) {
 
  864                                 silent_cerr(
"GenericAerodynamicForce(" << uLabel << 
"): " 
  865                                         "invalid angle scale factor " << d
 
  876                                 silent_cerr(
"GenericAerodynamicForce(" << uLabel << 
"): " 
  877                                         "invalid length scale factor " << d
 
  888                 silent_cerr(
"GenericAerodynamicForce(" << uLabel << 
"): " 
  889                         "references to generic aerodynamic data not implemented yet " 
  894                 silent_cerr(
"GenericAerodynamicForce(" << uLabel << 
"): " 
  895                         "keyword \"file\" or \"reference\" expected " 
  906                         dRefSurface, dRefLength, bAlphaFirst,
 
flag fReadOutput(MBDynParser &HP, const T &t) const 
GenericAerodynamicCoef operator-(const GenericAerodynamicCoef &c) const 
virtual VariableSubMatrixHandler & InitialAssJac(VariableSubMatrixHandler &WorkMat, const VectorHandler &XCurr)
static const doublereal dAlphaMax[]
Mat3x3 GetRotRel(const ReferenceFrame &rf)
virtual Elem::Type GetElemType(void) const 
const Vec3 Zero3(0., 0., 0.)
Vec3 Cross(const Vec3 &v) const 
virtual bool GetAirProps(const Vec3 &X, doublereal &rho, doublereal &c, doublereal &p, doublereal &T) const 
void AssVec(SubVectorHandler &WorkVec)
virtual bool bToBeOutput(void) const 
#define MBDYN_EXCEPT_ARGS
GenericAerodynamicData * pData
std::vector< doublereal > Alpha
#define DEBUGCOUTFNAME(fname)
virtual void ResizeReset(integer)
virtual SubVectorHandler & AssRes(SubVectorHandler &WorkVec, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
GenericAerodynamicCoef operator*(const doublereal &d) const 
virtual const Mat3x3 & GetRCurr(void) const 
virtual SubVectorHandler & InitialAssRes(SubVectorHandler &WorkVec, const VectorHandler &XCurr)
virtual AerodynamicElem::Type GetAerodynamicElemType(void) const 
const Mat3x3 Eye3(1., 0., 0., 0., 1., 0., 0., 0., 1.)
virtual const char * GetFileName(enum Delims Del=DEFAULTDELIM)
virtual ~GenericAerodynamicForce(void)
static GenericAerodynamicData * ReadGenericAerodynamicData(const std::string &fname, doublereal dScaleAngle, doublereal dScaleLength, bool bAlphaFirst)
virtual void InitialWorkSpaceDim(integer *piNumRows, integer *piNumCols) const 
Vec3 MulTV(const Vec3 &v) const 
virtual void PutRowIndex(integer iSubRow, integer iRow)=0
std::vector< std::vector< GenericAerodynamicCoef > > Data
Vec3 GetPosRel(const ReferenceFrame &rf)
virtual void Output(OutputHandler &OH) const 
virtual bool IsKeyWord(const char *sKeyWord)
doublereal copysign(doublereal x, doublereal y)
GenericAerodynamicCoef operator/(const doublereal &d) const 
std::vector< doublereal > Beta
const doublereal dRefSurface
virtual integer iGetFirstMomentumIndex(void) const =0
virtual const Vec3 & GetWCurr(void) const 
const doublereal dRefLength
#define ASSERT(expression)
GradientExpression< UnaryExpr< FuncSqrt, Expr > > sqrt(const GradientExpression< Expr > &u)
virtual void GetConnectedNodes(std::vector< const Node * > &connectedNodes) const 
#define SAFENEWWITHCONSTRUCTOR(pnt, item, constructor)
virtual const Vec3 & GetXCurr(void) const 
virtual void Add(integer iRow, const Vec3 &v)
static const doublereal dBetaMax[]
GenericAerodynamicForce(unsigned int uLabel, const DofOwner *pDO, const StructNode *pN, const Vec3 &fTmp, const Mat3x3 &RaTmp, doublereal dS, doublereal dL, bool bAlphaFirst, GenericAerodynamicData *pData, flag fOut)
virtual unsigned int iGetPrivDataIdx(const char *s) const 
static std::stack< cleanup * > c
virtual void WorkSpaceDim(integer *piNumRows, integer *piNumCols) const 
virtual bool GetYesNo(bool &bRet)
GenericAerodynamicCoef(void)
virtual VariableSubMatrixHandler & AssJac(VariableSubMatrixHandler &WorkMat, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
virtual const Vec3 & GetVCurr(void) const 
virtual flag fGetAirVelocity(Vec3 &Velocity, const Vec3 &X) const 
GradientExpression< UnaryExpr< FuncCos, Expr > > cos(const GradientExpression< Expr > &u)
Elem * ReadGenericAerodynamicForce(DataManager *pDM, MBDynParser &HP, unsigned int uLabel)
virtual unsigned int iGetInitialNumDof(void) const 
virtual doublereal dGetPrivData(unsigned int i) const 
static doublereal buf[BUFSIZE]
GradientExpression< BinaryExpr< FuncAtan2, LhsExpr, RhsExpr > > atan2(const GradientExpression< LhsExpr > &u, const GradientExpression< RhsExpr > &v)
GenericAerodynamicCoef operator+(const GenericAerodynamicCoef &c) const 
virtual HighParser::ErrOut GetLineData(void) const 
unsigned int GetLabel(void) const 
Node * ReadNode(MBDynParser &HP, Node::Type type) const 
virtual std::ostream & Restart(std::ostream &out) const 
virtual unsigned int iGetNumPrivData(void) const 
virtual doublereal GetReal(const doublereal &dDefval=0.0)
std::ostream & Aerodynamic(void) const