Changed SetBoxValues() to set only stored coefficients. This eliminates a
problem in the SStruct interface for non-cell problems by leaving the ghost layers for accumulating values. The symmetric coefficients are filled in (some in the ghost layers) at Assemble() time.
This commit is contained in:
parent
3109c15561
commit
e390780737
@ -704,6 +704,7 @@ hypre_StructMatrixSetBoxValues( hypre_StructMatrix *matrix,
|
|||||||
hypre_StructStencil *stencil;
|
hypre_StructStencil *stencil;
|
||||||
HYPRE_Int center_rank;
|
HYPRE_Int center_rank;
|
||||||
|
|
||||||
|
HYPRE_Int *symm_elements;
|
||||||
hypre_BoxArray *data_space;
|
hypre_BoxArray *data_space;
|
||||||
hypre_Box *data_box;
|
hypre_Box *data_box;
|
||||||
hypre_IndexRef data_start;
|
hypre_IndexRef data_start;
|
||||||
@ -727,6 +728,7 @@ hypre_StructMatrixSetBoxValues( hypre_StructMatrix *matrix,
|
|||||||
*-----------------------------------------------------------------------*/
|
*-----------------------------------------------------------------------*/
|
||||||
|
|
||||||
constant_coefficient = hypre_StructMatrixConstantCoefficient(matrix);
|
constant_coefficient = hypre_StructMatrixConstantCoefficient(matrix);
|
||||||
|
symm_elements = hypre_StructMatrixSymmElements(matrix);
|
||||||
|
|
||||||
if (outside > 0)
|
if (outside > 0)
|
||||||
{
|
{
|
||||||
@ -785,90 +787,93 @@ hypre_StructMatrixSetBoxValues( hypre_StructMatrix *matrix,
|
|||||||
|
|
||||||
for (s = 0; s < num_stencil_indices; s++)
|
for (s = 0; s < num_stencil_indices; s++)
|
||||||
{
|
{
|
||||||
datap = hypre_StructMatrixBoxData(matrix, i,
|
/* only set stored stencil values */
|
||||||
stencil_indices[s]);
|
if (symm_elements[stencil_indices[s]] < 0)
|
||||||
|
|
||||||
if ( constant_coefficient==1 ||
|
|
||||||
( constant_coefficient==2 && stencil_indices[s]!=center_rank ))
|
|
||||||
/* datap has only one data point for a given i and s */
|
|
||||||
{
|
{
|
||||||
/* should have called SetConstantValues */
|
datap = hypre_StructMatrixBoxData(matrix, i, stencil_indices[s]);
|
||||||
hypre_error(HYPRE_ERROR_GENERIC);
|
|
||||||
hypre_BoxGetSize(int_box, loop_size);
|
|
||||||
|
|
||||||
if (action > 0)
|
if ( (constant_coefficient==1) ||
|
||||||
|
(constant_coefficient==2 && stencil_indices[s]!=center_rank ))
|
||||||
|
/* datap has only one data point for a given i and s */
|
||||||
{
|
{
|
||||||
datai = hypre_CCBoxIndexRank(data_box,data_start);
|
/* should have called SetConstantValues */
|
||||||
dvali = hypre_BoxIndexRank(dval_box,dval_start);
|
hypre_error(HYPRE_ERROR_GENERIC);
|
||||||
datap[datai] += values[dvali];
|
hypre_BoxGetSize(int_box, loop_size);
|
||||||
}
|
|
||||||
else if (action > -1)
|
if (action > 0)
|
||||||
{
|
|
||||||
datai = hypre_CCBoxIndexRank(data_box,data_start);
|
|
||||||
dvali = hypre_BoxIndexRank(dval_box,dval_start);
|
|
||||||
datap[datai] = values[dvali];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
datai = hypre_CCBoxIndexRank(data_box,data_start);
|
|
||||||
dvali = hypre_BoxIndexRank(dval_box,dval_start);
|
|
||||||
values[dvali] = datap[datai];
|
|
||||||
if (action == -2)
|
|
||||||
{
|
|
||||||
datap[datai] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
else /* variable coefficient: constant_coefficient==0
|
|
||||||
or diagonal with constant_coefficient==2 */
|
|
||||||
{
|
|
||||||
hypre_BoxGetSize(int_box, loop_size);
|
|
||||||
|
|
||||||
if (action > 0)
|
|
||||||
{
|
|
||||||
hypre_BoxLoop2Begin(loop_size,
|
|
||||||
data_box,data_start,data_stride,datai,
|
|
||||||
dval_box,dval_start,dval_stride,dvali);
|
|
||||||
#define HYPRE_BOX_SMP_PRIVATE loopk,loopi,loopj,datai,dvali
|
|
||||||
#include "hypre_box_smp_forloop.h"
|
|
||||||
hypre_BoxLoop2For(loopi, loopj, loopk, datai, dvali)
|
|
||||||
{
|
{
|
||||||
|
datai = hypre_CCBoxIndexRank(data_box,data_start);
|
||||||
|
dvali = hypre_BoxIndexRank(dval_box,dval_start);
|
||||||
datap[datai] += values[dvali];
|
datap[datai] += values[dvali];
|
||||||
}
|
}
|
||||||
hypre_BoxLoop2End(datai, dvali);
|
else if (action > -1)
|
||||||
}
|
|
||||||
else if (action > -1)
|
|
||||||
{
|
|
||||||
hypre_BoxLoop2Begin(loop_size,
|
|
||||||
data_box,data_start,data_stride,datai,
|
|
||||||
dval_box,dval_start,dval_stride,dvali);
|
|
||||||
#define HYPRE_BOX_SMP_PRIVATE loopk,loopi,loopj,datai,dvali
|
|
||||||
#include "hypre_box_smp_forloop.h"
|
|
||||||
hypre_BoxLoop2For(loopi, loopj, loopk, datai, dvali)
|
|
||||||
{
|
{
|
||||||
|
datai = hypre_CCBoxIndexRank(data_box,data_start);
|
||||||
|
dvali = hypre_BoxIndexRank(dval_box,dval_start);
|
||||||
datap[datai] = values[dvali];
|
datap[datai] = values[dvali];
|
||||||
}
|
}
|
||||||
hypre_BoxLoop2End(datai, dvali);
|
else
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
hypre_BoxLoop2Begin(loop_size,
|
|
||||||
data_box,data_start,data_stride,datai,
|
|
||||||
dval_box,dval_start,dval_stride,dvali);
|
|
||||||
#define HYPRE_BOX_SMP_PRIVATE loopk,loopi,loopj,datai,dvali
|
|
||||||
#include "hypre_box_smp_forloop.h"
|
|
||||||
hypre_BoxLoop2For(loopi, loopj, loopk, datai, dvali)
|
|
||||||
{
|
{
|
||||||
|
datai = hypre_CCBoxIndexRank(data_box,data_start);
|
||||||
|
dvali = hypre_BoxIndexRank(dval_box,dval_start);
|
||||||
values[dvali] = datap[datai];
|
values[dvali] = datap[datai];
|
||||||
if (action == -2)
|
if (action == -2)
|
||||||
{
|
{
|
||||||
datap[datai] = 0;
|
datap[datai] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
hypre_BoxLoop2End(datai, dvali);
|
|
||||||
}
|
}
|
||||||
}
|
else /* variable coefficient: constant_coefficient==0
|
||||||
|
or diagonal with constant_coefficient==2 */
|
||||||
|
{
|
||||||
|
hypre_BoxGetSize(int_box, loop_size);
|
||||||
|
|
||||||
|
if (action > 0)
|
||||||
|
{
|
||||||
|
hypre_BoxLoop2Begin(loop_size,
|
||||||
|
data_box,data_start,data_stride,datai,
|
||||||
|
dval_box,dval_start,dval_stride,dvali);
|
||||||
|
#define HYPRE_BOX_SMP_PRIVATE loopk,loopi,loopj,datai,dvali
|
||||||
|
#include "hypre_box_smp_forloop.h"
|
||||||
|
hypre_BoxLoop2For(loopi, loopj, loopk, datai, dvali)
|
||||||
|
{
|
||||||
|
datap[datai] += values[dvali];
|
||||||
|
}
|
||||||
|
hypre_BoxLoop2End(datai, dvali);
|
||||||
|
}
|
||||||
|
else if (action > -1)
|
||||||
|
{
|
||||||
|
hypre_BoxLoop2Begin(loop_size,
|
||||||
|
data_box,data_start,data_stride,datai,
|
||||||
|
dval_box,dval_start,dval_stride,dvali);
|
||||||
|
#define HYPRE_BOX_SMP_PRIVATE loopk,loopi,loopj,datai,dvali
|
||||||
|
#include "hypre_box_smp_forloop.h"
|
||||||
|
hypre_BoxLoop2For(loopi, loopj, loopk, datai, dvali)
|
||||||
|
{
|
||||||
|
datap[datai] = values[dvali];
|
||||||
|
}
|
||||||
|
hypre_BoxLoop2End(datai, dvali);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
hypre_BoxLoop2Begin(loop_size,
|
||||||
|
data_box,data_start,data_stride,datai,
|
||||||
|
dval_box,dval_start,dval_stride,dvali);
|
||||||
|
#define HYPRE_BOX_SMP_PRIVATE loopk,loopi,loopj,datai,dvali
|
||||||
|
#include "hypre_box_smp_forloop.h"
|
||||||
|
hypre_BoxLoop2For(loopi, loopj, loopk, datai, dvali)
|
||||||
|
{
|
||||||
|
values[dvali] = datap[datai];
|
||||||
|
if (action == -2)
|
||||||
|
{
|
||||||
|
datap[datai] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
hypre_BoxLoop2End(datai, dvali);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} /* end if (symm_elements) */
|
||||||
|
|
||||||
hypre_IndexD(dval_start, 0) ++;
|
hypre_IndexD(dval_start, 0) ++;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user