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