Added two additional options for creating the primary matrix for the hybrid
approach (now 1,2,3,4 and 6 are valid).
This commit is contained in:
parent
929a9b6020
commit
7edac43629
@ -135,6 +135,7 @@ hypre_BoomerAMGCreateNodalA(hypre_ParCSRMatrix *A,
|
||||
int *counter;
|
||||
|
||||
double sum;
|
||||
double *data;
|
||||
|
||||
|
||||
MPI_Comm_size(comm,&num_procs);
|
||||
@ -324,6 +325,77 @@ hypre_BoomerAMGCreateNodalA(hypre_ParCSRMatrix *A,
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 4: /* inf. norm (row-sum) */
|
||||
{
|
||||
|
||||
data = hypre_CTAlloc(double, AN_num_nonzeros_diag*num_functions);
|
||||
|
||||
for (i=0; i < num_nodes; i++)
|
||||
{
|
||||
for (j=0; j < num_functions; j++)
|
||||
{
|
||||
for (k=A_diag_i[row]; k < A_diag_i[row+1]; k++)
|
||||
{
|
||||
k_map = map_to_node[A_diag_j[k]];
|
||||
if (counter[k_map] < start_index)
|
||||
{
|
||||
counter[k_map] = index;
|
||||
AN_diag_j[index] = k_map;
|
||||
data[index*num_functions + j] = fabs(A_diag_data[k]);
|
||||
index++;
|
||||
}
|
||||
else
|
||||
{
|
||||
data[(counter[k_map])*num_functions + j] += fabs(A_diag_data[k]);
|
||||
}
|
||||
}
|
||||
row++;
|
||||
}
|
||||
start_index = index;
|
||||
}
|
||||
for (i=0; i < AN_num_nonzeros_diag; i++)
|
||||
{
|
||||
AN_diag_data[i] = data[i*num_functions];
|
||||
|
||||
for (j=1; j< num_functions; j++)
|
||||
{
|
||||
AN_diag_data[i] = hypre_max( AN_diag_data[i],data[i*num_functions+j]);
|
||||
}
|
||||
}
|
||||
hypre_TFree(data);
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case 6: /* sum of all elements in each block */
|
||||
{
|
||||
for (i=0; i < num_nodes; i++)
|
||||
{
|
||||
for (j=0; j < num_functions; j++)
|
||||
{
|
||||
for (k=A_diag_i[row]; k < A_diag_i[row+1]; k++)
|
||||
{
|
||||
k_map = map_to_node[A_diag_j[k]];
|
||||
if (counter[k_map] < start_index)
|
||||
{
|
||||
counter[k_map] = index;
|
||||
AN_diag_j[index] = k_map;
|
||||
AN_diag_data[index] = (A_diag_data[k]);
|
||||
index++;
|
||||
}
|
||||
else
|
||||
{
|
||||
AN_diag_data[counter[k_map]] += (A_diag_data[k]);
|
||||
}
|
||||
}
|
||||
row++;
|
||||
}
|
||||
start_index = index;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
if (diag_option ==1 )
|
||||
@ -594,7 +666,79 @@ hypre_BoomerAMGCreateNodalA(hypre_ParCSRMatrix *A,
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 4: /* inf. norm (row-sum) */
|
||||
{
|
||||
|
||||
data = hypre_CTAlloc(double, AN_num_nonzeros_offd*num_functions);
|
||||
|
||||
for (i=0; i < num_nodes; i++)
|
||||
{
|
||||
for (j=0; j < num_functions; j++)
|
||||
{
|
||||
for (k=A_offd_i[row]; k < A_offd_i[row+1]; k++)
|
||||
{
|
||||
k_map = map_to_map[A_offd_j[k]];
|
||||
if (counter[k_map] < start_index)
|
||||
{
|
||||
counter[k_map] = index;
|
||||
AN_offd_j[index] = k_map;
|
||||
data[index*num_functions + j] = fabs(A_offd_data[k]);
|
||||
index++;
|
||||
}
|
||||
else
|
||||
{
|
||||
data[(counter[k_map])*num_functions + j] += fabs(A_offd_data[k]);
|
||||
}
|
||||
}
|
||||
row++;
|
||||
}
|
||||
start_index = index;
|
||||
}
|
||||
for (i=0; i < AN_num_nonzeros_offd; i++)
|
||||
{
|
||||
AN_offd_data[i] = data[i*num_functions];
|
||||
|
||||
for (j=1; j< num_functions; j++)
|
||||
{
|
||||
AN_offd_data[i] = hypre_max( AN_offd_data[i],data[i*num_functions+j]);
|
||||
}
|
||||
}
|
||||
hypre_TFree(data);
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case 6: /* sum of value of all elements in block */
|
||||
{
|
||||
for (i=0; i < num_nodes; i++)
|
||||
{
|
||||
for (j=0; j < num_functions; j++)
|
||||
{
|
||||
for (k=A_offd_i[row]; k < A_offd_i[row+1]; k++)
|
||||
{
|
||||
k_map = map_to_map[A_offd_j[k]];
|
||||
if (counter[k_map] < start_index)
|
||||
{
|
||||
counter[k_map] = index;
|
||||
AN_offd_j[index] = k_map;
|
||||
AN_offd_data[index] = (A_offd_data[k]);
|
||||
index++;
|
||||
}
|
||||
else
|
||||
{
|
||||
AN_offd_data[counter[k_map]] += (A_offd_data[k]);
|
||||
}
|
||||
}
|
||||
row++;
|
||||
}
|
||||
start_index = index;
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
hypre_TFree(map_to_map);
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user