]> git.mxchange.org Git - flightgear.git/blob - src/FDM/YASim/Surface.hpp
Use SG_LOG for debugging messages from the YASim helicopter model.
[flightgear.git] / src / FDM / YASim / Surface.hpp
1 #ifndef _SURFACE_HPP
2 #define _SURFACE_HPP
3
4 namespace yasim {
5
6 // FIXME: need a "chord" member for calculating moments.  Generic
7 // forces act at the center, but "pre-stall" lift acts towards the
8 // front, and flaps act (in both lift and drag) toward the back.
9 class Surface
10 {
11 public:
12     Surface();
13
14     // Position of this surface in local coords
15     void setPosition(float* p);
16     void getPosition(float* out);
17
18     // Distance scale along the X axis
19     void setChord(float chord);
20
21     // Slats act to move the stall peak by the specified angle, and
22     // increase drag by the multiplier specified.
23     void setSlatParams(float stallDelta, float dragPenalty);
24
25     // Flaps add to lift coefficient, and multiply drag.
26     void setFlapParams(float liftAdd, float dragPenalty);
27
28     // Spoilers reduce the pre-stall lift, and multiply drag.
29     void setSpoilerParams(float liftPenalty, float dragPenalty);
30
31     // Positions for the controls, in the range [0:1].  [-1:1] for
32     // flaps, with positive meaning "force goes towards positive Z"
33     void setFlap(float pos);
34     void setSlat(float pos);
35     void setSpoiler(float pos);
36
37     // local -> Surface coords
38     void setOrientation(float* o);
39
40     // For variable-incidence control surfaces.  The angle is a
41     // negative rotation about the surface's Y axis, in radians, so
42     // positive is "up" (i.e. "positive AoA")
43     void setIncidence(float angle);
44
45     // The offset from base incidence for this surface.
46     void setTwist(float angle);
47
48     void setTotalDrag(float c0);
49     float getTotalDrag();
50
51     void setXDrag(float cx);
52     void setYDrag(float cy);
53     void setZDrag(float cz);
54
55     // zero-alpha Z drag ("camber") specified as a fraction of cz
56     void setBaseZDrag(float cz0);
57
58     // i: 0 == forward, 1 == backwards
59     void setStallPeak(int i, float peak);
60
61     // i: 0 == fwd/+z, 1 == fwd/-z, 2 == rev/+z, 3 == rev/-z
62     void setStall(int i, float alpha);
63     void setStallWidth(int i, float width);
64
65     // Induced drag multiplier
66     void setInducedDrag(float mul) { _inducedDrag = mul; }
67
68     void calcForce(float* v, float rho, float* forceOut, float* torqueOut);
69
70 private:
71     float stallFunc(float* v);
72     float flapLift(float alpha);
73     float controlDrag(float lift, float drag);
74
75     float _chord;     // X-axis size
76     float _c0;        // total force coefficient
77     float _cx;        // X-axis force coefficient
78     float _cy;        // Y-axis force coefficient
79     float _cz;        // Z-axis force coefficient
80     float _cz0;       // Z-axis force offset
81     float _peaks[2];  // Stall peak coefficients (fwd, back)
82     float _stalls[4]; // Stall angles (fwd/back, pos/neg)
83     float _widths[4]; // Stall widths  " "
84     float _pos[3];    // position in local coords
85     float _orient[9]; // local->surface orthonormal matrix
86
87     float _slatAlpha;
88     float _slatDrag;
89     float _flapLift;
90     float _flapDrag;
91     float _spoilerLift;
92     float _spoilerDrag;
93
94     float _slatPos;
95     float _flapPos;
96     float _spoilerPos;
97     float _incidence;
98     float _twist;
99     float _inducedDrag;
100 };
101
102 }; // namespace yasim
103 #endif // _SURFACE_HPP