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;
}
Example #2
0
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;
}