[petsc-users] teething troubles / MatView() fails silently for transposed seqaij matrix

Bryan Jurish moocow.bovine at gmail.com
Fri Apr 13 07:25:13 CDT 2018


morning all,

Apologies for what is very probably a boundlessly stupid question.  I've
just begun exploring PETSc, but find myself stumped by a pretty trivial
task.  I would like to load a real binary seqaij matrix and save its
transposition (also as a binary  seqaij matrix) to a different file.  I've
tried PETSc v3.7.5 on debian stretch and v3.6.2 on ubuntu 16.04, both with
no joy.  In both cases the program runs to completion and exits normally,
but no output file ("INFILE.T") is written.  Stepping through MatView()
with the debugger, it seems that (mat->ops->view) is not set for the
transposition I created with MatCreateTranspose(). I suppose I could always
loop over the input indices and assemble a physical transposition manually,
but that rather defeats the purpose of the exercise... can anyone here tell
me what I'm doing wrong (almost certainly something fundamental and
obvious)?  Thanks in advance for any help you can provide.

marmosets,
  Bryan

::: BEGIN MINIMUM BROKEN EXAMPLE :::
/*-*- Mode: C -*-*/

static char help[] = "Transposes a matrix in BINARY format\n\
Input parameters are:\n\
  -file INFILE     : input matrix in binary format\n\
  -out OUTFILE     : write output to OUTFILE (default=INFILE.T)\n\
";


#include <petscmat.h>

//-- handle v3.7 API change
#if PETSC_VERSION_MAJOR>3 || (PETSC_VERSION_MAJOR==3 &&
PETSC_VERSION_MINOR>=7)
  #define OPTIONS_NULL NULL,NULL
#else
  #define OPTIONS_NULL NULL
#endif


#undef __FUNCT__
#define __FUNCT__ "main"
int main(int argc,char **args)
{
  Mat            A,B;
  char           infile[PETSC_MAX_PATH_LEN], outfile[PETSC_MAX_PATH_LEN];
  PetscErrorCode ierr;
  PetscInt       m,n;
  PetscViewer    view;
  PetscBool      flg_file,flg_out;
  PetscMPIInt    size;

  PetscInitialize(&argc,&args,(char*)0,help);
  ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
  ierr = PetscPrintf(PETSC_COMM_WORLD," MPI_Comm_size reports %d
process(es) available.\n", size);CHKERRQ(ierr);
  if (size != 1) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_SUP,"This is a
uniprocessor operation only!");

  /*-- Read in source matrix, binary --*/
  ierr =
PetscOptionsGetString(OPTIONS_NULL,"-file",infile,PETSC_MAX_PATH_LEN,&flg_file);CHKERRQ(ierr);
  if (!flg_file) SETERRQ(PETSC_COMM_WORLD,1,"Must specify a file name with
the -file option");

#if defined(PETSC_USE_COMPLEX)
  ierr = PetscPrintf(PETSC_COMM_WORLD," Reading COMPLEX matrix from binary
file `%s'...\n", infile);CHKERRQ(ierr);
#else
  ierr = PetscPrintf(PETSC_COMM_WORLD," Reading REAL matrix from binary
file `%s'...\n", infile);CHKERRQ(ierr);
#endif
  ierr =
PetscViewerBinaryOpen(PETSC_COMM_WORLD,infile,FILE_MODE_READ,&view);CHKERRQ(ierr);
  ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr);
  ierr = MatSetFromOptions(A);CHKERRQ(ierr);
  ierr = MatLoad(A,view);CHKERRQ(ierr);
  ierr = PetscViewerDestroy(&view);CHKERRQ(ierr);
  //
  ierr = MatGetSize(A,&m,&n);
  ierr = PetscPrintf(PETSC_COMM_WORLD," Read input matrix of size
(m=%D,n=%D)\n", m,n);CHKERRQ(ierr);

  /*-- guts: transpose --*/
  ierr = PetscPrintf(PETSC_COMM_WORLD," Performing transposition
(constructive)\n");CHKERRQ(ierr);
  ierr = MatCreateTranspose(A,&B);CHKERRQ(ierr);

  /*-- dump transposed matrix --*/
  ierr =
PetscOptionsGetString(OPTIONS_NULL,"-out",outfile,PETSC_MAX_PATH_LEN,&flg_out);CHKERRQ(ierr);
  if (!flg_out) {
    strcpy(outfile,infile);
    strcat(outfile,".T");
  }
  ierr = PetscPrintf(PETSC_COMM_SELF," Writing transposed matrix in binary
format to '%s' ...\n", outfile);CHKERRQ(ierr);
  ierr =
PetscViewerBinaryOpen(PETSC_COMM_SELF,outfile,FILE_MODE_WRITE,&view);CHKERRQ(ierr);
  ierr = MatView(B,view);CHKERRQ(ierr);

  /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   * output file is not written: much wailing and gnashing of teeth
   * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   */

  /*-- cleanup --*/
  ierr = MatDestroy(&A);CHKERRQ(ierr);
  ierr = MatDestroy(&B);CHKERRQ(ierr);
  ierr = PetscViewerDestroy(&view);CHKERRQ(ierr);
  ierr = PetscFinalize();
  return 0;
}
::: END MINIMUM BROKEN EXAMPLE :::

-- 
Bryan Jurish                           "There is *always* one more bug."
moocow.bovine at gmail.com         -Lubarsky's Law of Cybernetic Entomology
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20180413/fb82b571/attachment-0001.html>


More information about the petsc-users mailing list