[petsc-users] Use MatConvert

Chung-Kan Huang ckhuangf at gmail.com
Tue Mar 17 13:34:54 CDT 2015


I created a short code to illustrate my problem..
if you run the program with
-mat_view
-mat_view draw
-draw_pause -1

the first matrix you see has the correct structure while the one after
Matconvert gives the wrong one.

I think it possibly has something to do with the way I use
MatSetValuesBlocked after the convert?

#include <iostream>
#include <string>

#include "petscksp.h"
#include "petscao.h"
#include "petsc.h"
#include "HYPRE.h"

using namespace std;

void preassem(Mat & J, double * P, const int & n);

int main (int argc, char ** argv)
{
  MPI_Init(&argc, &argv);

  PetscInitialize(PETSC_NULL,
          PETSC_NULL,
          PETSC_NULL,
           PETSC_NULL);

  PetscViewer viewer;
  Mat J;
  PetscInt bs = 4;
  PetscInt n = 3;
  PetscInt bssq = bs * bs;
  double P[bssq];
  PetscInt local_size = bs * n;
  for (int i = 0; i < bssq; i++) {
    P[i] = 1.;
  }
  MatCreate(PETSC_COMM_WORLD, &J);

  MatSetBlockSize(J, bs); // So MatSetValuesBlocked can be used

  MatSetType(J, MATAIJ);

  PetscInt d_nnz[12] = {8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 4, 4};


  MatSetSizes(J,
          local_size,
          local_size,
          PETSC_DECIDE,
          PETSC_DECIDE);

  MatSeqAIJSetPreallocation(J,
                PETSC_DEFAULT,
                d_nnz);

  preassem(J, P, n); // Shows the correct structure



  MatConvert(J, MATBAIJ, MAT_REUSE_MATRIX, & J);

  MatZeroEntries(J);

  preassem(J, P, n); // Shows the incorrect structurex


  // Destroy PETSc objects.
  MatDestroy(& J);

  PetscViewerDestroy(& viewer);
  PetscFinalize();

  MPI_Finalize();

  return 0;
}

void preassem(Mat & J, double * P, const int & n)
{
  for (int GID = 0; GID < n; GID++) {
    MatSetValuesBlocked(J,
            1,
            & GID,
            1,
            & GID,
            P,
            ADD_VALUES);
  }
  int GID = 0;
  const int jGID = 2;

  MatSetValuesBlocked(J,
              1,
              & GID,
              1,
              & jGID,
              P,
              ADD_VALUES);
  MatAssemblyBegin(J, MAT_FINAL_ASSEMBLY);
  MatAssemblyEnd(J, MAT_FINAL_ASSEMBLY);

}


On Tue, Mar 17, 2015 at 12:43 PM, Barry Smith <bsmith at mcs.anl.gov> wrote:

>
> > On Mar 17, 2015, at 11:40 AM, Chung-Kan Huang <ckhuangf at gmail.com>
> wrote:
> >
> > Hi,
> >
> > I wonder what I did wrong when using MATConvert...
> >
> >   MatCreate(* comm_, &J_);
> >
> >   PetscInt * d_nnz = NULL;
> >   PetscInt * o_nnz = NULL;
> >   PetscMalloc(local_size * sizeof(PetscInt), & d_nnz);
> >   PetscMalloc(local_size * sizeof(PetscInt), & o_nnz);
> >   for (int i = 0; i < local_size; i++) {
> >     d_nnz[i] = d_nnz_v[i];
> >     o_nnz[i] = o_nnz_v[i];
> >   }
> >   MatSetSizes(J_,
> >           local_size,
> >           local_size,
> >           PETSC_DECIDE,
> >           PETSC_DECIDE);
> >
> >   MatSetBlockSize(J_, M_SIZE); // So MatSetValuesBlocked can be used
> >   MatSetType(J_, MATAIJ);
> >
> >   if (comm_->Get_size() > 1) {
>
> You don't need to have this if here; just call both
> MatMPIAIJSetPreallocation and MatSeqAIJSetPreallocation() and PETSc will
> use the correct one and ignore the other one automatically.
>
> >     // MPI
> >     MatMPIAIJSetPreallocation(J_,
> >                   max_d_nz,
> >                   d_nnz,
> >                   max_o_nz,
> >                   o_nnz);
> >
> >   } else {
> >     // Seq
> >     MatSeqAIJSetPreallocation(J_,
> >                   PETSC_DEFAULT,
> >                   d_nnz);
> >   }
> >
> >   PetscFree(d_nnz);
> >   PetscFree(o_nnz);
> >
> >
> >   // Column oriented
> >   MatSetOption(J_, MAT_ROW_ORIENTED, PETSC_FALSE);
> >   // Test code to check if J_ has right structure
> >   preAssembeJ();
> >
> > <image.png>
> >   MatAssemblyBegin(J_, MAT_FINAL_ASSEMBLY);
> >   MatAssemblyEnd(J_, MAT_FINAL_ASSEMBLY);
> >
> >
> >  MatConvert(J_, MATBAIJ, MAT_REUSE_MATRIX, & J_);
>
>    I cannot understand what is wrong. Is it producing the wrong matrix?
> Please send the entire code so we can run it ourselves.
>
>   Barry
>
> >
> >   MatZeroEntries(J_);
> > // Test code to check if J_ has right structure
> >   preAssembeJ();
> > <image.png>
> > Thanks,
> > Kan
> > Cheers
> >
>
>


-- 

*Cheers*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20150317/ef6a03c4/attachment.html>


More information about the petsc-users mailing list