int main (void) { // Initialize function variables long nj, ne_tr, ne_fr, ne_sh, neq; long ne_sbr = 0; long ne_fbr = 0; long i, j, k, ptr; double lpf; char junk_char[20], file[25]; int fsi_flag; for (i = 0; i < 5; ++i) { sprintf(file, "results%ld.txt", i + 1); // Force input file to open do { ifp[i] = fopen(file, "r"); } while (ifp[i] == 0); } // Force output file to open do { ofp = fopen(OUTPUT, "w"); } while (ofp == 0); // Begin skipping through data in input file for (i = 0; i < 2; ++i) { fscanf(ifp[0], "%s", junk_char); } fscanf(ifp[0], "%s", junk_char); // Determine whether FSI analysis if (strcmp(junk_char, "Fluid") == 0) {fsi_flag = 1;} else {fsi_flag = 0;} printf("fsi_flag = %d\n",fsi_flag); fsi_flag = 1; // Resume skipping through data in input file for (i = 0; i < 4; ++i) { fscanf(ifp[0], "%s", junk_char); } fscanf(ifp[0], "%s", junk_char); if (strcmp(junk_char, "Direct") == 0 || strcmp(junk_char, "Newton") == 0 || strcmp(junk_char, "Dynamic") == 0) { for (i = 0; i < 6; ++i) { fscanf(ifp[0], "%s", junk_char); } } else if (strcmp(junk_char, "Modified") == 0) { fscanf(ifp[0], "%s", junk_char); if (strcmp(junk_char, "Newton") == 0) { for (i = 0; i < 6; ++i) { fscanf(ifp[0], "%s", junk_char); } } else if (strcmp(junk_char, "Spherical") == 0) { for (i = 0; i < 7; ++i) { fscanf(ifp[0], "%s", junk_char); } } } // Read number of joints and elements from input file fscanf(ifp[0], "%ld", &nj); for (i = 0; i < 4; ++i) { fscanf(ifp[0], "%s", junk_char); } fscanf(ifp[0], "%ld", &ne_tr); for (i = 0; i < 4; ++i) { fscanf(ifp[0], "%s", junk_char); } fscanf(ifp[0], "%ld", &ne_fr); for (i = 0; i < 4; ++i) { fscanf(ifp[0], "%s", junk_char); } fscanf(ifp[0], "%ld", &ne_sh); for (i = 0; i < 5; ++i) { fscanf(ifp[0], "%s", junk_char); } fscanf(ifp[0], "%ld", &ne_sbr); for (i = 0; i < 5; ++i) { fscanf(ifp[0], "%s", junk_char); } fscanf(ifp[0], "%ld", &ne_fbr); // Memory management variables /* Pointer-to-pointer-to-double array (2 arrays of type double are defined during program execution) */ double *p2p2d[5]; // Counter to track number of arrays of type double for which memory is allocated int nd = 0; /* Pointer-to-pointer-to-long array (2 arrays of type long are defined during program execution) */ long *p2p2l[2]; // Counter to track number of arrays of type long for which memory is allocated int nl = 0; // Joint coordinates double *x = alloc_dbl (nj*3); if (x == NULL) { // Pass control to closeio function getchar(); return closeio(0); } p2p2d[nd] = x; nd++; // Joint constraint code long *jcode = alloc_long (nj*7); if (jcode == NULL) { // Pass control to free_all function return free_all (p2p2l, nl, p2p2d, nd); } p2p2l[nl] = jcode; nl++; // Member incidence long *minc = alloc_long (ne_tr*2+ne_fr*2+ne_sh*3+ne_sbr*8+ne_fbr*8); if (minc == NULL) { // Pass control to free_all function return free_all (p2p2l, nl, p2p2d, nd); } p2p2l[nl] = minc; nl++; // Truss element forces double *ef_tr = alloc_dbl (ne_tr); if (ef_tr == NULL) { // Pass control to free_all function return free_all (p2p2l, nl, p2p2d, nd); } p2p2d[nd] = ef_tr; nd++; // Frame element forces double *ef_fr = alloc_dbl (ne_fr * 7); if (ef_fr == NULL) { // Pass control to free_all function return free_all (p2p2l, nl, p2p2d, nd); } p2p2d[nd] = ef_fr; nd++; // Shell element forces double *ef_sh = alloc_dbl (ne_sh * 6); if (ef_sh == NULL) { // Pass control to free_all function return free_all (p2p2l, nl, p2p2d, nd); } p2p2d[nd] = ef_sh; nd++; // Resume skipping through data in input file fscanf(ifp[0], "%s", junk_char); if (strcmp(junk_char, "***WARNING***") == 0) { for (i = 0; i < 5; ++i) { fscanf(ifp[0], "%s", junk_char); } } // Read truss member incidence data from input file if (ne_tr > 0) { for (i = 0; i < 5; ++i) { fscanf(ifp[0], "%s", junk_char); } for (i = 0; i < ne_tr; ++i) { fscanf(ifp[0], "%s", junk_char); fscanf(ifp[0], "%ld\t%ld", &minc[i*2], &minc[i*2+1]); } } // Read frame member incidence data from input file if (ne_fr > 0 && ne_tr > 0) { ptr = ne_tr * 2; for (i = 0; i < 6; ++i) { fscanf(ifp[0], "%s", junk_char); } for (i = 0; i < ne_fr; ++i) { fscanf(ifp[0], "%s", junk_char); fscanf(ifp[0], "%ld\t%ld", &minc[ptr+i*2], &minc[ptr+i*2+1]); } } else if (ne_fr > 0) { ptr = ne_tr * 2; for (i = 0; i < 5; ++i) { fscanf(ifp[0], "%s", junk_char); } for (i = 0; i < ne_fr; ++i) { fscanf(ifp[0], "%s", junk_char); fscanf(ifp[0], "%ld\t%ld", &minc[ptr+i*2], &minc[ptr+i*2+1]); } } // Read shell member incidence data from input file if (ne_sh > 0 && (ne_tr > 0 || ne_fr > 0)) { ptr = ne_tr * 2 + ne_fr * 2; for (i = 0; i < 7; ++i) { fscanf(ifp[0], "%s", junk_char); } for (i = 0; i < ne_sh; ++i) { fscanf(ifp[0], "%s", junk_char); fscanf(ifp[0], "%ld\t%ld\t%ld", &minc[ptr+i*3], &minc[ptr+i*3+1], &minc[ptr+i*3+2]); } } else if (ne_sh > 0) { ptr = ne_tr * 2 + ne_fr * 2; for (i = 0; i < 6; ++i) { fscanf(ifp[0], "%s", junk_char); } for (i = 0; i < ne_sh; ++i) { fscanf(ifp[0], "%s", junk_char); fscanf(ifp[0], "%ld\t%ld\t%ld", &minc[ptr+i*3], &minc[ptr+i*3+1], &minc[ptr+i*3+2]); } } // Read solid brick member incidence data from input file if (ne_sbr > 0 && (ne_tr > 0 || ne_fr > 0 || ne_sh > 0)) { ptr = ne_tr * 2 + ne_fr * 2 + ne_sh * 3; for (i = 0; i < 12; ++i) { fscanf(ifp[0], "%s", junk_char); } for (i = 0; i < ne_sbr; ++i) { fscanf(ifp[0], "%s", junk_char); fscanf(ifp[0], "%ld\t%ld\t%ld\t%ld\t%ld\t%ld\t%ld\t%ld", &minc[ptr+i*8], &minc[ptr+i*8+1], &minc[ptr+i*8+2], &minc[ptr+i*8+3], &minc[ptr+i*8+4], &minc[ptr+i*8+5], &minc[ptr+i*8+6], &minc[ptr+i*8+7]); } } else if (ne_sbr > 0) { ptr = ne_tr * 2 + ne_fr * 2 + ne_sh * 3; for (i = 0; i < 11; ++i) { fscanf(ifp[0], "%s", junk_char); printf("%s\n", junk_char); } for (i = 0; i < ne_sbr; ++i) { fscanf(ifp[0], "%s", junk_char); fscanf(ifp[0], "%ld\t%ld\t%ld\t%ld\t%ld\t%ld\t%ld\t%ld", &minc[ptr+i*8], &minc[ptr+i*8+1], &minc[ptr+i*8+2], &minc[ptr+i*8+3], &minc[ptr+i*8+4], &minc[ptr+i*8+5], &minc[ptr+i*8+6], &minc[ptr+i*8+7]); } } // Read fluid brick member incidence data from input file if (ne_fbr > 0 && (ne_tr > 0 || ne_fr > 0 || ne_sh > 0 || ne_sbr > 0)) { ptr = ne_tr * 2 + ne_fr * 2 + ne_sh * 3 + ne_sbr * 8; for (i = 0; i < 12; ++i) { fscanf(ifp[0], "%s", junk_char); } for (i = 0; i < ne_fbr; ++i) { fscanf(ifp[0], "%s", junk_char); fscanf(ifp[0], "%ld\t%ld\t%ld\t%ld\t%ld\t%ld\t%ld\t%ld", &minc[ptr+i*8], &minc[ptr+i*8+1], &minc[ptr+i*8+2], &minc[ptr+i*8+3], &minc[ptr+i*8+4], &minc[ptr+i*8+5], &minc[ptr+i*8+6], &minc[ptr+i*8+7]); } } else if (ne_fbr > 0) { ptr = ne_tr * 2 + ne_fr * 2 + ne_sh * 3 + ne_sbr * 8; for (i = 0; i < 11; ++i) { fscanf(ifp[0], "%s", junk_char); } for (i = 0; i < ne_fbr; ++i) { fscanf(ifp[0], "%s", junk_char); fscanf(ifp[0], "%ld\t%ld\t%ld\t%ld\t%ld\t%ld\t%ld\t%ld", &minc[ptr+i*8], &minc[ptr+i*8+1], &minc[ptr+i*8+2], &minc[ptr+i*8+3], &minc[ptr+i*8+4], &minc[ptr+i*8+5], &minc[ptr+i*8+6], &minc[ptr+i*8+7]); } } // Resume skipping through data in input file do { fscanf(ifp[0], "%s", junk_char); } while (strcmp(junk_char, "Number") != 0); for (i = 0; i < 4; ++i) { fscanf(ifp[0], "%s", junk_char); } fscanf(ifp[0], "%ld", &neq); for (i = 0; i < 11; ++i) { fscanf(ifp[0], "%s", junk_char); } // Total generalized nodal displacement double *d = alloc_dbl (neq); if (d == NULL) { // Pass control to free_all function return free_all (p2p2l, nl, p2p2d, nd); } p2p2d[nd] = d; nd++; // Read initial joint coordinates from input file for (i = 0; i < nj; ++i) { fscanf(ifp[0], "%s", junk_char); fscanf(ifp[0], "%lf\t%lf\t%lf", &x[i*3], &x[i*3+1], &x[i*3+2]); } // Resume skipping through data in input file for (i = 0; i < 12; ++i) { fscanf(ifp[0], "%s", junk_char); } // Read jcode from input file for (i = 0; i < nj; ++i) { fscanf(ifp[0], "%s", junk_char); fscanf(ifp[0], "%ld\t%ld\t%ld\t%ld\t%ld\t%ld\t%ld", &jcode[i*7], &jcode[i*7+1], &jcode[i*7+2], &jcode[i*7+3], &jcode[i*7+4], &jcode[i*7+5], &jcode[i*7+6]); } // Write front matter for *.pvd file printf("**Begin writing to master.pvd**\n"); fprintf(ofp, "<VTKFile type=\"Collection\" version=\"0.1\""); fprintf(ofp, " byte_order=\"LittleEndian\">\n"); printf("**Finish writing to master.pvd**\n"); fprintf(ofp, " <Collection>\n"); // Create directory for storage of vtu files if (mkdir("./vtu_files", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0) { rmdir("./vtu_files", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); mkdir("./vtu_files", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); } printf("**Begin writing to slave_0.vtu**\n"); sprintf(file, "vtu_files//slave_0.vtu"); printf("hey\n"); // Force output file to open do { ofp2 = fopen(file, "w"); } while (ofp2 == 0); // Write front matter for *.vtu file fprintf(ofp2, "<VTKFile type=\"UnstructuredGrid\" version=\"0.1\""); fprintf(ofp2, " byte_order=\"LittleEndian\">\n"); fprintf(ofp2, " <UnstructuredGrid>\n"); fprintf(ofp2, " <Piece NumberOfPoints=\"%ld\"", nj); fprintf(ofp2, " NumberOfCells=\"%ld\">\n", ne_tr + ne_fr + ne_sh + ne_sbr + ne_fbr); fprintf(ofp2, " <PointData Scalars=\"scalars\">\n"); // Write initial load proportioniality factor data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); if (fsi_flag == 0) {fprintf(ofp2, " Name=\"Load Proportionality Factor\">\n");} else {fprintf(ofp2, " Name=\"Time\">\n");} for (i = 0; i < nj; ++i) { fprintf(ofp2, " %0.15lf\n", 0.0); } fprintf(ofp2, " </DataArray>\n"); printf("**Write initial x-translation data to output file**\n"); // Write initial x-translation data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); fprintf(ofp2, " Name=\"X-Translation\">\n"); for (i = 0; i < nj; ++i) { fprintf(ofp2, " %0.15lf\n", 0.0); } fprintf(ofp2, " </DataArray>\n"); printf("**Write initial y-translation data to output file**\n"); // Write initial y-translation data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); fprintf(ofp2, " Name=\"Y-Translation\">\n"); for (i = 0; i < nj; ++i) { fprintf(ofp2, " %0.15lf\n", 0.0); } fprintf(ofp2, " </DataArray>\n"); printf("**Write initial z-translation data to output file**\n"); // Write initial z-translation data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); fprintf(ofp2, " Name=\"Z-Translation\">\n"); for (i = 0; i < nj; ++i) { fprintf(ofp2, " %0.15lf\n", 0.0); } fprintf(ofp2, " </DataArray>\n"); printf("**Write initial x-rotation data to output file**\n"); // Write initial x-rotation data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); fprintf(ofp2, " Name=\"X-Rotation\">\n"); for (i = 0; i < nj; ++i) { fprintf(ofp2, " %0.15lf\n", 0.0); } fprintf(ofp2, " </DataArray>\n"); printf("**Write initial y-rotation data to output file**\n"); // Write initial y-rotation data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); fprintf(ofp2, " Name=\"Y-Rotation\">\n"); for (i = 0; i < nj; ++i) { fprintf(ofp2, " %0.15lf\n", 0.0); } fprintf(ofp2, " </DataArray>\n"); printf("**Write initial z-rotation data to output file**\n"); // Write initial z-rotation data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); fprintf(ofp2, " Name=\"Z-Rotation\">\n"); for (i = 0; i < nj; ++i) { fprintf(ofp2, " %0.15lf\n", 0.0); } fprintf(ofp2, " </DataArray>\n"); // Write initial warping data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); if (fsi_flag == 0) {fprintf(ofp2, " Name=\"Warping\">\n");} else {fprintf(ofp2, " Name=\"Pressure\">\n");} for (i = 0; i < nj; ++i) { fprintf(ofp2, " %0.15lf\n", 0.0); } fprintf(ofp2, " </DataArray>\n"); fprintf(ofp2, " </PointData>\n"); // Write element force data if non fsi analysis if (fsi_flag == 0) { fprintf(ofp2, " <CellData>\n"); // Write initial x-force data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); fprintf(ofp2, " Name=\"X-Force\">\n"); for (i = 0; i < ne_tr + ne_fr + ne_sh + ne_sbr + ne_fbr; ++i) { for (i = 0; i < ne_tr + ne_fr + ne_sh; ++i) { fprintf(ofp2, " %0.15lf\n", 0.0); } fprintf(ofp2, " </DataArray>\n"); // Write initial y-force data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); fprintf(ofp2, " Name=\"Y-Force\">\n"); for (i = 0; i < ne_tr + ne_fr + ne_sh; ++i) { fprintf(ofp2, " %0.15lf\n", 0.0); } fprintf(ofp2, " </DataArray>\n"); // Write initial z-force data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); fprintf(ofp2, " Name=\"Z-Force\">\n"); for (i = 0; i < ne_tr + ne_fr + ne_sh; ++i) { fprintf(ofp2, " %0.15lf\n", 0.0); } fprintf(ofp2, " </DataArray>\n"); // Write initial x-moment data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); fprintf(ofp2, " Name=\"X-Moment\">\n"); for (i = 0; i < ne_tr + ne_fr + ne_sh; ++i) { fprintf(ofp2, " %0.15lf\n", 0.0); } fprintf(ofp2, " </DataArray>\n"); // Write initial y-moment data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); fprintf(ofp2, " Name=\"Y-Moment\">\n"); for (i = 0; i < ne_tr + ne_fr + ne_sh; ++i) { fprintf(ofp2, " %0.15lf\n", 0.0); } fprintf(ofp2, " </DataArray>\n"); // Write initial z-moment data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); fprintf(ofp2, " Name=\"Z-Moment\">\n"); for (i = 0; i < ne_tr + ne_fr + ne_sh; ++i) { fprintf(ofp2, " %0.15lf\n", 0.0); } fprintf(ofp2, " </DataArray>\n"); // Write initial bi-moment data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); fprintf(ofp2, " Name=\"Bi-Moment\">\n"); for (i = 0; i < ne_tr + ne_fr + ne_sh; ++i) { fprintf(ofp2, " %0.15lf\n", 0.0); } fprintf(ofp2, " </DataArray>\n"); fprintf(ofp2, " </CellData>\n"); } } fprintf(ofp2, " <Points>\n"); // Write initial joint coordinates to output files fprintf(ofp2, " <DataArray type=\"Float32\" Name=\"\""); fprintf(ofp2, " NumberOfComponents=\"3\">\n"); for (i = 0; i < nj; ++i) { fprintf(ofp2, " %0.15lf %0.15lf %0.15lf\n", x[i*3], x[i*3+1], x[i*3+2]); } fprintf(ofp2, " </DataArray>\n"); fprintf(ofp2, " </Points>\n"); fprintf(ofp2, " <Cells>\n"); // Write truss member incidence data to output file fprintf(ofp2, " <DataArray type=\"Int32\" Name=\"connectivity\">\n"); for (i = 0; i < ne_tr; ++i) { fprintf(ofp2, " %ld %ld\n", minc[i*2] - 1, minc[i*2+1] - 1); } // Write frame member incidence data to output file ptr = ne_tr * 2; for (i = 0; i < ne_fr; ++i) { fprintf(ofp2, " %ld %ld\n", minc[ptr+i*2] - 1, minc[ptr+i*2+1] - 1); } // Write shell member incidence data to output file ptr += ne_fr * 2; for (i = 0; i < ne_sh; ++i) { fprintf(ofp2, " %ld %ld %ld\n", minc[ptr+i*3] - 1, minc[ptr+i*3+1] - 1, minc[ptr+i*3+2] - 1); } // Write solid brick element incidence data to output file ptr += ne_sh * 3; for (i = 0; i < ne_sbr; ++i) { fprintf(ofp2, " %ld %ld %ld %ld %ld %ld %ld %ld\n", minc[ptr+i*8] - 1, minc[ptr+i*8+1] - 1, minc[ptr+i*8+2] - 1, minc[ptr+i*8+3] - 1, minc[ptr+i*8+4] - 1, minc[ptr+i*8+5] - 1, minc[ptr+i*8+6] - 1, minc[ptr+i*8+7] - 1); } // Write fluid brick element incidence data to output file ptr += ne_sbr * 8; for (i = 0; i < ne_fbr; ++i) { fprintf(ofp2, " %ld %ld %ld %ld %ld %ld %ld %ld\n", minc[ptr+i*8] - 1, minc[ptr+i*8+1] - 1, minc[ptr+i*8+2] - 1, minc[ptr+i*8+3] - 1, minc[ptr+i*8+4] - 1, minc[ptr+i*8+5] - 1, minc[ptr+i*8+6] - 1, minc[ptr+i*8+7] - 1); } fprintf(ofp2, " </DataArray>\n"); // Write member incidence offsets to output file fprintf(ofp2, " <DataArray type=\"Int32\" Name=\"offsets\">\n"); for (i = 0; i < ne_tr; ++i) { fprintf(ofp2, " %ld\n", i * 2 + 2); } ptr = ne_tr * 2; for (i = 0; i < ne_fr; ++i) { fprintf(ofp2, " %ld\n", ptr + i * 2 + 2); } ptr += ne_fr * 2; for (i = 0; i < ne_sh; ++i) { fprintf(ofp2, " %ld\n", ptr + i * 3 + 3); } ptr += ne_sh * 3; for (i = 0; i < ne_sbr; ++i) { fprintf(ofp2, " %ld\n", ptr + i * 8 + 8); } ptr += ne_sbr * 8; for (i = 0; i < ne_fbr; ++i) { fprintf(ofp2, " %ld\n", ptr + i * 8 + 8); } fprintf(ofp2, " </DataArray>\n"); // Write cell type data to output file fprintf(ofp2, " <DataArray type=\"UInt8\" Name=\"types\">\n"); for (i = 0; i < ne_tr; ++i) { fprintf(ofp2, " 3\n"); } for (i = 0; i < ne_fr; ++i) { fprintf(ofp2, " 3\n"); } for (i = 0; i < ne_sh; ++i) { fprintf(ofp2, " 5\n"); } for (i = 0; i < ne_sbr; ++i) { fprintf(ofp2, " 12\n"); } for (i = 0; i < ne_fbr; ++i) { fprintf(ofp2, " 12\n"); } fprintf(ofp2, " </DataArray>\n"); // Write back matter for *.vtu file fprintf(ofp2, " </Cells>\n"); fprintf(ofp2, " </Piece>\n"); fprintf(ofp2, " </UnstructuredGrid>\n"); fprintf(ofp2, "</VTKFile>\n"); closeio(1); // Write *vtu file data to *.pvd file fprintf(ofp, " <DataSet timestep=\"0\" part=\"0\""); fprintf(ofp, " file=\"vtu_files/slave_0.vtu\"/>\n"); // Begin skipping through data in model displacements input file for (i = 0; i < neq * 2 + 4; ++i) { fscanf(ifp[1], "%s", junk_char); } // Begin skipping through data in truss element forces input file for (i = 0; i < ne_tr * 2 + 6; ++i) { fscanf(ifp[2], "%s", junk_char); } // Begin skipping through data in frame element forces input file for (i = 0; i < ne_fr * 9 + 6; ++i) { fscanf(ifp[3], "%s", junk_char); } // Begin skipping through data in shell element forces input file for (i = 0; i < ne_sh * 8 + 6; ++i) { fscanf(ifp[4], "%s", junk_char); } // Step through load increments until solution was terminated k = 1; do { sprintf(file, "vtu_files//slave_%ld.vtu", k); // Force output file to open do { ofp2 = fopen(file, "w"); } while (ofp2 == NULL); // Write front matter for *.vtu file fprintf(ofp2, "<VTKFile type=\"UnstructuredGrid\" version=\"0.1\""); fprintf(ofp2, " byte_order=\"LittleEndian\">\n"); fprintf(ofp2, " <UnstructuredGrid>\n"); fprintf(ofp2, " <Piece NumberOfPoints=\"%ld\"", nj); fprintf(ofp2, " NumberOfCells=\"%ld\">\n", ne_tr + ne_fr + ne_sh + ne_sbr + ne_fbr); fprintf(ofp2, " <PointData Scalars=\"scalars\">\n"); // Read load proportionality factor from model displacements input file fscanf(ifp[1], "%lf", &lpf); // Write load proportioniality factor data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); if (fsi_flag == 0) {fprintf(ofp2, " Name=\"Load Proportionality Factor\">\n");} else {fprintf(ofp2, " Name=\"Time\">\n");} for (i = 0; i < nj; ++i) { fprintf(ofp2, " %0.15lf\n", lpf); } fprintf(ofp2, " </DataArray>\n"); // Read total generalized nodal displacements from model displacements input file fscanf(ifp[1], "%s", junk_char); for (i = 0; i < neq; ++i) { fscanf(ifp[1], "%lf", &d[i]); } // Write x-translation data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); fprintf(ofp2, " Name=\"X-Translation\">\n"); for (i = 0; i < nj; ++i) { if (jcode[i*7] != 0) { fprintf(ofp2, " %0.15lf\n", d[jcode[i*7]-1]); } else { fprintf(ofp2, " %0.15lf\n", 0.0); } } fprintf(ofp2, " </DataArray>\n"); // Write y-translation data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); fprintf(ofp2, " Name=\"Y-Translation\">\n"); for (i = 0; i < nj; ++i) { if (jcode[i*7+1] != 0) { fprintf(ofp2, " %0.15lf\n", d[jcode[i*7+1]-1]); } else { fprintf(ofp2, " %0.15lf\n", 0.0); } } fprintf(ofp2, " </DataArray>\n"); // Write z-translation data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); fprintf(ofp2, " Name=\"Z-Translation\">\n"); for (i = 0; i < nj; ++i) { if (jcode[i*7+2] != 0) { fprintf(ofp2, " %0.15lf\n", d[jcode[i*7+2]-1]); } else { fprintf(ofp2, " %0.15lf\n", 0.0); } } fprintf(ofp2, " </DataArray>\n"); // Write x-rotation data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); fprintf(ofp2, " Name=\"X-Rotation\">\n"); for (i = 0; i < nj; ++i) { if (jcode[i*7+3] != 0) { fprintf(ofp2, " %0.15lf\n", d[jcode[i*7+3]-1]); } else { fprintf(ofp2, " %0.15lf\n", 0.0); } } fprintf(ofp2, " </DataArray>\n"); // Write y-rotation data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); fprintf(ofp2, " Name=\"Y-Rotation\">\n"); for (i = 0; i < nj; ++i) { if (jcode[i*7+4] != 0) { fprintf(ofp2, " %0.15lf\n", d[jcode[i*7+4]-1]); } else { fprintf(ofp2, " %0.15lf\n", 0.0); } } fprintf(ofp2, " </DataArray>\n"); // Write z-rotation data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); fprintf(ofp2, " Name=\"Z-Rotation\">\n"); for (i = 0; i < nj; ++i) { if (jcode[i*7+5] != 0) { fprintf(ofp2, " %0.15lf\n", d[jcode[i*7+5]-1]); } else { fprintf(ofp2, " %0.15lf\n", 0.0); } } fprintf(ofp2, " </DataArray>\n"); // Write warping data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); if (fsi_flag == 0) {fprintf(ofp2, " Name=\"Warping\">\n");} else {fprintf(ofp2, " Name=\"Pressure\">\n");} for (i = 0; i < nj; ++i) { if (jcode[i*7+6] != 0) { fprintf(ofp2, " %0.15lf\n", d[jcode[i*7+6]-1]); } else { fprintf(ofp2, " %0.15lf\n", 0.0); } } fprintf(ofp2, " </DataArray>\n"); fprintf(ofp2, " </PointData>\n"); if (fsi_flag == 0) { fprintf(ofp2, " <CellData>\n"); // Read truss element forces from truss element forces input file fscanf(ifp[2], "%s", junk_char); fscanf(ifp[2], "%s", junk_char); for (i = 0; i < ne_tr; ++i) { fscanf(ifp[2], "%lf", &ef_tr[i]); } // Read frame element forces from frame element forces input file fscanf(ifp[3], "%s", junk_char); fscanf(ifp[3], "%s", junk_char); for (i = 0; i < ne_fr; ++i) { for (j = 0; j < 7; ++j) { fscanf(ifp[3], "%lf", &ef_fr[i*7+j]); } } // Read shell element forces from shell element forces input file fscanf(ifp[4], "%s", junk_char); fscanf(ifp[4], "%s", junk_char); for (i = 0; i < ne_sh; ++i) { for (j = 0; j < 6; ++j) { fscanf(ifp[4], "%lf", &ef_sh[i*6+j]); } } // Write x-force data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); fprintf(ofp2, " Name=\"X-Force\">\n"); for (i = 0; i < ne_tr; ++i) { fprintf(ofp2, " %0.15lf\n", ef_tr[i]); } for (i = 0; i < ne_fr; ++i) { fprintf(ofp2, " %0.15lf\n", ef_fr[i*7]); } for (i = 0; i < ne_sh; ++i) { fprintf(ofp2, " %0.15lf\n", ef_sh[i*6]); } fprintf(ofp2, " </DataArray>\n"); // Write y-force data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); fprintf(ofp2, " Name=\"Y-Force\">\n"); for (i = 0; i < ne_tr; ++i) { fprintf(ofp2, " %0.15lf\n", 0.0); } for (i = 0; i < ne_fr; ++i) { fprintf(ofp2, " %0.15lf\n", ef_fr[i*7+1]); } for (i = 0; i < ne_sh; ++i) { fprintf(ofp2, " %0.15lf\n", ef_sh[i*6+1]); } fprintf(ofp2, " </DataArray>\n"); // Write z-force data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); fprintf(ofp2, " Name=\"Z-Force\">\n"); for (i = 0; i < ne_tr; ++i) { fprintf(ofp2, " %0.15lf\n", 0.0); } for (i = 0; i < ne_fr; ++i) { fprintf(ofp2, " %0.15lf\n", ef_fr[i*7+2]); } for (i = 0; i < ne_sh; ++i) { fprintf(ofp2, " %0.15lf\n", ef_sh[i*6+2]); } fprintf(ofp2, " </DataArray>\n"); // Write x-moment data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); fprintf(ofp2, " Name=\"X-Moment\">\n"); for (i = 0; i < ne_tr; ++i) { fprintf(ofp2, " %0.15lf\n", 0.0); } for (i = 0; i < ne_fr; ++i) { fprintf(ofp2, " %0.15lf\n", ef_fr[i*7+3]); } for (i = 0; i < ne_sh; ++i) { fprintf(ofp2, " %0.15lf\n", ef_sh[i*6+3]); } fprintf(ofp2, " </DataArray>\n"); // Write y-moment data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); fprintf(ofp2, " Name=\"Y-Moment\">\n"); for (i = 0; i < ne_tr; ++i) { fprintf(ofp2, " %0.15lf\n", 0.0); } for (i = 0; i < ne_fr; ++i) { fprintf(ofp2, " %0.15lf\n", ef_fr[i*7+4]); } for (i = 0; i < ne_sh; ++i) { fprintf(ofp2, " %0.15lf\n", ef_sh[i*6+4]); } fprintf(ofp2, " </DataArray>\n"); // Write z-moment data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); fprintf(ofp2, " Name=\"Z-Moment\">\n"); for (i = 0; i < ne_tr; ++i) { fprintf(ofp2, " %0.15lf\n", 0.0); } for (i = 0; i < ne_fr; ++i) { fprintf(ofp2, " %0.15lf\n", ef_fr[i*7+5]); } for (i = 0; i < ne_sh; ++i) { fprintf(ofp2, " %0.15lf\n", ef_sh[i*6+5]); } fprintf(ofp2, " </DataArray>\n"); // Write bi-moment data to output file fprintf(ofp2, " <DataArray type=\"Float32\""); fprintf(ofp2, " Name=\"Bi-Moment\">\n"); for (i = 0; i < ne_tr; ++i) { fprintf(ofp2, " %0.15lf\n", 0.0); } for (i = 0; i < ne_fr; ++i) { fprintf(ofp2, " %0.15lf\n", ef_fr[i*7+6]); } for (i = 0; i < ne_sh; ++i) { fprintf(ofp2, " %0.15lf\n", 0.0); } fprintf(ofp2, " </DataArray>\n"); fprintf(ofp2, " </CellData>\n"); } fprintf(ofp2, " <Points>\n"); // Write current joint coordinates to output files fprintf(ofp2, " <DataArray type=\"Float32\" Name=\"\""); fprintf(ofp2, " NumberOfComponents=\"3\">\n"); for (i = 0; i < nj; ++i) { if (jcode[i*7] != 0) { fprintf(ofp2, " %0.15lf", x[i*3] + d[jcode[i*7]-1]); } else { fprintf(ofp2, " %0.15lf", x[i*3]); } if (jcode[i*7+1] != 0) { fprintf(ofp2, " %0.15lf", x[i*3+1] + d[jcode[i*7+1]-1]); } else { fprintf(ofp2, " %0.15lf", x[i*3+1]); } if (jcode[i*7+2] != 0) { fprintf(ofp2, " %0.15lf\n", x[i*3+2] + d[jcode[i*7+2]-1]); } else { fprintf(ofp2, " %0.15lf\n", x[i*3+2]); } } fprintf(ofp2, " </DataArray>\n"); fprintf(ofp2, " </Points>\n"); fprintf(ofp2, " <Cells>\n"); // Write truss member incidence data to output file fprintf(ofp2, " <DataArray type=\"Int32\" Name=\"connectivity\">\n"); for (i = 0; i < ne_tr; ++i) { fprintf(ofp2, " %ld %ld\n", minc[i*2] - 1, minc[i*2+1] - 1); } // Write frame member incidence data to output file ptr = ne_tr * 2; for (i = 0; i < ne_fr; ++i) { fprintf(ofp2, " %ld %ld\n", minc[ptr+i*2] - 1, minc[ptr+i*2+1] - 1); } // Write shell member incidence data to output file ptr += ne_fr * 2; for (i = 0; i < ne_sh; ++i) { fprintf(ofp2, " %ld %ld %ld\n", minc[ptr+i*3] - 1, minc[ptr+i*3+1] - 1, minc[ptr+i*3+2] - 1); } // Write solid brick member incidence data to output file ptr += ne_sh * 3; for (i = 0; i < ne_sbr; ++i) { fprintf(ofp2, " %ld %ld %ld %ld %ld %ld %ld %ld\n", minc[ptr+i*8] - 1, minc[ptr+i*8+1] - 1, minc[ptr+i*8+2] - 1, minc[ptr+i*8+3] - 1, minc[ptr+i*8+4] - 1, minc[ptr+i*8+5] - 1, minc[ptr+i*8+6] - 1, minc[ptr+i*8+7] - 1); } // Write fluid brick member incidence data to output file ptr += ne_sbr * 8; for (i = 0; i < ne_fbr; ++i) { fprintf(ofp2, " %ld %ld %ld %ld %ld %ld %ld %ld\n", minc[ptr+i*8] - 1, minc[ptr+i*8+1] - 1, minc[ptr+i*8+2] - 1, minc[ptr+i*8+3] - 1, minc[ptr+i*8+4] - 1, minc[ptr+i*8+5] - 1, minc[ptr+i*8+6] - 1, minc[ptr+i*8+7] - 1); } fprintf(ofp2, " </DataArray>\n"); // Write member incidence offset data to output file fprintf(ofp2, " <DataArray type=\"Int32\" Name=\"offsets\">\n"); for (i = 0; i < ne_tr; ++i) { fprintf(ofp2, " %ld\n", i * 2 + 2); } ptr = ne_tr * 2; for (i = 0; i < ne_fr; ++i) { fprintf(ofp2, " %ld\n", ptr + i * 2 + 2); } ptr += ne_fr * 2; for (i = 0; i < ne_sh; ++i) { fprintf(ofp2, " %ld\n", ptr + i * 3 + 3); } ptr += ne_sh * 3; for (i = 0; i < ne_sbr; ++i) { fprintf(ofp2, " %ld\n", ptr + i * 8 + 8); } ptr += ne_sbr * 8; for (i = 0; i < ne_fbr; ++i) { fprintf(ofp2, " %ld\n", ptr + i * 8 + 8); } fprintf(ofp2, " </DataArray>\n"); // Write cell type data to output file fprintf(ofp2, " <DataArray type=\"UInt32\" Name=\"types\">\n"); for (i = 0; i < ne_tr; ++i) { fprintf(ofp2, " 3\n"); } for (i = 0; i < ne_fr; ++i) { fprintf(ofp2, " 3\n"); } for (i = 0; i < ne_sh; ++i) { fprintf(ofp2, " 5\n"); } for (i = 0; i < ne_sbr; ++i) { fprintf(ofp2, " 12\n"); } for (i = 0; i < ne_fbr; ++i) { fprintf(ofp2, " 12\n"); } fprintf(ofp2, " </DataArray>\n"); // Write back matter for *.vtu file fprintf(ofp2, " </Cells>\n"); fprintf(ofp2, " </Piece>\n"); fprintf(ofp2, " </UnstructuredGrid>\n"); fprintf(ofp2, "</VTKFile>\n"); k++; // Increment step counter closeio(1); // Write *vtu file data to *.pvd file fprintf(ofp, " <DataSet timestep=\"%ld\" part=\"0\"", k - 1); fprintf(ofp, " file=\"vtu_files/slave_%ld.vtu\"/>\n", k - 1); } while (getc(ifp[1]) != EOF); // Write back matter for *.pvd file fprintf(ofp, " </Collection>\n"); fprintf(ofp, "</VTKFile>"); return free_all (p2p2l, nl, p2p2d, nd); }
int quad (double *pa, double *pb, double *pc, double *pdt, double *pdp, double *pddr, double *pddq, double *pdd, double *pdlpf, double *plpft) { // Initialize function variables long i; double radical, root1, root2; double gamma1, gamma2; double *d1 = alloc_dbl(NEQ); if (d1 == NULL) { return 4; } double *d2 = alloc_dbl(NEQ); if (d2 == NULL) { if (d1 != NULL) { free (d1); d1 = NULL; } return 4; } // Check for negative quantity underneath the radical radical = (*pb) * (*pb) - 4 * (*pa) * (*pc); if (radical > 0) { /* Compute each root; then compute numerator of the equation of a dot product between displacement increments due to root and displacement increment from previous iteration */ root1 = (- (*pb) + sqrt((*pb) * (*pb) - 4 * (*pa) * (*pc))) / (2 * (*pa)); gamma1 = 0; for (i = 0; i < NEQ; ++i) { d1[i] = *(pdt+i) - *(pdp+i) + *(pddr+i) + root1 * (*(pddq+i)); gamma1 += (*(pdt+i) - *(pdp+i)) * d1[i]; } root2 = (- (*pb) - sqrt((*pb) * (*pb) - 4 * (*pa) * (*pc))) / (2 * (*pa)); gamma2 = 0; for (i = 0; i < NEQ; ++i) { d2[i] = *(pdt+i) - *(pdp+i) + *(pddr+i) + root2 * (*(pddq+i)); gamma2 += (*(pdt+i) - *(pdp+i)) * d2[i]; } /* Choose root from largest positive gamma, i.e. smallest angle between displacement increment due to root and displacement increment from previous iteration */ if (gamma1 > gamma2 && gamma1 > 0) { for (i = 0; i < NEQ; ++i) { *(pdt+i) = d1[i] + *(pdp+i); *(pdd+i) = *(pddr+i) + root1 * (*(pddq+i)); } *pdlpf = root1; *plpft += *pdlpf; } else if (gamma2 > gamma1 && gamma2 > 0) { for (i = 0; i < NEQ; ++i) { *(pdt+i) = d2[i] + *(pdp+i); *(pdd+i) = *(pddr+i) + root2 * (*(pddq+i)); } *pdlpf = root2; *plpft += *pdlpf; } else { if (d1 != NULL) { free (d1); d1 = NULL; } if (d2 != NULL) { free (d2); d2 = NULL; } return 3; } } else { if (d1 != NULL) { free (d1); d1 = NULL; } if (d2 != NULL) { free (d2); d2 = NULL; } return 2; } if (d1 != NULL) { free (d1); d1 = NULL; } if (d2 != NULL) { free (d2); d2 = NULL; } return 0; }