13 #ifndef four_digit_hpp
14 #define four_digit_hpp
21 #include "eli/code_eli.hpp"
31 template<
typename data__>
56 data_type
get_u_min()
const {
return static_cast<data_type
>(-1);}
57 data_type
get_u_max()
const {
return static_cast<data_type
>(1);}
78 bool set_camber(
const data_type &cam,
const data_type &cam_loc)
80 if ( (cam<50) && (cam_loc<10) && (cam_loc>0))
95 std::istringstream istr(name);
99 istr >> std::setw(4) >> buffer;
100 if ((buffer ==
"NACA") || (buffer ==
"naca") || (buffer==
"Naca"))
102 unsigned short mm, pp;
103 char buf[3] =
"\n\n";
105 istr >> std::setw(4) >> buffer;
106 buf[0]=buffer[0]; mm=std::atoi(buf);
107 buf[0]=buffer[1]; pp=std::atoi(buf);
123 std::ostringstream str;
130 point_type
f(
const data_type &xi)
const
132 point_type x, xp, xpp;
139 point_type
fp(
const data_type &xi)
const
141 point_type x, xp, xpp;
148 point_type
fpp(
const data_type &xi)
const
150 point_type x, xp, xpp;
157 void evaluate(point_type &x, point_type &xp, point_type &xpp,
const data_type &xi)
const
160 assert((xi>=-1) && (xi<=1));
162 data_type xc, xcp, yc, ycp, ycpp, ycppp, yt, ytp, ytpp;
163 const data_type one(1), two(2), three(3);
193 data_type tmp1, cos_theta, cos2_theta, cos3_theta, sin_theta;
195 tmp1=std::sqrt(one+ycp*ycp);
198 cos2_theta=cos_theta*cos_theta;
199 cos3_theta=cos2_theta*cos_theta;
202 x(0)=xc-yt*sin_theta;
203 x(1)=yc+yt*cos_theta;
204 xp(0)=xcp-ytp*sin_theta-yt*cos3_theta*ycpp;
205 xp(1)=ycp+ytp*cos_theta-yt*cos2_theta*sin_theta*ycpp;
206 xpp(0)=-ytpp*sin_theta-two*ytp*cos3_theta*ycpp
207 +yt*cos2_theta*(three*cos2_theta*sin_theta*ycpp*ycpp-ycppp);
208 xpp(1)=ycpp+ytpp*cos_theta-two*ytp*sin_theta*cos2_theta*ycpp
209 -yt*cos_theta*((two-cos2_theta)*cos2_theta*ycpp*ycpp-sin_theta*ycppp);
214 point_type tgt(
fp(xi));
223 data_type ten(10), one_hundred(100);
232 typedef Eigen::Matrix<data_type, 5, 5> coefficient_matrix_type;
234 coefficient_matrix_type coef_mat;
235 coefficient_type rhs;
236 coefficient_type orig_a;
239 orig_a << static_cast<data_type>(0.2969),
240 static_cast<data_type
>(-0.1260),
241 static_cast<data_type
>(-0.3516),
242 static_cast<data_type
>(0.2843),
243 static_cast<data_type
>(-0.1015);
266 rhs(0)=
static_cast<data_type
>(0);
267 a=coef_mat.lu().solve(rhs);
270 template<
typename Derived1>
271 static void calc_four_digit_args(Eigen::MatrixBase<Derived1> &A,
const typename Derived1::Index &i,
const data_type &xi)
273 data_type xi2(xi*xi), xi3(xi2*xi), xi4(xi3*xi);
275 A(i,0)=std::sqrt(xi);
282 template<
typename Derived1>
285 data_type xi2(xi*xi), xi3(xi2*xi);
287 A(i,0)=
static_cast<data_type
>(0.5)/std::sqrt(xi);
288 A(i,1)=
static_cast<data_type
>(1);
289 A(i,2)=
static_cast<data_type
>(2)*xi;
290 A(i,3)=
static_cast<data_type
>(3)*xi2;
291 A(i,4)=
static_cast<data_type
>(4)*xi3;
293 void calc_camber(data_type &y, data_type &yp, data_type &ypp, data_type &yppp,
const data_type &xi,
bool lower)
const
296 assert((xi>=0) && (xi<=1));
298 data_type zero(0), one(1), two(2);
313 data_type pm2=
p/(
m*
m);
315 y=pm2*(xi*(two*
m-xi));
322 data_type p1m2=
p/(one+
m*(
m-two));
324 y=p1m2*(one-two*
m+xi*(two*
m-xi));
337 void calc_thickness(data_type &y, data_type &yp, data_type &ypp,
const data_type &xi,
bool lower)
const
340 assert((xi>=0) && (xi<=1));
342 const data_type zero(0), one(1), two(2), three(3), four(4), six(6), twelve(12), half(one/two), quarter(one/four);
343 const data_type xi2(xi*xi), xi3(xi*xi2), xi4(xi2*xi2), sqrtxi(std::sqrt(xi));
344 const data_type trat(
t/static_cast<data_type>(0.20));
358 yp=one/std::numeric_limits<data_type>::epsilon();
365 yp=trat*(
a.sum()-half*
a(0));
366 ypp=trat*(-quarter*
a(0)+two*
a(2)+six*
a(3)+twelve*
a(4));
374 y=trat*(
a(0)*sqrtxi+
a(1)*xi+
a(2)*xi2+
a(3)*xi3+
a(4)*xi4);
375 yp=trat*(half*
a(0)/sqrtxi+
a(1)+two*
a(2)*xi+three*
a(3)*xi2+four*
a(4)*xi3);
376 ypp=trat*(-quarter*
a(0)/sqrtxi/xi+two*
a(2)+six*
a(3)*xi+twelve*
a(4)*xi2);
point_type f(const data_type &xi) const
Definition: four_digit.hpp:130
data_type get_u_max() const
Definition: four_digit.hpp:57
data_type t
Definition: four_digit.hpp:395
data_type m
Definition: four_digit.hpp:393
static void calc_four_digit_der_args(Eigen::MatrixBase< Derived1 > &A, const typename Derived1::Index &i, const data_type &xi)
Definition: four_digit.hpp:283
point_type tangent(const data_type &xi) const
Definition: four_digit.hpp:212
four_digit(const four_digit< data_type > &fs)
Definition: four_digit.hpp:46
data_type thickness
Definition: four_digit.hpp:386
void calc_thickness(data_type &y, data_type &yp, data_type &ypp, const data_type &xi, bool lower) const
Definition: four_digit.hpp:337
four_digit()
Definition: four_digit.hpp:40
void recalc_coefficients()
Definition: four_digit.hpp:230
bool sharp_te
Definition: four_digit.hpp:396
coefficient_type a
Definition: four_digit.hpp:397
bool set_camber(const data_type &cam, const data_type &cam_loc)
Definition: four_digit.hpp:78
data_type camber_loc
Definition: four_digit.hpp:390
data_type get_thickness() const
Definition: four_digit.hpp:76
Eigen::Matrix< data_type, 5, 1 > coefficient_type
Definition: four_digit.hpp:37
std::string get_name() const
Definition: four_digit.hpp:121
coefficient_type get_thickness_coefficients() const
Definition: four_digit.hpp:54
point_type fpp(const data_type &xi) const
Definition: four_digit.hpp:148
data_type get_maximum_camber() const
Definition: four_digit.hpp:90
data_type camber
Definition: four_digit.hpp:388
bool set_name(const std::string &name)
Definition: four_digit.hpp:93
data_type get_u_min() const
Definition: four_digit.hpp:56
Eigen::Matrix< data_type, 1, 2 > point_type
Definition: four_digit.hpp:36
static void calc_four_digit_args(Eigen::MatrixBase< Derived1 > &A, const typename Derived1::Index &i, const data_type &xi)
Definition: four_digit.hpp:271
void calc_camber(data_type &y, data_type &yp, data_type &ypp, data_type &yppp, const data_type &xi, bool lower) const
Definition: four_digit.hpp:293
void recalc_params()
Definition: four_digit.hpp:221
void evaluate(point_type &x, point_type &xp, point_type &xpp, const data_type &xi) const
Definition: four_digit.hpp:157
Definition: four_digit.hpp:32
void set_sharp_trailing_edge(bool fl)
Definition: four_digit.hpp:59
data__ data_type
Definition: four_digit.hpp:35
data_type get_maximum_camber_location() const
Definition: four_digit.hpp:91
point_type fp(const data_type &xi) const
Definition: four_digit.hpp:139
bool set_thickness(const data_type &t)
Definition: four_digit.hpp:66
bool sharp_trailing_edge() const
Definition: four_digit.hpp:64
data_type p
Definition: four_digit.hpp:394