57 signal(signum, SIG_DFL);
64 return "EDGE is initializing; MBDyn waits";
67 return "EDGE is busy; MBDyn waits";
70 return "EDGE waits (is ready to read kinematics); MBDyn iterates";
73 return "EDGE is computing; MBDyn waits before reading forces";
76 return "EDGE converged; MBDyn advances one step";
79 return "EDGE wants to end simulation";
97 if (f == NULL && errno == ENOENT) {
98 fprintf(stderr,
"test_strext_edge: file \"%s\" missing\n", flag);
102 if (fgets(buf,
sizeof(buf), f) == NULL) {
103 fprintf(stderr,
"test_strext_edge: expecting \"UPDATE,N,0,0,1\", got nothing from file \"%s\"\n", flag);
108 if (strcmp(buf,
"UPDATE,N,0,0,1\n") != 0) {
109 size_t len = strlen(buf);
111 fprintf(stderr,
"test_strext_edge: expecting \"UPDATE,N,0,0,1\", got \"%s\" from file \"%s\"\n", buf, flag);
116 if (fgets(buf,
sizeof(buf), f) == NULL) {
117 fprintf(stderr,
"test_strext_edge: expecting \"FLAG,I,1,1,0\", got nothing from file \"%s\"\n", flag);
121 if (strcmp(buf,
"FLAG,I,1,1,0\n") != 0) {
122 size_t len = strlen(buf);
124 fprintf(stderr,
"test_strext_edge: expecting \"FLAG,I,1,1,0\", got \"%s\" from file \"%s\"\n", buf, flag);
129 rc = fread((
void *)&c, 1, 1, f);
132 fprintf(stderr,
"test_strext_edge: got %c (%s) from file \"%s\"\n", c,
cmd2str(c -
'0'), flag);
149 fprintf(stderr,
"test_strext_edge: sleeping %d s\n", sleeptime);
161 char ftmpname[] =
"mbedgeXXXXXX";
165 int filedes = mkstemp(ftmpname);
166 f = fdopen(filedes,
"w");
169 #endif // HAVE_MKSTEMP
171 f = fopen(flag,
"w");
175 int save_errno = errno;
176 fprintf(stderr,
"unable to open flag file \"%s\" for writing (%d: %s)\n",
177 flag, save_errno, strerror(save_errno));
181 fprintf(f,
"UPDATE,N,0,0,1\n");
182 fprintf(f,
"FLAG,I,1,1,0\n");
183 fprintf(f,
"%d", cmd);
188 if (rename(ftmpname, flag) == -1) {
195 int save_errno = errno;
196 fprintf(stderr,
"unable to rename flag file \"%s\" (errno=%d: %s)\n",
197 flag, save_errno, strerror(save_errno));
213 f = fopen(rdata,
"w");
215 int save_errno = errno;
217 fprintf(stderr,
"unable to open rigid data file \"%s\" (%d: %s)\n",
218 rdata, save_errno, strerror(save_errno));
223 "* rigid-body forces and moments\n"
224 "body_forces,R,1,6,0\n");
225 for (i = 0; i < 6; i++) {
226 fprintf(f,
"%e ", fm[i]);
240 f = fopen(mdata,
"w");
242 int save_errno = errno;
244 fprintf(stderr,
"unable to open modal data file \"%s\" (%d: %s)\n",
245 mdata, save_errno, strerror(save_errno));
251 "modal_force_flow,R,%d,1,0\n",
253 for (i = 0; i < modes; i++) {
254 fprintf(f,
"%e ", fg[i]);
268 f = fopen(ndata,
"w");
270 int save_errno = errno;
272 fprintf(stderr,
"unable to open nodal data file \"%s\" (%d: %s)\n",
273 ndata, save_errno, strerror(save_errno));
278 "ext_model, N, 0, 0, 2\n"
280 "grid_idents, IF, 1, %d, 0\n",
282 for (i = 0; i <
nodes; i++) {
283 if (i > 0) fputc(((i%6) == 0) ?
'\n' :
' ', f);
284 fprintf(f,
"%d", ul[i]);
288 fprintf(f,
"force, RF, 3, %d, 0\n", nodes);
289 for (i = 0; i <
nodes; i++) {
290 if (i > 0) fputc(((i%6) == 0) ?
'\n' :
' ', f);
291 fprintf(f,
"%e", fg[i]);
294 for (i = 0; i <
nodes; i++) {
295 if (i > 0) fputc(((i%6) == 0) ?
'\n' :
' ', f);
296 fprintf(f,
"%e", fg[nodes + i]);
299 for (i = 0; i <
nodes; i++) {
300 if (i > 0) fputc(((i%6) == 0) ?
'\n' :
' ', f);
301 fprintf(f,
"%e", fg[2*nodes + i]);
310 do_rigid0(
const char *rflag,
const char *rdata,
double *fm)
316 f = fopen(rflag,
"r");
318 int save_errno = errno;
319 if (save_errno == ENOENT) {
323 fprintf(stderr,
"unable to open rigid flag file \"%s\" (%d: %s)\n",
324 rflag, save_errno, strerror(save_errno));
332 for (i = 0; i < 6; i++) {
343 do_modal0(
const char *mflag,
const char *mdata,
int modes,
double **fgp)
349 f = fopen(mflag,
"r");
351 int save_errno = errno;
352 if (save_errno == ENOENT) {
356 fprintf(stderr,
"unable to open modal flag file \"%s\" (%d: %s)\n",
357 mflag, save_errno, strerror(save_errno));
365 *fgp = (
double *)malloc(
sizeof(
double)*modes);
366 for (i = 0; i < modes; i++) {
367 (*fgp)[i] = ((double)i)/10.0;
377 do_nodal0(
const char *nflag,
const char *ndata,
int nodes,
unsigned **ulp,
double **fgp)
383 f = fopen(nflag,
"r");
385 int save_errno = errno;
386 if (save_errno == ENOENT) {
390 fprintf(stderr,
"unable to open nodal flag file \"%s\" (%d: %s)\n",
391 nflag, save_errno, strerror(save_errno));
400 *ulp = (
unsigned *)malloc(
sizeof(
unsigned)*
nodes);
401 for (i = 0; i <
nodes; i++) {
407 *fgp = (
double *)malloc(3*
sizeof(
double)*
nodes);
408 for (i = 0; i < 3*
nodes; i++) {
409 (*fgp)[i] = ((double)i)*1e1;
421 int niters,
int *iterp,
int cmd,
436 f = fopen(rdata,
"r");
438 int save_errno = errno;
440 fprintf(stderr,
"unable to open rigid data file \"%s\" (%d: %s)\n",
441 rdata, save_errno, strerror(save_errno));
445 while (fgets(buf,
sizeof(buf), f) != NULL) {
446 fprintf(stderr,
">> rdata:%s", buf);
461 int niters,
int *iterp,
int cmd,
462 int modes,
double *fg)
476 f = fopen(mdata,
"r");
478 int save_errno = errno;
480 fprintf(stderr,
"unable to open modal data file \"%s\" (%d: %s)\n",
481 mdata, save_errno, strerror(save_errno));
485 while (fgets(buf,
sizeof(buf), f) != NULL) {
486 fprintf(stderr,
">> mdata:%s", buf);
501 int niters,
int *iterp,
int cmd,
502 int nodes,
unsigned *ul,
double *fg)
516 f = fopen(ndata,
"r");
518 int save_errno = errno;
520 fprintf(stderr,
"unable to open nodal data file \"%s\" (%d: %s)\n",
521 ndata, save_errno, strerror(save_errno));
525 while (fgets(buf,
sizeof(buf), f) != NULL) {
526 fprintf(stderr,
">> ndata:%s", buf);
543 "usage: test_strext_edge [options]\n"
544 "\t-c [random:]<c>\t\tnumber of iterations\n"
545 "\t-m [flag|data]=<file>\tmodal file names (set both)\n"
546 "\t-M <modes>\t\tmodes number\n"
547 "\t-n\t\t\tuse \"rename\" when writing flag files\n"
548 "\t-o {rm|mr}\tprocess rigid,modal (rm) or modal,rigid (mr)\n"
549 "\t-r [flag|data]=<file>\trigid-body file names (set both)\n"
550 "\t-s <sleeptime>\t\tsleep time between tries\n"
551 "\t-v\t\t\tverbose\n"
552 "\t-w f[x,fy,fz[,fx2,fy2,fz2,...]]\n"
553 "\t-x [flag|data]=<file>\tnodal file names (set both)\n"
554 "\t-X <nodes>[:<label>[,<label>]]\t\tnodes number (labels)\n" );
577 int opt =
getopt(argc, argv,
"c:m:M:no:r:s:vw:x:X:");
585 if (strncasecmp(
optarg,
"random:",
sizeof(
"random:") -1) == 0) {
587 iters = atoi(&
optarg[
sizeof(
"random:") -1]);
591 fprintf(stderr,
"iterations: %d\n", iters);
594 fprintf(stderr,
"test_strext_edge: "
595 "invalid sleep time %s\n",
602 if (strncasecmp(
optarg,
"flag=",
sizeof(
"flag=") - 1) == 0) {
603 mflag = &
optarg[
sizeof(
"flag=") - 1];
605 }
else if (strncasecmp(
optarg,
"data=",
sizeof(
"data=") - 1) == 0) {
606 mdata = &
optarg[
sizeof(
"data=") - 1];
609 fprintf(stderr,
"test_strext_edge: "
610 "unknown modal file \"%s\"\n",
619 fprintf(stderr,
"test_strext_edge: "
620 "invalid mode number %s\n",
629 #else // ! HAVE_MKSTEMP
630 fprintf(stderr,
"test_strext_edge: "
631 "'-n' meaningless\n");
632 #endif // ! HAVE_MKSTEMP
636 if (strcmp(
optarg,
"rm") == 0) {
639 }
else if (strcmp(
optarg,
"mr") == 0) {
643 fprintf(stderr,
"test_strext_edge: "
644 "invalid order \"%s\"\n",
651 if (strncasecmp(
optarg,
"flag=",
sizeof(
"flag=") - 1) == 0) {
652 rflag = &
optarg[
sizeof(
"flag=") - 1];
654 }
else if (strncasecmp(
optarg,
"data=",
sizeof(
"data=") - 1) == 0) {
655 rdata = &
optarg[
sizeof(
"data=") - 1];
658 fprintf(stderr,
"test_strext_edge: "
659 "unknown rigid file \"%s\"\n",
668 fprintf(stderr,
"test_strext_edge: "
669 "invalid iters %s\n",
682 fprintf(stderr,
"test_strext_edge: "
683 "-w needs -W first\n");
686 }
else if (fg != NULL) {
687 fprintf(stderr,
"test_strext_edge: "
688 "-w already provided\n");
692 char *value =
optarg, *next;
695 fg = (
double *)malloc(3*
sizeof(
double)*
nodes);
697 fg[0] = strtod(value, &next);
698 if (next == value || next == NULL) {
699 fprintf(stderr,
"test_strext_edge: "
700 "unable to parse first value\n");
704 if (next[0] ==
',') {
706 fg[
nodes] = strtod(value, &next);
707 if (next == value || next == NULL || next[0] !=
',') {
708 fprintf(stderr,
"test_strext_edge: "
709 "unable to parse second value\n");
714 fg[2*
nodes] = strtod(value, &next);
715 if (next == value || next == NULL) {
716 fprintf(stderr,
"test_strext_edge: "
717 "unable to parse third value\n");
721 if (next[0] ==
',') {
722 for (i = 3; i < 3*
nodes; i++) {
724 fg[(i%3)*nodes + i/3] = strtod(value, &next);
725 if (next == value || next == NULL || next[0] != ( i == 3*nodes - 1 ?
'\0' :
',' )) {
726 fprintf(stderr,
"test_strext_edge: "
727 "unable to parse value #%d\n", i);
733 for (i = 1; i <
nodes; i++) {
735 fg[nodes + i] = fg[
nodes];
736 fg[2*nodes + i] = fg[2*
nodes];
741 for (i = 1; i < 3*
nodes; i++) {
750 if (strncasecmp(
optarg,
"flag=",
sizeof(
"flag=") - 1) == 0) {
751 nflag = &
optarg[
sizeof(
"flag=") - 1];
753 }
else if (strncasecmp(
optarg,
"data=",
sizeof(
"data=") - 1) == 0) {
754 ndata = &
optarg[
sizeof(
"data=") - 1];
757 fprintf(stderr,
"test_strext_edge: "
758 "unknown nodal file \"%s\"\n",
767 nodes = strtol(p, &next, 10);
769 fprintf(stderr,
"test_strext_edge: "
770 "invalid node number %s\n",
775 if (next != NULL && next != p && next[0] ==
':') {
777 ul = (
unsigned *)malloc(nodes*
sizeof(
unsigned));
778 for (i = 0; i <
nodes; i++) {
780 ul[i] = strtol(p, &next, 10);
781 if (next == NULL || next == p || (next[0] !=
',' && next[0] !=
'\0')) {
782 fprintf(stderr,
"test_strext_edge: "
783 "invalid ID #%d\n", i);
795 if (mflag == NULL && mdata != NULL) {
796 fprintf(stderr,
"test_strext_edge: "
797 "need modal flag file "
798 "along with modal data file \"%s\"\n",
803 if (mflag != NULL && mdata == NULL) {
804 fprintf(stderr,
"test_strext_edge: "
805 "need modal data file "
806 "along with modal flag file \"%s\"\n",
811 if (nflag == NULL && ndata != NULL) {
812 fprintf(stderr,
"test_strext_edge: "
813 "need nodal flag file "
814 "along with nodal data file \"%s\"\n",
819 if (nflag != NULL && ndata == NULL) {
820 fprintf(stderr,
"test_strext_edge: "
821 "need nodal data file "
822 "along with nodal flag file \"%s\"\n",
827 if (mflag != NULL && nflag != NULL) {
828 fprintf(stderr,
"test_strext_edge: "
829 "nodal and modal incompatible\n");
833 if (rflag == NULL && rdata != NULL) {
834 fprintf(stderr,
"test_strext_edge: "
835 "need rigid flag file "
836 "along with rigid data file \"%s\"\n",
841 if (rflag != NULL && rdata == NULL) {
842 fprintf(stderr,
"test_strext_edge: "
843 "need rigid data file "
844 "along with rigid flag file \"%s\"\n",
849 if (mflag == NULL && nflag == NULL && rflag == NULL) {
850 fprintf(stderr,
"test_strext_edge: "
851 "need at least rigid or modal or nodal files\n");
861 if (mflag)
do_modal0(mflag, mdata, modes, &fg);
862 if (nflag)
do_nodal0(nflag, ndata, nodes, &ul, &fg);
866 if (mflag)
do_modal0(mflag, mdata, modes, &fg);
867 if (nflag)
do_nodal0(nflag, ndata, nodes, &ul, &fg);
872 for (steps = 0; keep_going > 0; steps++) {
877 niters = rand() % iters + 1;
878 fprintf(stderr,
" iterations within this iter: %d\n", niters);
884 for (iter = 0; iter < niters; iter++) {
887 if (iter == niters - 1) {
888 fprintf(stderr,
"*** step %d converged after %d iterations\n", steps, iter);
894 do_rigid(rflag, rdata, niters, &iter, cmd, fm);
895 if (mflag)
do_modal(mflag, mdata, niters, &iter, cmd, modes, fg);
896 if (nflag)
do_nodal(nflag, ndata, niters, &iter, cmd, nodes, ul, fg);
900 if (mflag)
do_modal(mflag, mdata, niters, &iter, cmd, modes, fg);
901 if (nflag)
do_nodal(nflag, ndata, niters, &iter, cmd, nodes, ul, fg);
902 do_rigid(rflag, rdata, niters, &iter, cmd, fm);
int main(int argc, char *argv[])
volatile sig_atomic_t keep_going
int mbsleep(const mbsleep_t *t)
static int put_mdata(const char *mdata, int modes, double *fg)
static void sh(int signum)
static int do_modal0(const char *mflag, const char *mdata, int modes, double **fgp)
static const char * cmd2str(int cmd)
int do_nodal(const char *nflag, const char *ndata, int niters, int *iterp, int cmd, int nodes, unsigned *ul, double *fg)
static int put_rdata(const char *rdata, double fm[6])
int do_modal(const char *mflag, const char *mdata, int niters, int *iterp, int cmd, int modes, double *fg)
static int check_flag(const char *flag, int sleeptime)
mbsleep_t mbsleep_init(long t)
static int do_nodal0(const char *nflag, const char *ndata, int nodes, unsigned **ulp, double **fgp)
static int put_flag(const char *flag, int cmd)
static std::stack< cleanup * > c
int getopt(int argc, char *const argv[], const char *opts)
static doublereal buf[BUFSIZE]
static int put_ndata(const char *ndata, int nodes, unsigned *ul, double *fg)
static int do_rigid0(const char *rflag, const char *rdata, double *fm)
int do_rigid(const char *rflag, const char *rdata, int niters, int *iterp, int cmd, double *fm)