1 /* $Header: /var/cvs/mbdyn/mbdyn/mbdyn-1.0/mbdyn/aero/aerodata_impl.h,v 1.18 2017/01/12 14:45:58 masarati Exp $ */
2 /*
3  * MBDyn (C) is a multibody analysis code.
4  * http://www.mbdyn.org
5  *
6  * Copyright (C) 1996-2017
7  *
8  * Pierangelo Masarati	<masarati@aero.polimi.it>
9  * Paolo Mantegazza	<mantegazza@aero.polimi.it>
10  *
11  * Dipartimento di Ingegneria Aerospaziale - Politecnico di Milano
12  * via La Masa, 34 - 20156 Milano, Italy
13  * http://www.aero.polimi.it
14  *
15  * Changing this copyright notice is forbidden.
16  *
17  * This program is free software; you can redistribute it and/or modify
18  * it under the terms of the GNU General Public License as published by
19  * the Free Software Foundation (version 2 of the License).
20  *
21  *
22  * This program is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25  * GNU General Public License for more details.
26  *
27  * You should have received a copy of the GNU General Public License
28  * along with this program; if not, write to the Free Software
29  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
30  */
31 
32 #ifndef AERODATA_IMPL_H
33 #define AERODATA_IMPL_H
34 
35 #include "aerodata.h"
36 
37 /* STAHRAeroData - begin */
38 
39 class STAHRAeroData : public AeroData {
40 protected:
41 	integer profile;
42 
43 public:
44 	STAHRAeroData(
45 		int i_p, int i_dim,
46 		AeroData::UnsteadyModel u, integer p,
47 		DriveCaller *ptime = 0);
48 	virtual ~STAHRAeroData(void);
49 
50 	std::ostream& Restart(std::ostream& out) const;
51 	int GetForces(int i, const doublereal* W, doublereal* TNG, outa_t& OUTA);
52 	int GetForcesJac(int i, const doublereal* W, doublereal* TNG, Mat6x6& J, outa_t& OUTA);
53 };
54 
55 /* STAHRAeroData - end */
56 
57 
58 /* C81AeroData - begin */
59 
60 class C81AeroData : public AeroData {
61 protected:
62 	integer profile;
63 	const c81_data* data;
64 
65 public:
66 	C81AeroData(
67 		int i_p, int i_dim,
68 		AeroData::UnsteadyModel u, integer p, const c81_data* d,
69 		DriveCaller *ptime = 0);
70 	virtual ~C81AeroData(void);
71 
72 	virtual std::ostream& Restart(std::ostream& out) const;
73 	virtual int GetForces(int i, const doublereal* W, doublereal* TNG, outa_t& OUTA);
74 	virtual int GetForcesJac(int i, const doublereal* W, doublereal* TNG, Mat6x6& J, outa_t& OUTA);
75 };
76 
77 /* C81AeroData - end */
78 
79 
80 /* C81MultipleAeroData - begin */
81 
82 struct C81AirfoilStation {
83 	integer profile;
84 	const c81_data *data;
85 	doublereal upper_bound;
86 };
87 
88 class C81MultipleAeroData : public AeroData {
89 protected:
90 	std::vector<unsigned> profiles;
91 	std::vector<doublereal> upper_bounds;
92 	std::vector<const c81_data *> data;
93 	integer curr_data;
94 
95 public:
96 	C81MultipleAeroData(
97 		int i_p, int i_dim,
98 		AeroData::UnsteadyModel u,
99 		std::vector<unsigned>& p,
100 		std::vector<doublereal>& ub,
101 		std::vector<const c81_data*>& d,
102 		DriveCaller *ptime = 0);
103 	~C81MultipleAeroData(void);
104 
105 	std::ostream& Restart(std::ostream& out) const;
106 	void SetSectionData(const doublereal& abscissa,
107 		const doublereal& chord,
108 		const doublereal& forcepoint,
109 		const doublereal& velocitypoint,
110 		const doublereal& twist,
111 		const doublereal& omega = 0.);
112 
113 	int GetForces(int i, const doublereal* W, doublereal* TNG, outa_t& OUTA);
114 	int GetForcesJac(int i, const doublereal* W, doublereal* TNG, Mat6x6& J, outa_t& OUTA);
115 };
116 
117 /* C81MultipleAeroData - end */
118 
119 /* C81InterpolatedAeroData - begin */
120 
121 class C81InterpolatedAeroData : public AeroData {
122 protected:
123 	std::vector<unsigned> profiles;
124 	std::vector<doublereal> upper_bounds;
125 	std::vector<const c81_data *> data;
126 
127 	std::vector<c81_data> i_data;
128 
129 public:
130 	C81InterpolatedAeroData(
131 		int i_p, int i_dim,
132 		AeroData::UnsteadyModel u,
133 		std::vector<unsigned>& p,
134 		std::vector<doublereal>& ub,
135 		std::vector<const c81_data *>& d,
136 		doublereal dcltol,
137 		DriveCaller *ptime = 0);
138 	~C81InterpolatedAeroData(void);
139 
140 	std::ostream& Restart(std::ostream& out) const;
141 	void SetSectionData(const doublereal& abscissa,
142 		const doublereal& chord,
143 		const doublereal& forcepoint,
144 		const doublereal& velocitypoint,
145 		const doublereal& twist,
146 		const doublereal& omega = 0.);
147 
148 	int GetForces(int i, const doublereal* W, doublereal* TNG, outa_t& OUTA);
149 	int GetForcesJac(int i, const doublereal* W, doublereal* TNG, Mat6x6& J, outa_t& OUTA);
150 };
151 
152 /* C81InterpolatedAeroData - end */
153 
154 /* TheodorsenAeroData - begin */
155 
156 class TheodorsenAeroData : public AeroData {
157 protected:
158 	integer iParam;
159 	doublereal d14, d34;
160 	doublereal chord;
161 	doublereal a;
162 	doublereal A1, A2, b1, b2;
163 	doublereal *alpha_pivot, *dot_alpha_pivot, *dot_alpha, *ddot_alpha;
164 	doublereal *cfx_0, *cfy_0, *cmz_0;
165 	doublereal *clalpha;
166 	doublereal *prev_alpha_pivot, *prev_dot_alpha;
167 	doublereal prev_time;
168 
169 	AeroData *pAeroData;
170 
171 public:
172 	TheodorsenAeroData(
173 		int i_p, int i_dim,
174 		AeroData *pa, DriveCaller *ptime = 0);
175 	virtual ~TheodorsenAeroData(void);
176 
177 	virtual std::ostream& Restart(std::ostream& out) const;
178 	virtual void SetAirData(const doublereal& rho, const doublereal& c);
179 
180 	virtual void SetSectionData(const doublereal& abscissa,
181 		const doublereal& chord,
182 		const doublereal& forcepoint,
183 		const doublereal& velocitypoint,
184 		const doublereal& twist,
185 		const doublereal& omega = 0.);
186 
187 
188 	// aerodynamic models with internal states
189 	virtual unsigned int iGetNumDof(void) const;
190 	virtual DofOrder::Order GetDofType(unsigned int i) const;
191 	virtual void
192 	AssRes(SubVectorHandler& WorkVec,
193 		doublereal dCoef,
194 		const VectorHandler& XCurr,
195 		const VectorHandler& XPrimeCurr,
196 		integer iFirstIndex, integer iFirstSubIndex,
197 		int i, const doublereal* W, doublereal* TNG, outa_t& OUTA);
198 	virtual void
199 	AssJac(FullSubMatrixHandler& WorkMat,
200 		doublereal dCoef,
201 		const VectorHandler& XCurr,
202 		const VectorHandler& XPrimeCurr,
203 		integer iFirstIndex, integer iFirstSubIndex,
204 		const Mat3xN& vx, const Mat3xN& wx, Mat3xN& fq, Mat3xN& cq,
205 		int i, const doublereal* W, doublereal* TNG, Mat6x6& J, outa_t& OUTA);
206 	virtual void
207 	AfterConvergence( int i, const VectorHandler& X, const VectorHandler& XP );
208 };
209 
210 /* TheodorsenAeroData - end */
211 
212 #endif // AERODATA_IMPL_H
213 
214