Example #1
0
/**
    \brief Setrese pole, vysledek bude jen jedno zalokovane pole.
    \warning Muze zpusobit bad_alloc, protoze alokuje dvakrat tak velkou pamet nez je potreba pro jednu matici
    \warning Dodela spravu pameti, kdyz bude shakedown pouzit funkci LDU nemusi byt prealokovan s plnym poctem radku
    \todo - Zkusit udelat tak aby se neodalokovavaly vsechna pole
    \param rm Rozsireni matice - o kolik bude nulte pole delsi nez je pocet hodnot, v %
    \param new_value Nove pole value, ktere nahradi stare pole value
    \param new_column Nove pole column, ktere nahradi stare pole column
 */
void SPARSE::M_shake_down(const int& rm)
{
    printf("\n\n\n\n\n\n ============================Jsem v Shakedown============================\n\n\n\n\n\n");
    // - Zalokuj nove pole
    long    i,j,ii;
    long     new_field_length   = enlarge_field(value_number,rm);
    double*  new_value          = new double[new_field_length];
    long*    new_column         = new long[new_field_length];
    double** new_value_start    = new double*[row_number];
    long**   new_column_start   = new long*[row_number];
    long*    new_value_length   = new long[row_number];
    double** new_diagonal       = new double*[row_number];

    ii=0;

    // - Zkopiruj do nich hodnoty
    for (i=0; i<row_number; i++){//projed po radcich
        new_value_start[i] = &new_value[ii];
        new_column_start[i] = &new_column[ii];
            new_value_length[i] = value_length[i];

        for (j=0; j<value_length[i]; j++){//projed po sloupcich
            new_value[ii]=value_start[i][j];
            new_column[ii]=column_start[i][j];
            if(new_column[ii]==i){
                new_diagonal[i]=&new_value[ii];
//                dia = true;
            }
            ii++;
        }
    }

    // - Odalokuj puvodne alokovana pole
    dealloc();

    // - Preukazuj ukazatele
    M_aloc          = true;
    value[0]        = new_value;
    column[0]       = new_column;
    value_start     = new_value_start;
    column_start    = new_column_start;
    value_length    = new_value_length;
    diagonal        = new_diagonal;
    value_number    = ii;

    // - Predelej veci na spravu pameti
    allocated_field = 0;
    M_allocated_field_length[0]     = new_field_length;
    M_empty_start[allocated_field]  = value[allocated_field]+ii;
    M_empty_end[allocated_field]    = &value[allocated_field][M_allocated_field_length[0]-1];
}
Example #2
0
int board_toggle_cell (struct klife_board *board, unsigned long x, unsigned long y)
{
	int ret = 0;

	write_lock (&board->lock);

	if (enlarge_needed (board, x, y)) {
		printk (KERN_INFO "Enlarge needed to process set of cell %lu,%lu\n", x, y);
		ret = enlarge_field (board, max (x, y));
	}

	if (!ret)
		board->field[CELL_BYTE (x, y, board->field_side)] ^= CELL_MASK (x);

	write_unlock (&board->lock);

	return 0;
}
Example #3
0
/**
Procedura - alokuje pole pouzita v matici. Neni blbuvzdorna - jestli byla alokovana, smaze se a prealokuje
\param r/c    - row, column, two fields
\param ph     - pocet hodnot
\param rm     - rozsireni matice
*/
void SPARSE::alloc(const long& r, const long& nov, const int& rm)
{
    if (M_aloc == true) dealloc();
    M_aloc = true;
    M_allocated_field_length[0]     = enlarge_field(nov, rm);
    extra_field_length              = (long)M_allocated_field_length[0]*extra_field_enlargement/100;
    allocated_field                 = 0; // pri kopirovani se vytvori jenom jedno pole do ktereho se vse zkopiruje

    value[allocated_field]          = new double [M_allocated_field_length[0]];
    column[allocated_field]         = new long  [M_allocated_field_length[0]];
    value_start                     = new double* [r+1];
    column_start                    = new long* [r+1];
    value_length                    = new long  [r];
    diagonal                        = new double* [r];
    addit_values                    = false; //jsou alokovana doplnkova pole addit_val a addit_col?

    M_empty_start[allocated_field]  = &value[0][0];
    M_empty_end[allocated_field]    = &value[0][M_allocated_field_length[0]-1];
}
Example #4
0
int board_set_cell (struct klife_board *board, unsigned long x, unsigned long y)
{
	int ret = 0;

	write_lock (&board->lock);

	if (enlarge_needed (board, x, y)) {
		printk (KERN_INFO "Enlarge needed to process set of cell %lu,%lu\n", x, y);
		ret = enlarge_field (board, max (x, y));
	}

	if (!ret) {
		/* check for side change */
		if (board->side < max (x, y))
			board->side = max (x, y) + 1;

/* 		printk (KERN_INFO "%lu,%lu, ofs = %lu, mask = %lx\n", x, y, CELL_BYTE (x, y, board->field_side << 3), CELL_MASK (x)); */
		board->field[CELL_BYTE (x, y, board->field_side)] |= CELL_MASK (x);
	}

	write_unlock (&board->lock);

	return 0;
}