void fill_matrix(LinSys * lin_sys, int min_idx, int max_idx) {
	unsigned int row_cnt = 0; //row counter
	unsigned int local_min, local_max;
	for (unsigned int i = 0; i < min_idx; i++) {
		row_cnt += rows[i];
	}
	local_min = row_cnt;

	// create block A of matrix
	for (unsigned int i = min_idx; i < max_idx; i++) {
		std::vector<PetscScalar> a_vals;
		a_vals.reserve(rows[i] * rows[i]);
		for (unsigned int j=0; j<rows[i]*rows[i]; j++) {
			a_vals.push_back( rand()%19 + 1 );
		}
		std::vector<int> a_rows_idx;
		a_rows_idx.reserve(rows[i]);
		for (unsigned int j=0; j<rows[i]; j++) {
			a_rows_idx.push_back(row_cnt + min_idx + j);
		}
		int * insert_rows = &a_rows_idx[0];
		PetscScalar * insert_vals = &a_vals[0];
		lin_sys->mat_set_values(rows[i], insert_rows, rows[i], insert_rows, insert_vals);
		row_cnt += rows[i];
	}
	local_max = row_cnt;
	/*for (unsigned int i = max_idx; i < 6; i++) {
		row_cnt += rows[i];
	}*/

	// create block B of matrix
	std::vector<PetscScalar> b_vals((local_max - local_min) * (max_idx - min_idx), 1.0);
	std::vector<int> b_rows_idx;
	std::vector<int> b_cols_idx;
	b_rows_idx.reserve(local_max - local_min);
	b_cols_idx.reserve(max_idx - min_idx);
	for (unsigned int i = local_min; i < local_max; i++) {
		b_rows_idx.push_back(i + min_idx);
	}
	for (unsigned int i = min_idx; i < max_idx; i++) {
		b_cols_idx.push_back(local_max + i);
	}
	int * b_insert_rows = &b_rows_idx[0];
	int * b_insert_cols = &b_cols_idx[0];
	PetscScalar * b_insert_vals = &b_vals[0];
	lin_sys->mat_set_values((local_max - local_min), b_insert_rows, (max_idx - min_idx), b_insert_cols, b_insert_vals);
	lin_sys->mat_set_values((max_idx - min_idx), b_insert_cols, (local_max - local_min), b_insert_rows, b_insert_vals); // */
}
Esempio n. 2
0
	void fill_matrix(int rank, Distribution &ds, Distribution &block_ds) {

		// set B columns
		int n_cols_B=block_ds.size();
		std::vector<PetscInt> b_cols(n_cols_B);
		for( unsigned int p=0;p<block_ds.np();p++)
			for (unsigned int j=block_ds.begin(p); j<block_ds.end(p); j++) {
				//int proc=block_ds.get_proc(j);
				b_cols[j]=ds.end(p)+j;
			}

		// create block A of matrix
		int local_idx=0;
		for (unsigned int i = block_ds.begin(); i < block_ds.end(); i++) {
			// make random block values
			std::vector<PetscScalar> a_vals(block_size * block_size, 0);
			for (unsigned int j=0; j<block_size; j++)
				a_vals[ j + j*block_size ]= (rank + 2);

			// set rows and columns indices
			std::vector<PetscInt> a_rows(block_size);
			for (unsigned int j=0; j<block_size; j++) {
				a_rows[j]=ds.begin() + block_ds.begin() + local_idx;
				local_idx++;
			}
			mat_set_values(block_size, &a_rows[0], block_size, &a_rows[0], &a_vals[0]);

			// set B values
			std::vector<PetscScalar> b_vals(block_size*n_cols_B);
			for (int j=0; j<block_size*n_cols_B; j++)
				b_vals[j] = 1;

			// set C values
			std::vector<PetscScalar> c_vals(n_cols_B);
			for (int j=0; j<n_cols_B; j++)
				c_vals[j] = 0;

			// must iterate per rows to get correct transpose
			for(unsigned int row=0; row<block_size;row++) {
				mat_set_values(1, &a_rows[row], 1, &b_cols[rank], &b_vals[row*n_cols_B]);
				mat_set_values(1, &b_cols[rank],1, &a_rows[row], &b_vals[row*n_cols_B]);
			}

			mat_set_values(1, &b_cols[rank], 1, &b_cols[rank], &c_vals[rank]);

		}
	}