38 #include "ac/getopt.h"
50 for (
int i = 0; i < n; i++) {
51 v[i] = w1*v1[i] + w2*v2[i];
63 for (
int m = 0; m < NM; m++) {
67 for (
int a = 0;
a < NA;
a++) {
71 for (
int m = 0; m < NM; m++) {
72 for (; mt < NM_to; mt++) {
73 if (m_to[mt] >= m_dst[m]) {
82 &a_to[NA*(1 + mt)], wto,
86 }
else if (mt == 0 || m_to[mt] == m_dst[m]) {
88 &a_to[NA*(1 + mt)], wto,
97 &a_to[NA*(mt + 1)], d2,
122 *a_from, *a_to, *a_dst, *m_from, *m_to, *m_dst;
124 a_from = data_from->
al;
127 m_from = data_from->
ml;
132 NM_to = data_to->
NML;
133 merge_data_from(NA, NM, NM_to, wfrom, wto, workv, m_from, m_to, m_dst, a_from, a_to, a_dst);
135 a_from = data_from->
ad;
138 m_from = data_from->
md;
143 NM_to = data_to->
NMD;
144 merge_data_from(NA, NM, NM_to, wfrom, wto, workv, m_from, m_to, m_dst, a_from, a_to, a_dst);
146 a_from = data_from->
am;
149 m_from = data_from->
mm;
154 NM_to = data_to->
NMM;
155 merge_data_from(NA, NM, NM_to, wfrom, wto, workv, m_from, m_to, m_dst, a_from, a_to, a_dst);
170 for (
int m = 0; m < NM; m++) {
174 for (
int a = 0;
a < NA;
a++) {
178 for (
int m = 0; m < NM; m++) {
179 for (; mf < NM_from; mf++) {
180 if (m_from[mf] >= m_dst[m]) {
189 &a_to[NA*(1 + m)], wto,
193 }
else if (mf == 0 || m_from[mf] == m_dst[m]) {
195 &a_to[NA*(1 + m)], wto,
202 doublereal d2 = (m_dst[m] - m_from[mf - 1])/dd;
204 &a_from[NA*(mf + 1)], d2,
207 &a_to[NA*(1 + m)], wto,
229 *a_from, *a_to, *a_dst, *m_from, *m_to, *m_dst;
231 a_from = data_from->
al;
234 m_from = data_from->
ml;
239 NM_from = data_from->
NML;
240 merge_data_to(NA, NM, NM_from, wfrom, wto, workv, m_from, m_to, m_dst, a_from, a_to, a_dst);
242 a_from = data_from->
ad;
245 m_from = data_from->
md;
250 NM_from = data_from->
NMD;
251 merge_data_to(NA, NM, NM_from, wfrom, wto, workv, m_from, m_to, m_dst, a_from, a_to, a_dst);
253 a_from = data_from->
am;
256 m_from = data_from->
mm;
261 NM_from = data_from->
NMM;
262 merge_data_to(NA, NM, NM_from, wfrom, wto, workv, m_from, m_to, m_dst, a_from, a_to, a_dst);
287 header[31] = {
'\0' },
291 int rc = EXIT_SUCCESS;
295 MODE_UNDEFINED, MODE_FROM, MODE_TO, MODE_BOTH
296 } mode = MODE_UNDEFINED;
299 int opt =
getopt(argc, argv,
"f:hH:m:o:s:t:");
307 if (name_from != 0) {
308 silent_cerr(
"-f already set to \"" << name_from <<
"\"" << std::endl);
314 if (header[0] !=
'\0') {
315 silent_cerr(
"-h already set to \"" << header <<
"\"" << std::endl);
317 memcpy(header,
optarg,
sizeof(header));
324 silent_cerr(
"-m already set to \"FROM\"" << std::endl);
328 silent_cerr(
"-m already set to \"TO\"" << std::endl);
332 silent_cerr(
"-m already set to \"BOTH\"" << std::endl);
339 if (strcasecmp(
optarg,
"from") == 0) {
342 }
else if (strcasecmp(
optarg,
"to") == 0) {
345 }
else if (strcasecmp(
optarg,
"both") == 0) {
349 silent_cerr(
"unknown mode \"" <<
optarg <<
"\"" <<std::endl);
356 silent_cerr(
"-o already set to \"" << name <<
"\"" << std::endl);
363 silent_cerr(
"-s already set to " << dFrom << std::endl);
365 dFrom = strtod(
optarg, &next);
366 if (next ==
optarg || next[0] !=
'\0') {
367 silent_cerr(
"illegal value \"" <<
optarg <<
"\" for -s option" << std::endl);
370 if (dFrom < 0. || dFrom > 1.) {
371 silent_cerr(
"-s " <<
optarg <<
" is out of bounds (0.,1.)" << std::endl);
378 silent_cerr(
"-t already set to \"" << name_to <<
"\"" << std::endl);
389 "c81merge: merges two c81 files in a given proportion\n"
391 "\t-f first.c81\t" "first c81 data set\n"
392 "\t-h\t\t" "this message\n"
393 "\t-H header\t" "the header (max 30 chars)\n"
394 "\t-m {from|to|both}\t" "use alpha/mach of \"from\", \"to\" or both\n"
395 "\t-o out.c81\t" "output file name (stdout if missing)\n"
396 "\t-s s in [0,1]\t" "real number; result = s * first + (1 - s) * second\n"
397 "\t-t second.c81\t" "second c81 data set\n"
404 if (name_from == 0) {
405 silent_cerr(
"missing required -f \"from\" parameter" << std::endl);
410 silent_cerr(
"missing required -t \"to\" parameter" << std::endl);
415 silent_cerr(
"missing required -s \"fraction\" parameter" << std::endl);
419 if (mode == MODE_UNDEFINED) {
430 silent_cerr(
"unable to open file \"" << name_from <<
"\"" << std::endl);
436 silent_cerr(
"unable to read c81 data from file \"" << name_from <<
"\"" << std::endl);
444 silent_cerr(
"unable to open file \"" << name_to <<
"\"" << std::endl);
450 silent_cerr(
"unable to read c81 data from file \"" << name_to <<
"\"" << std::endl);
456 if (data_from.
NAL != data_to.
NAL) {
457 silent_cerr(
"number of AoA values for Cl differ ("
458 << data_from.
NAL <<
" vs. " << data_to.
NAL
459 <<
")" << std::endl);
463 for (
int i = 0; i < data_from.
NAL; i++) {
464 if (data_from.
al[i] != data_to.
al[i]) {
465 silent_cerr(
"AoA value " << i <<
" for Cl differs ("
466 << data_from.
al[i] <<
" vs. "
467 << data_to.
al[i] <<
")"
473 if (data_from.
NAD != data_to.
NAD) {
474 silent_cerr(
"number of AoA values for Cd differ ("
475 << data_from.
NAD <<
" vs. " << data_to.
NAD
476 <<
")" << std::endl);
480 for (
int i = 0; i < data_from.
NAL; i++) {
481 if (data_from.
ad[i] != data_to.
ad[i]) {
482 silent_cerr(
"AoA value " << i <<
" for Cd differs ("
483 << data_from.
ad[i] <<
" vs. "
484 << data_to.
ad[i] <<
")"
490 if (data_from.
NAM != data_to.
NAM) {
491 silent_cerr(
"number of AoA values for Cm differ ("
492 << data_from.
NAM <<
" vs. " << data_to.
NAM
493 <<
")" << std::endl);
497 for (
int i = 0; i < data_from.
NAL; i++) {
498 if (data_from.
am[i] != data_to.
am[i]) {
499 silent_cerr(
"AoA value " << i <<
" for Cm differs ("
500 << data_from.
am[i] <<
" vs. "
501 << data_to.
am[i] <<
")"
525 memcpy(data.
header, header,
sizeof(header));
528 silent_cerr(
"data merge failed" << std::endl);
533 std::ofstream fout(name);
535 silent_cerr(
"unable to open file \"" << name <<
"\"" << std::endl);
545 silent_cerr(
"output failed" << std::endl);
#define MBDYN_EXCEPT_ARGS
static int c81_data_merge_to(c81_data *data_from, doublereal wfrom, c81_data *data_to, doublereal wto, c81_data *data)
static int c81_data_merge_both(c81_data *data_from, doublereal wfrom, c81_data *data_to, doublereal wto, c81_data *data)
static void merge_vecs(int n, doublereal *v1, doublereal w1, doublereal *v2, doublereal w2, doublereal *v)
static int c81_data_merge_from(c81_data *data_from, doublereal wfrom, c81_data *data_to, doublereal wto, c81_data *data)
int c81_data_read(std::istream &in, c81_data *data, const doublereal dcltol, int *ff)
int main(int argc, char *argv[])
int getopt(int argc, char *const argv[], const char *opts)
static void merge_data_from(int NA, int NM, int NM_to, doublereal wfrom, doublereal wto, doublereal *workv, doublereal *m_from, doublereal *m_to, doublereal *m_dst, doublereal *a_from, doublereal *a_to, doublereal *a_dst)
static const doublereal a
int c81_data_write(std::ostream &out, c81_data *data)
static void merge_data_to(int NA, int NM, int NM_from, doublereal wfrom, doublereal wto, doublereal *workv, doublereal *m_from, doublereal *m_to, doublereal *m_dst, doublereal *a_from, doublereal *a_to, doublereal *a_dst)