Ejemplo n.º 1
0
// load a matrix from file "n" into matrix A
// returns 0: success, <0 failure
int load_matrix( char* n, matrix_t* A ) {
  assert( A != NULL );
  if ( n == NULL ) {
    fprintf( stderr, "input error: No input specified (-i)\n" );
    return 1; // failure
  }
  // make sure we don't have a memory leak
  clear_matrix(A);

  int ret;
  enum sparse_matrix_file_format_t ext;
  if (( ret = _identify_format_from_extension( n, &ext, 1 ) ) != 0 )
    return ret;

  switch(ext) {
    case MATRIX_MARKET:  ret = readmm( n, A, NULL ); break; // NULL = ignore comments
    case MATLAB:         ret = read_mat( n, A ); break;
    case HARWELL_BOEING: ret = 100; assert(0); break; // shouldn't be able to get here
  }
  if ( ret != 0 ) {
    fprintf( stderr, "input error: Failed to load matrix\n"); // TODO move these printouts to main...
    return ret;
  }

  if(A->sym == SM_UNSYMMETRIC)
    detect_matrix_symmetry( A );

  return 0; // success
}
Ejemplo n.º 2
0
int main(int argc,char **args)
{
  Mat            A,B,Y;                 /*input : the three imput matrix */
  Mat            P;                     /* P=QR factorization*/
  PetscViewer    fd1,fd2;
  char           file[4][PETSC_MAX_PATH_LEN];
  //Mat            C;                     /*C=B*Y*/
  PetscInt       m,n;                   /*size of matrix C;*/
  Mat            E,X;                 /*lhs and rhs of the linear equations;*/
  Vec            b,x;                   /*column vector of rhs;*/
  KSP            ksp;                   /* linear solver context */
  PetscErrorCode ierr;
  PetscInt       i,its;                 /*iteration numbers of KSP*/
  PetscBool      flg;

  m=10;
  n=4;

  PetscInitialize(&argc,&args,(char*)0,help);
  ierr = PetscOptionsGetString(NULL,"-fa",file[0],PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
  if(!flg){SETERRQ(PETSC_COMM_WORLD,1,"Please provide matrix A!\n");}
  ierr = PetscOptionsGetString(NULL,"-fb",file[1],PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
  if(!flg){SETERRQ(PETSC_COMM_WORLD,1,"Please provide matrix B!\n");}
  ierr = PetscOptionsGetString(NULL,"-fy",file[2],PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
  if(!flg){SETERRQ(PETSC_COMM_WORLD,1,"Please provide matrix Y!\n");}
  ierr = PetscOptionsGetString(NULL,"-fp",file[3],PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
  if(!flg){SETERRQ(PETSC_COMM_WORLD,1,"Please provide matrix P!\n");}


  /*Load the matrices*/
  ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,file[0],FILE_MODE_READ,&fd1);
  ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr);
  ierr = MatSetFromOptions(A);CHKERRQ(ierr);
  ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,file[1],FILE_MODE_READ,&fd2);
  ierr = MatCreate(PETSC_COMM_WORLD,&B);CHKERRQ(ierr);
  ierr = MatSetFromOptions(B);CHKERRQ(ierr);

  ierr = MatLoad(A,fd1);CHKERRQ(ierr);
  ierr = MatLoad(B,fd2);CHKERRQ(ierr);
  readmm(file[2], &Y);
  readmm(file[3], &P);
  ierr = PetscPrintf(PETSC_COMM_SELF,"Read file completes.\n");CHKERRQ(ierr);
#if(cxDEBUG==1)
  ierr = MatView(A,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 
  ierr = MatView(B,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 
#endif

  Mat Q1;
  ierr = MatCreate(PETSC_COMM_WORLD, &Q1); CHKERRQ(ierr);
  ierr = MatSetFromOptions(Q1); CHKERRQ(ierr);
  ierr = MatMatMult(B,Y,MAT_INITIAL_MATRIX,PETSC_DEFAULT, &Q1);CHKERRQ(ierr); 
#if(cxDEBUG==1)
  ierr = PetscPrintf(PETSC_COMM_SELF,"Cao this is BY.\n");CHKERRQ(ierr);
  ierr = MatView(Q1,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
#endif

  getQ1(&Q1);
 
#if(cxDEBUG==1)
  ierr = PetscPrintf(PETSC_COMM_SELF,"\nTHIS IS Q1.\n");CHKERRQ(ierr);
  ierr = MatView(Q1,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
#endif
  
  Mat SBP;
  ierr = MatMatTransposeMult(Q1,Q1,MAT_INITIAL_MATRIX,  PETSC_DEFAULT ,&SBP);
  ierr = MatAssemblyBegin(SBP,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
  ierr = MatAssemblyEnd(SBP,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
  ierr = MatShift(SBP,-1);
  ierr = MatScale(SBP,-1);
  
#if(cxDEBUG==1)  
  ierr = PetscPrintf(PETSC_COMM_SELF,"\nTHIS IS SBP = Q1*Q1'.\n");CHKERRQ(ierr);
  ierr = MatView(SBP,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
  ierr = PetscPrintf(PETSC_COMM_SELF,"\nBelows is act_P.\n");CHKERRQ(ierr);
  ierr = MatView(P  ,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
#endif

  ierr = MatMatMult(A,Y,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&E);CHKERRQ(ierr);
  ierr = MatMatMult(SBP,E,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&E);CHKERRQ(ierr);
  
#if(cxDEBUG==1)
  ierr = PetscPrintf(PETSC_COMM_SELF,"\nBelows is PAY.\n");CHKERRQ(ierr);
  ierr = MatView(E,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
#endif
  ierr = MatAssemblyBegin(E,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
  ierr = MatAssemblyEnd(E,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);


  //ierr = MatGetSize(E,&m,&n);CHKERRQ(ierr);
  ierr = MatCreate(PETSC_COMM_WORLD,&X);CHKERRQ(ierr);
  ierr = MatSetSizes(X,PETSC_DECIDE,PETSC_DECIDE,m,n);CHKERRQ(ierr);
  ierr = MatSetFromOptions(X);CHKERRQ(ierr);
  ierr = MatSetUp(X); CHKERRQ(ierr);
  ierr = MatZeroEntries(X);CHKERRQ(ierr);

  ierr = MatAssemblyBegin(X,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
  ierr = MatAssemblyEnd(X,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);

 // PetscInt ix[m];
 // for(i=0;i<m;i++){
 //   ix[i] = i;
 // }
  
  VecCreate(PETSC_COMM_WORLD,&b);
  VecSetSizes(b,PETSC_DECIDE,m);
  VecSetFromOptions(b);
  
  VecCreate(PETSC_COMM_WORLD,&x);
  VecSetSizes(x,PETSC_DECIDE,m);
  VecSetFromOptions(x);

//#if(cxDEBUG==1)
  ierr = PetscPrintf(PETSC_COMM_SELF,"\nBEFORE CG Check A\n");CHKERRQ(ierr);
  ierr = MatView(A,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
  ierr = PetscPrintf(PETSC_COMM_SELF,"\nBEFORE CG Check SBP\n");CHKERRQ(ierr);
  ierr = MatView(SBP,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
  ierr = PetscPrintf(PETSC_COMM_SELF,"\nBEFORE CG Check E\n");CHKERRQ(ierr);
  ierr = MatView(E,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
//#endif
  
  for(i=0;i<n;i++){
    MatGetColumnVector(E,b,i);
    PetscPrintf(PETSC_COMM_WORLD,"the rhs\n");
    VecView(b,PETSC_VIEWER_STDOUT_WORLD);
    KSPCreate(PETSC_COMM_WORLD,&ksp);
    KSPSetOperators(ksp,A,SBP);
    KSPSetNormType(ksp,KSP_NORM_UNPRECONDITIONED);
    KSPSetCheckNormIteration(ksp,-1);
    KSPSetTolerances(ksp,1.0e-06,PETSC_DEFAULT,PETSC_DEFAULT,400);
    KSPSetInitialGuessNonzero(ksp,PETSC_FALSE);
    KSPSetFromOptions(ksp);
    KSPSolve(ksp,b,x);
    KSPGetIterationNumber(ksp,&its);
    PetscPrintf(PETSC_COMM_WORLD,"%d-th equation,iteration=%D\n",i,its);
    VecView(x,PETSC_VIEWER_STDOUT_WORLD);
  }
  return 0;
  
}