#include "BSprivate.h"
/*+ BSnz_2_inode - Copy the nonzeros of A into the inode structure
Input Parameters:
. A - the original sparse matrix
. perm_rows - indices into the rows of A in permuted order
. col_iA - the inode data structure
. col_cA - the clique data structure
. procinfo - the usual processor stuff
Output Parameters:
. col_iA - now contains the nonzeros of A
Returns:
void
+*/
void BSnz_2_inode(BSspmat *A, BSsprow **perm_rows, BSinode_list *col_iA,
BScl_2_inode *col_cA, BSprocinfo *procinfo)
{
int i, j;
int cl_ind, in_ind;
BSinode *inode;
FLOAT **nz_ptr;
int size, ind;
FLOAT *cl_mat;
int r_offset, c_offset, c_limit;
MY_MALLOC(nz_ptr,(FLOAT **),sizeof(FLOAT *)*A->num_rows,1);
for (i=0;i<A->num_rows;i++) {
nz_ptr[i] = perm_rows[i]->nz;
}
for (cl_ind=0;cl_ind<col_cA->num_cols;cl_ind++) {
/* local or global? */
if (col_cA->proc[cl_ind] == procinfo->my_id) {
size = col_cA->d_mats[cl_ind].size;
ind = col_cA->d_mats[cl_ind].local_ind;
cl_mat = col_cA->d_mats[cl_ind].matrix;
for (r_offset=0;r_offset<size;r_offset++) {
if(A->icc_storage) {
c_limit = r_offset + 1;
} else {
c_limit = size;
}
for (c_offset=0;c_offset<c_limit;c_offset++) {
cl_mat[(c_offset*size)+r_offset] = *(nz_ptr[ind+r_offset]);
(nz_ptr[ind+r_offset])++;
}
}
for (in_ind=col_cA->inode_index[cl_ind];
in_ind<col_cA->inode_index[cl_ind+1];in_ind++) {
inode = &(col_iA->list[in_ind]);
for (i=0;i<inode->length;i++) {
for (j=0;j<inode->num_cols;j++) {
inode->nz[(j*inode->length)+i] =
*(nz_ptr[inode->row_num[i]]);
(nz_ptr[inode->row_num[i]])++;
}
}
}
} else {
for (in_ind=col_cA->inode_index[cl_ind];
in_ind<col_cA->inode_index[cl_ind+1];in_ind++) {
inode = &(col_iA->list[in_ind]);
for (i=0;i<inode->length;i++) {
for (j=0;j<inode->num_cols;j++) {
inode->nz[(j*inode->length)+i] =
*(nz_ptr[inode->row_num[i]]);
(nz_ptr[inode->row_num[i]])++;
}
}
}
}
}
MY_FREE(nz_ptr);
}
syntax highlighted by Code2HTML, v. 0.9.1