[petsc-users] Only one column is in the matrix after solving the inverse matrix

Hong Zhang hzhang at mcs.anl.gov
Tue Nov 22 10:08:25 CST 2011


You can take a look at examples
petsc-3.2/src/mat/examples/tests/ex1.c, ex125.c and ex125.c.

Hong

On Tue, Nov 22, 2011 at 9:23 AM, Yaoyu Hu <huyaoyu1986 at gmail.com> wrote:
> Hi, everyone,
>
> I am new to PETSc, and I have just begun to use it together with slepc. It
> is really fantastic and I like it!
>
>
>
> It was not from me but one of my colleges who wanted to solve an inverse of
> a matrix, which had 400 rows and columns.
>
>
>
> I know that it is not good to design a algorithm that has a process for
> solving the inverse of a matrix. I just wanted to give it a try. However,
> things turned out wired. I followed the instructions on the FAQ web page of
> PETSc, the one using MatLUFractor() and MatMatSolve(). After I finished the
> coding, I tried the program. The result I got was a matrix which only has
> its first column but nothing else. I did not know what's happened. The
> following is the codes I used. It is kind of badly organized and the gmail
> web page ignores my 'Tab's, forgive me for that.
>
>
>
> Thanks ahead!
>
>
>
> ============Code Begins=============
>
> /*
>  * MI.cpp
>  *
>  *  Created on: Nov 22, 2011
>  *      Author: huyaoyu
>  */
>
> static char help[] = "Give the inverse of a matrix.\n\n";
>
> #include <slepceps.h>
>
> #include <iostream>
> #include <fstream>
>
> #undef __FUNCT__
> #define __FUNCT__ "main"
>
> #define DIMENSION 2
>
> int main(int argc,char **args)
> {
>  PetscErrorCode ierr;
>  PetscMPIInt    size;
>  Mat A,CA;
>  Mat BB,XX;
>  IS is_row;
>  IS is_col;
>  MatFactorInfo mfinfo;
>  PetscMPIInt n;
>  PetscScalar* array_scalar = new PetscScalar[DIMENSION*DIMENSION];
>
>  for(int i=0;i<DIMENSION*DIMENSION;i++)
>  {
>   array_scalar[i] = 0.0;
>  }
>  for(int i=0;i<DIMENSION;i++)
>  {
>   array_scalar[i*DIMENSION + i] = 1.0;
>  }
>
>  int idxm[DIMENSION];
>  for(int i=0;i<DIMENSION;i++)
>  {
>   idxm[i] = i;
>  }
>
>  PetscInitialize(&argc,&args,(char *)0,help);
>  ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
>  if (size != 1) SETERRQ(PETSC_COMM_WORLD,1,"This is a uniprocessor example
> only!");
>  ierr = PetscOptionsGetInt(PETSC_NULL,"-n",&n,PETSC_NULL);CHKERRQ(ierr);
>
>  // B & X
>  ierr =
> MatCreateSeqDense(PETSC_COMM_WORLD,DIMENSION,DIMENSION,PETSC_NULL,&BB);
> CHKERRQ(ierr);
>  ierr =
> MatCreateSeqDense(PETSC_COMM_WORLD,DIMENSION,DIMENSION,PETSC_NULL,&XX);
> CHKERRQ(ierr);
>
>  ierr =
> MatSetValues(BB,DIMENSION,idxm,DIMENSION,idxm,array_scalar,INSERT_VALUES);
> CHKERRQ(ierr);
>  ierr = MatAssemblyBegin(BB,MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
>  ierr = MatAssemblyEnd(BB,MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
>
>  ierr = ISCreateStride(MPI_COMM_WORLD,DIMENSION,0,1,&is_row); CHKERRQ(ierr);
>  ierr = ISCreateStride(MPI_COMM_WORLD,DIMENSION,0,1,&is_col); CHKERRQ(ierr);
>  ierr = MatFactorInfoInitialize(&mfinfo); CHKERRQ(ierr);
>
>  // matrix A
>  std::fstream in_file;
>  double temp_scalar;
>  in_file.open("./A.txt",std::ifstream::in);
>  if(!in_file.good())
>  {
>   ierr = PetscPrintf(PETSC_COMM_SELF,"File open failed!\n"); CHKERRQ(ierr);
>   return 1;
>  }
>
>  for(int i=0;i<DIMENSION;i++)
>  {
>   for(int j=0;j<DIMENSION;j++)
>   {
>    in_file>>temp_scalar;
>
>    array_scalar[i*DIMENSION + j] = temp_scalar;
>   }
>  }
>  in_file.close();
>
>  ierr =
> MatCreateSeqDense(PETSC_COMM_WORLD,DIMENSION,DIMENSION,PETSC_NULL,&A);
> CHKERRQ(ierr);
>  ierr =
> MatCreateSeqDense(PETSC_COMM_WORLD,DIMENSION,DIMENSION,PETSC_NULL,&CA);
> CHKERRQ(ierr);
>  ierr =
> MatSetValues(A,DIMENSION,idxm,DIMENSION,idxm,array_scalar,INSERT_VALUES);
> CHKERRQ(ierr);
>
>  ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
>  ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
>
>  ierr = MatDuplicate(A,MAT_COPY_VALUES,&CA); CHKERRQ(ierr);
>
>  ierr = MatLUFactor(A,is_row,is_col,&mfinfo); CHKERRQ(ierr);
>  ierr = MatMatSolve(A,BB,XX); CHKERRQ(ierr);
>  ierr = PetscPrintf(PETSC_COMM_SELF,"The inverse of A matrix is:\n");
> CHKERRQ(ierr);
>  ierr = MatView(XX,PETSC_VIEWER_STDOUT_SELF); CHKERRQ(ierr);
>
>  ierr = MatMatMult(CA,XX,MAT_REUSE_MATRIX,PETSC_DEFAULT,&BB);
>  ierr = MatView(BB,PETSC_VIEWER_STDOUT_SELF); CHKERRQ(ierr);
>
>  // destroy
>  ierr = MatDestroy(&A); CHKERRQ(ierr);
>  ierr = MatDestroy(&BB); CHKERRQ(ierr);
>  ierr = MatDestroy(&XX); CHKERRQ(ierr);
>  ierr = MatDestroy(&CA); CHKERRQ(ierr);
>
>  ierr = PetscFinalize();
>
>  delete[] array_scalar;
>
>  return 0;
> }
>
> ============Code Ends==============


More information about the petsc-users mailing list