76 i = strtol(from, &endptr, 10);
77 int save_errno = errno;
78 if (endptr != NULL && endptr[0] !=
'\0' && !isspace(endptr[0])) {
81 }
else if (save_errno == ERANGE) {
82 silent_cerr(
"c81data: warning, int "
83 << std::string(from, endptr - from)
84 <<
" overflows" << std::endl);
93 #if 0 // unused so far
95 get_long(
const char *
const from,
long &l)
100 l = strtol(from, &endptr, 10);
101 int save_errno = errno;
102 if (endptr != NULL && endptr[0] !=
'\0' && !isspace(endptr[0])) {
105 }
else if (save_errno == ERANGE) {
106 silent_cerr(
"c81data: warning, int "
107 << std::string(from, endptr - from)
108 <<
" overflows" << std::endl);
124 d = strtod(from, &endptr);
125 int save_errno = errno;
126 if (endptr != NULL && endptr[0] !=
'\0' && !isspace(endptr[0])) {
129 }
else if (save_errno == ERANGE) {
130 silent_cerr(
"c81data: warning, double "
131 << std::string(from, endptr - from)
132 <<
" overflows" << std::endl);
146 if (!in || v == NULL || ncols < 1) {
150 for (
int c = 0;
c < ncols;
c++) {
155 in.getline(buf,
sizeof(buf));
159 memcpy(tmp, &buf[7*(i + 1)], 7);
173 for (
int i = 1; i < n; i++) {
174 if (v[i] <= v[i - 1]) {
187 if (!in || m == NULL || nrows < 1 || ncols < 1) {
191 for (
int r = 0; r < nrows; r++) {
195 for (
int c = 0;
c < ncols;
c++) {
197 int i = (
c - offset)%(9 - offset + 1);
203 in.getline(buf,
sizeof(buf));
207 memcpy(tmp, &buf[7*(i + offset)], 7);
226 out << std::setw(7) << v[0];
230 out << std::setw(7) <<
"";
233 for (
int i = 0; i < (ncols-1)/N; i++) {
234 for (
int j = 0; j < N; j++) {
235 out << std::setw(7) << v[start+dim*j];
237 out << std::endl << std::setw(7) <<
"";
241 for (
int j = 0; j < (ncols-1)%N+1; j++) {
242 out << std::setw(7) << v[start+dim*j];
252 if (!out || v == NULL || nrows < 1) {
264 if (!out || m == NULL || nrows < 1 || ncols < 1) {
268 for (
int i = 0; i < nrows; i++) {
287 delete[] data->
stall;
301 in.getline(buf,
sizeof(buf));
302 if (strncasecmp(buf,
"# FREE FORMAT",
STRLENOF(
"# FREE FORMAT")) == 0) {
340 if (data->
NAM <= 0 || data->
NMM <= 0
341 || data->
NAD <= 0 || data->
NMD <= 0
342 || data->
NAL <= 0 || data->
NML <= 0) {
347 strncpy(data->
header, buf, 30);
406 ASSERT(upper_bounds != 0);
412 if (dCsi < upper_bounds[0]) {
413 silent_cerr(
"cannot find C81 data lower bound for point xi=" << dCsi << std::endl);
418 for (
unsigned i = 1; i < ndata; i++) {
419 if (upper_bounds[i] > dCsi) {
425 silent_cerr(
"cannot find C81 data upper bound for point xi=" << dCsi << std::endl);
430 if (
unsigned(from) == ndata) {
431 silent_cerr(
"cannot find C81 data upper bound for point xi=" << dCsi << std::endl);
440 if (data[from]->NML != data[to]->NML) {
441 silent_cerr(
"number of Mach points for Cl between airfoils "
442 << from <<
" (" << data[from]->NML <<
") and "
443 << to <<
" (" << data[to]->NML <<
") do not match"
448 if (data[from]->NAL != data[to]->NAL) {
449 silent_cerr(
"number of AoA points for Cl between airfoils "
450 << from <<
" (" << data[from]->NAL <<
") and "
451 << to <<
" (" << data[to]->NAL <<
") do not match"
456 if (data[from]->NMD != data[to]->NMD) {
457 silent_cerr(
"number of Mach points for Cd between airfoils "
458 << from <<
" (" << data[from]->NMD <<
") and "
459 << to <<
" (" << data[to]->NMD <<
") do not match"
464 if (data[from]->NAD != data[to]->NAD) {
465 silent_cerr(
"number of AoA points for Cd between airfoils "
466 << from <<
" (" << data[from]->NAD <<
") and "
467 << to <<
" (" << data[to]->NAD <<
") do not match"
472 if (data[from]->NMM != data[to]->NMM) {
473 silent_cerr(
"number of Mach points for Cm between airfoils "
474 << from <<
" (" << data[from]->NMM <<
") and "
475 << to <<
" (" << data[to]->NMM <<
") do not match"
480 if (data[from]->NAM != data[to]->NAM) {
481 silent_cerr(
"number of AoA points for Cm between airfoils "
482 << from <<
" (" << data[from]->NAM <<
") and "
483 << to <<
" (" << data[to]->NAM <<
") do not match"
488 for (
int i = 0; i < data[from]->
NML; i++) {
489 if (data[from]->ml[i] != data[to]->ml[i]) {
490 silent_cerr(
"Mach point " << i <<
"for Cl of airfoils "
491 << from <<
" (" << data[from]->ml[i] <<
") and "
492 << to <<
" (" << data[to]->ml[i] <<
") differs"
498 for (
int i = 0; i < data[from]->
NAL; i++) {
499 if (data[from]->al[i] != data[to]->al[i]) {
500 silent_cerr(
"AoA point " << i <<
"for Cl of airfoils "
501 << from <<
" (" << data[from]->al[i] <<
") and "
502 << to <<
" (" << data[to]->al[i] <<
") differs"
508 for (
int i = 0; i < data[from]->
NMD; i++) {
509 if (data[from]->md[i] != data[to]->md[i]) {
510 silent_cerr(
"Mach point " << i <<
"for Cd of airfoils "
511 << from <<
" (" << data[from]->md[i] <<
") and "
512 << to <<
" (" << data[to]->md[i] <<
") differs"
518 for (
int i = 0; i < data[from]->
NAD; i++) {
519 if (data[from]->ad[i] != data[to]->ad[i]) {
520 silent_cerr(
"AoA point " << i <<
"for Cd of airfoils "
521 << from <<
" (" << data[from]->ad[i] <<
") and "
522 << to <<
" (" << data[to]->ad[i] <<
") differs"
528 for (
int i = 0; i < data[from]->
NMM; i++) {
529 if (data[from]->mm[i] != data[to]->mm[i]) {
530 silent_cerr(
"Mach point " << i <<
"for Cm of airfoils "
531 << from <<
" (" << data[from]->mm[i] <<
") and "
532 << to <<
" (" << data[to]->mm[i] <<
") differs"
538 for (
int i = 0; i < data[from]->
NAM; i++) {
539 if (data[from]->am[i] != data[to]->am[i]) {
540 silent_cerr(
"AoA point " << i <<
"for Cm of airfoils "
541 << from <<
" (" << data[from]->am[i] <<
") and "
542 << to <<
" (" << data[to]->am[i] <<
") differs"
549 "interpolated (\"%s\"[%e]->\"%s\"[%e]: [%e])",
550 data[from]->
header, upper_bounds[from],
551 data[to]->
header, upper_bounds[to], dCsi);
553 i_data->
NML = data[from]->
NML;
554 i_data->
NAL = data[from]->
NAL;
555 i_data->
NMD = data[from]->
NMD;
556 i_data->
NAD = data[from]->
NAD;
557 i_data->
NMM = data[from]->
NMM;
558 i_data->
NAM = data[from]->
NAM;
560 doublereal dw = upper_bounds[to] - upper_bounds[from];
561 doublereal dw_from = (upper_bounds[to] - dCsi)/dw;
562 doublereal dw_to = (dCsi - upper_bounds[from])/dw;
566 for (
int i = 0; i < i_data->
NML; i++) {
567 i_data->
ml[i] = data[from]->
ml[i];
570 for (
int i = 0; i < i_data->
NAL; i++) {
571 i_data->
al[i] = data[from]->
al[i];
573 for (
int i = i_data->
NAL; i < (i_data->
NML + 1)*i_data->
NAL; i++) {
574 i_data->
al[i] = dw_from*data[from]->
al[i] + dw_to*data[to]->
al[i];
579 for (
int i = 0; i < i_data->
NMD; i++) {
580 i_data->
md[i] = data[from]->
md[i];
583 for (
int i = 0; i < i_data->
NAD; i++) {
584 i_data->
ad[i] = data[from]->
ad[i];
586 for (
int i = i_data->
NAD; i < (i_data->
NMD + 1)*i_data->
NAD; i++) {
587 i_data->
ad[i] = dw_from*data[from]->
ad[i] + dw_to*data[to]->
ad[i];
592 for (
int i = 0; i < i_data->
NMM; i++) {
593 i_data->
mm[i] = data[from]->
mm[i];
596 for (
int i = 0; i < i_data->
NAM; i++) {
597 i_data->
am[i] = data[from]->
am[i];
599 for (
int i = i_data->
NAM; i < (i_data->
NMM + 1)*i_data->
NAM; i++) {
600 i_data->
am[i] = dw_from*data[from]->
am[i] + dw_to*data[to]->
am[i];
616 std::ios::fmtflags tmpflags;
617 tmpflags = out.flags(std::ios::left);
618 out << std::setw(30) << data->
header;
621 << std::setw(2) << data->
NML
622 << std::setw(2) << data->
NAL
623 << std::setw(2) << data->
NMD
624 << std::setw(2) << data->
NAD
625 << std::setw(2) << data->
NMM
626 << std::setw(2) << data->
NAM
646 for (r = 0; r < NC/8; r++) {
649 in.getline(buf,
sizeof(buf));
651 for (
int c = 7;
c >= 0;
c--) {
652 buf[10*(
c + 1)] =
'\0';
662 in.getline(buf,
sizeof(buf));
664 for (
int c = NC%8 - 1;
c >= 0;
c--) {
665 buf[10*(
c + 1)] =
'\0';
678 for (
int i = 0; i < NR; i++) {
681 for (r = 0; r < NC/8; r++) {
684 in.getline(buf,
sizeof(buf));
686 for (
int c = 7;
c >= 0;
c--) {
687 buf[10*(
c + 1)] =
'\0';
697 in.getline(buf,
sizeof(buf));
699 for (
int c = NC%8 - 1;
c >= 0;
c--) {
700 buf[10*(
c + 1)] =
'\0';
716 in.getline(buf,
sizeof(buf));
728 if (NA <= 0 || NM <= 0) {
748 in.getline(buf,
sizeof(buf));
764 in.getline(buf,
sizeof(buf));
769 int realNA = (neg + NA + pos);
780 for (
int c = 0;
c < 2;
c++) {
781 for (
int r = 0; r < pos; r++) {
782 da[realNA*
c + neg + NA + r] = posda[pos*
c + r];
786 for (
int c = 2;
c < NM + 1;
c++) {
787 for (
int r = 0; r < neg; r++) {
788 da[realNA*
c + r] = da[realNA + r];
790 for (
int r = 0; r < pos; r++) {
791 da[realNA*
c + neg + NA + r] = posda[pos + r];
795 for (
int c = 0;
c < (NM + 1);
c++) {
796 for (
int r = 0; r < NA; r++) {
797 da[realNA*
c + neg + r] = tmpda[NA*
c + r];
815 in.getline(buf,
sizeof(buf));
822 in.getline(buf,
sizeof(buf));
825 while (isspace(p[0])) {
829 if (!p[0] || strncasecmp(p,
"cl", 2) != 0 || (p[2] !=
'\0' && !isspace(p[2]))) {
837 in.getline(buf,
sizeof(buf));
840 while (isspace(p[0])) {
844 if (!p[0] || strncasecmp(p,
"cd", 2) != 0 || (p[2] !=
'\0' && !isspace(p[2]))) {
852 in.getline(buf,
sizeof(buf));
855 while (isspace(p[0])) {
859 if (!p[0] || strncasecmp(p,
"cm", 2) != 0 || (p[2] !=
'\0' && !isspace(p[2]))) {
879 in.getline(buf,
sizeof(buf));
886 in.getline(buf,
sizeof(buf));
891 silent_cerr(
"NREL format: can only handle one airfoil per file (got " << n <<
")" << std::endl);
896 for (
int i = 0; i < 12; i++) {
898 in.getline(buf,
sizeof(buf));
901 std::streampos pos = in.tellg();
902 for (n = 0; in; n++) {
903 in.getline(buf,
sizeof(buf));
911 silent_cerr(
"insufficient number of data points n=" << n <<
" in NREL data format (n >= 2 required)" << std::endl);
936 for (
int i = 0; i < n; i++) {
938 in >> alpha >> cl >> cd >> cm;
940 if (i == 0 && alpha != -180.) {
941 silent_cerr(
"warning: NREL data format: first alpha=" << alpha <<
" != -180.)" << std::endl);
942 }
else if (i == n - 1 && alpha != 180.) {
943 silent_cerr(
"warning: NREL data format: last alpha=" << alpha <<
" != 180.)" << std::endl);
947 data->
al[data->
NAL + i] = cl;
949 data->
ad[data->
NAD + i] = cd;
951 data->
am[data->
NAM + i] = cm;
966 in.getline(buf,
sizeof(buf));
967 if (strncasecmp(buf,
"# FREE FORMAT",
STRLENOF(
"# FREE FORMAT")) == 0) {
968 in.getline(buf,
sizeof(buf));
971 char *p = std::strchr(buf,
';');
977 if (
size_t(p - buf) < len) {
978 len = size_t(p - buf);
981 strncpy(data->
header, buf, len);
984 std::istringstream s(++p);
993 if (data->
NAM <= 0 || data->
NMM <= 0
994 || data->
NAD <= 0 || data->
NMD <= 0
995 || data->
NAL <= 0 || data->
NML <= 0) {
1001 for (
int c = 0;
c < data->
NML;
c++) {
1009 for (
int r = 0; r < data->
NAL; r++) {
1012 for (
int c = 0;
c <= data->
NML;
c++) {
1013 in >> data->
al[r + data->
NAL*
c];
1022 for (
int c = 0;
c < data->
NMD;
c++) {
1030 for (
int r = 0; r < data->
NAD; r++) {
1031 for (
int c = 0;
c <= data->
NMD;
c++) {
1032 in >> data->
ad[r + data->
NAD*
c];
1041 for (
int c = 0;
c < data->
NMM;
c++) {
1049 for (
int r = 0; r < data->
NAM; r++) {
1050 for (
int c = 0;
c <= data->
NMM;
c++) {
1051 in >> data->
am[r + data->
NAM*
c];
1071 out <<
"# FREE FORMAT" << std::endl;
1073 out << data->
header <<
";"
1083 for (
int c = 0;
c < data->
NML;
c++) {
1084 out << data->
ml[
c] <<
" ";
1087 for (
int r = 0; r < data->
NAL; r++) {
1090 for (
int c = 0;
c <= data->
NML;
c++) {
1091 out << data->
al[r + data->
NAL*
c] <<
" ";
1097 for (
int c = 0;
c < data->
NMD;
c++) {
1098 out << data->
md[
c] <<
" ";
1101 for (
int r = 0; r < data->
NAD; r++) {
1102 for (
int c = 0;
c <= data->
NMD;
c++) {
1103 out << data->
ad[r + data->
NAD*
c] <<
" ";
1109 for (
int c = 0;
c < data->
NMM;
c++) {
1110 out << data->
mm[
c] <<
" ";
1113 for (
int r = 0; r < data->
NAM; r++) {
1114 for (
int c = 0;
c <= data->
NMM;
c++) {
1115 out << data->
am[r + data->
NAM*
c] <<
" ";
1130 if (__c81_pdata == NULL) {
1133 return __c81_pdata[jpro];
1139 if (__c81_pdata == NULL || jpro >= c81_ndata) {
1143 if (jpro >= c81_ndata) {
1148 if (__c81_pdata != NULL) {
1149 for (
int i = 0; i < ndata; i++) {
1150 pp[i] = __c81_pdata[i];
1156 }
else if (__c81_pdata[jpro] != NULL) {
1157 silent_cerr(
"profile " << jpro <<
"already defined" << std::endl);
1161 __c81_pdata[jpro] = data;
1172 for (
int nm = 0; nm < NM; nm++) {
1173 int start = NA*(nm + 1);
1177 while (a[na] > 0.) {
1180 silent_cerr(
"do_stall: "
1181 "unable to find negative alpha range "
1182 "for Mach #" << nm + 1 << std::endl);
1187 while (a[na] < 0.) {
1190 silent_cerr(
"do_stall: "
1191 "unable to find positive alpha range "
1192 "for Mach #" << nm + 1 << std::endl);
1200 doublereal dcla0 = (a[start + na + 1] - dcl0)/(a[na + 1] - a0);
1204 stall[NM + nm] = 1.;
1205 stall[2*NM + nm] = 0.;
1207 for (
int i = na + 2; i < NA; i++) {
1208 doublereal dcla = (a[start + i] - dcl0)/(a[i] - a0);
1209 if (dcla - dcla0 < -dcla0*dcltol) {
1212 stall[nm] = a[i - 1];
1215 stall[2*NM + nm] = a[start + i - 1];
1220 dcla0 = (a[start + na - 1] - dcl0)/(a[na - 1] - a0);
1223 for (
int i = na - 2; i >= 0; i--) {
1224 doublereal dcla = (a[start + i] - dcl0)/(a[i] - a0);
1225 if (dcla - dcla0 < -dcla0*dcltol) {
1228 stall[NM + nm] = a[i + 1];
1231 stall[2*NM + nm] -= a[start + i + 1];
1234 stall[2*NM + nm] /= (stall[nm] - stall[NM + nm]);
1246 if (data == NULL || data->
NML <= 0 || data->
NMM <= 0) {
1263 for (
int m = 0; m <= NM; m++) {
1268 for (
int a = 0;
a < NA/2;
a++) {
1270 v[
a] = s*v[NA -
a - 1];
1271 v[NA -
a - 1] = s*d;
static int get_c81_vec(std::istream &in, doublereal *v, int ncols)
int read_fc511_row(std::istream &in, doublereal *d, int NC)
int read_fc511_mat(std::istream &in, doublereal *d, int NR, int NC)
int c81_data_do_stall(c81_data *data, const doublereal dcltol)
void c81_data_destroy(c81_data *data)
static int get_double(const char *const from, doublereal &d)
int c81_data_write_free_format(std::ostream &out, c81_data *data)
int c81_data_flip(c81_data *data)
static int get_int(const char *const from, int &i)
int c81_data_read_free_format(std::istream &in, c81_data *data, const doublereal dcltol)
int c81_data_read(std::istream &in, c81_data *data, const doublereal dcltol, int *ff)
static int put_c81_row(std::ostream &out, doublereal *v, int dim, int ncols, int first=0)
static int put_c81_vec(std::ostream &out, doublereal *v, int nrows)
int c81_data_merge(unsigned ndata, const c81_data **data, const doublereal *upper_bounds, doublereal dCsi, doublereal dcltol, c81_data *i_data)
#define ASSERT(expression)
static int get_c81_mat(std::istream &in, doublereal *m, int nrows, int ncols)
static int flip_one(int NM, int NA, doublereal *v, int ss)
for(int i=0;i< 3;++i) for(int j=0
static std::stack< cleanup * > c
int c81_data_fc511_read(std::istream &in, c81_data *data, const doublereal dcltol)
static int put_c81_mat(std::ostream &out, doublereal *m, int nrows, int ncols)
c81_data * get_c81_data(long int jpro)
int c81_data_nrel_read(std::istream &in, c81_data *data, const doublereal dcltol)
static int check_vec(doublereal *v, int n)
int read_fc511_block(std::istream &in, int &NA, int &NM, doublereal *&da, doublereal *&dm)
static const doublereal a
static c81_data ** __c81_pdata
static doublereal buf[BUFSIZE]
int c81_data_set(long int jpro, c81_data *data)
int c81_data_write(std::ostream &out, c81_data *data)
static int do_stall(int NM, int NA, doublereal *a, doublereal *stall, const doublereal dcltol)