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); // */ }
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]); } }