| /*BHEADER********************************************************************** |
| * (c) 1997 The Regents of the University of California |
| * |
| * See the file COPYRIGHT_and_DISCLAIMER for a complete copyright |
| * notice, contact person, and disclaimer. |
| * |
| * $Revision$ |
| *********************************************************************EHEADER*/ |
| /****************************************************************************** |
| * |
| * Member functions for hypre_StructMatrix class. |
| * |
| *****************************************************************************/ |
| |
| #include "headers.h" |
| |
| /*-------------------------------------------------------------------------- |
| * hypre_StructMatrixCreateMask |
| * This routine returns the matrix, `mask', containing pointers to |
| * some of the data in the input matrix `matrix'. This can be useful, |
| * for example, to construct "splittings" of a matrix for use in |
| * iterative methods. The key note here is that the matrix `mask' does |
| * NOT contain a copy of the data in `matrix', but it can be used as |
| * if it were a normal StructMatrix object. |
| * |
| * Notes: |
| * (1) Only the stencil, data_indices, and global_size components of the |
| * StructMatrix structure are modified. |
| * (2) PrintStructMatrix will not correctly print the stencil-to-data |
| * correspondence. |
| *--------------------------------------------------------------------------*/ |
| |
| hypre_StructMatrix * |
| hypre_StructMatrixCreateMask( hypre_StructMatrix *matrix, |
| int num_stencil_indices, |
| int *stencil_indices ) |
| { |
| hypre_StructMatrix *mask; |
| |
| hypre_StructStencil *stencil; |
| hypre_Index *stencil_shape; |
| int stencil_size; |
| hypre_Index *mask_stencil_shape; |
| int mask_stencil_size; |
| |
| hypre_BoxArray *data_space; |
| int **data_indices; |
| int **mask_data_indices; |
| |
| int i, j; |
| |
| stencil = hypre_StructMatrixStencil(matrix); |
| stencil_shape = hypre_StructStencilShape(stencil); |
| stencil_size = hypre_StructStencilSize(stencil); |
| |
| mask = hypre_CTAlloc(hypre_StructMatrix, 1); |
| |
| hypre_StructMatrixComm(mask) = hypre_StructMatrixComm(matrix); |
| |
| hypre_StructGridRef(hypre_StructMatrixGrid(matrix), |
| &hypre_StructMatrixGrid(mask)); |
| |
| hypre_StructMatrixUserStencil(mask) = |
| hypre_StructStencilRef(hypre_StructMatrixUserStencil(matrix)); |
| |
| mask_stencil_size = num_stencil_indices; |
| mask_stencil_shape = hypre_CTAlloc(hypre_Index, num_stencil_indices); |
| for (i = 0; i < num_stencil_indices; i++) |
| { |
| hypre_CopyIndex(stencil_shape[stencil_indices[i]], |
| mask_stencil_shape[i]); |
| } |
| hypre_StructMatrixStencil(mask) = |
| hypre_StructStencilCreate(hypre_StructStencilDim(stencil), |
| mask_stencil_size, |
| mask_stencil_shape); |
| |
| hypre_StructMatrixNumValues(mask) = hypre_StructMatrixNumValues(matrix); |
| |
| hypre_StructMatrixDataSpace(mask) = |
| hypre_BoxArrayDuplicate(hypre_StructMatrixDataSpace(matrix)); |
| |
| hypre_StructMatrixData(mask) = hypre_StructMatrixData(matrix); |
| hypre_StructMatrixDataAlloced(mask) = 0; |
| hypre_StructMatrixDataSize(mask) = hypre_StructMatrixDataSize(matrix); |
| data_space = hypre_StructMatrixDataSpace(matrix); |
| data_indices = hypre_StructMatrixDataIndices(matrix); |
| mask_data_indices = hypre_CTAlloc(int *, hypre_BoxArraySize(data_space)); |
| hypre_ForBoxI(i, data_space) |
| { |
| mask_data_indices[i] = hypre_TAlloc(int, num_stencil_indices); |
| for (j = 0; j < num_stencil_indices; j++) |
| { |
| mask_data_indices[i][j] = data_indices[i][stencil_indices[j]]; |
| } |
| } |
| hypre_StructMatrixDataIndices(mask) = mask_data_indices; |
| |
| hypre_StructMatrixSymmetric(mask) = hypre_StructMatrixSymmetric(matrix); |
| |
| hypre_StructMatrixSymmElements(mask) = hypre_TAlloc(int, stencil_size); |
| for (i = 0; i < stencil_size; i++) |
| { |
| hypre_StructMatrixSymmElements(mask)[i] = |
| hypre_StructMatrixSymmElements(matrix)[i]; |
| } |
| |
| for (i = 0; i < 6; i++) |
| { |
| hypre_StructMatrixNumGhost(mask)[i] = |
| hypre_StructMatrixNumGhost(matrix)[i]; |
| } |
| |
| hypre_StructMatrixGlobalSize(mask) = |
| hypre_StructGridGlobalSize(hypre_StructMatrixGrid(mask)) * |
| mask_stencil_size; |
| |
| hypre_StructMatrixCommPkg(mask) = NULL; |
| |
| hypre_StructMatrixRefCount(mask) = 1; |
| |
| return mask; |
| } |
| |