Actual source code: ex30.c

petsc-3.3-p7 2013-05-11
  1: /*
  2:  * Example code testing SeqDense matrices with an LDA (leading dimension
  3:  * of the user-allocated arrray) larger than M.
  4:  * This example tests the functionality of MatSolve.
  5:  */
  6: #include <stdlib.h>
  7: #include <petscmat.h>
  8: #include <petscksp.h>

 12: int main(int argc,char **argv)
 13: {
 14:   KSP         solver;
 15:   PC          pc;
 16:   Mat         A,B;
 17:   Vec         X,Y,Z;
 18:   MatScalar   *a;
 19:   PetscScalar *b,*x,*y,*z;
 20:   PetscReal   nrm;
 21:   PetscErrorCode ierr,size=8,lda=10, i,j;

 23:   PetscInitialize(&argc,&argv,0,0);
 24:   /* Create matrix and three vectors: these are all normal */
 25:   PetscMalloc(lda*size*sizeof(PetscScalar),&b);
 26:   for (i=0; i<size; i++) {
 27:     for (j=0; j<size; j++) {
 28:       b[i+j*lda] = rand();
 29:     }
 30:   }
 31:   MatCreate(MPI_COMM_SELF,&A);
 32:   MatSetSizes(A,size,size,size,size);
 33:   MatSetType(A,MATSEQDENSE);
 34:   MatSeqDenseSetPreallocation(A,PETSC_NULL);

 36:   MatGetArray(A,&a);
 37:   for (i=0; i<size; i++) {
 38:     for (j=0; j<size; j++) {
 39:       a[i+j*size] = b[i+j*lda];
 40:     }
 41:   }
 42:   MatRestoreArray(A,&a);
 43:   MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);
 44:   MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);

 46:   MatCreate(MPI_COMM_SELF,&B);
 47:   MatSetSizes(B,size,size,size,size);
 48:   MatSetType(B,MATSEQDENSE);
 49:   MatSeqDenseSetPreallocation(B,b);
 50:   MatSeqDenseSetLDA(B,lda);
 51:   MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);
 52:   MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);

 54:   PetscMalloc(size*sizeof(PetscScalar),&x);
 55:   for (i=0; i<size; i++) {
 56:     x[i] = 1.0;
 57:   }
 58:   VecCreateSeqWithArray(MPI_COMM_SELF,1,size,x,&X);
 59:   VecAssemblyBegin(X);
 60:   VecAssemblyEnd(X);

 62:   PetscMalloc(size*sizeof(PetscScalar),&y);
 63:   VecCreateSeqWithArray(MPI_COMM_SELF,1,size,y,&Y);
 64:   VecAssemblyBegin(Y);
 65:   VecAssemblyEnd(Y);

 67:   PetscMalloc(size*sizeof(PetscScalar),&z);
 68:   VecCreateSeqWithArray(MPI_COMM_SELF,1,size,z,&Z);
 69:   VecAssemblyBegin(Z);
 70:   VecAssemblyEnd(Z);

 72:   /*
 73:    * Solve with A and B
 74:    */
 75:   KSPCreate(MPI_COMM_SELF,&solver);
 76:   KSPSetType(solver,KSPPREONLY);
 77:   KSPGetPC(solver,&pc);
 78:   PCSetType(pc,PCLU);
 79:   KSPSetOperators(solver,A,A,DIFFERENT_NONZERO_PATTERN);
 80:   KSPSolve(solver,X,Y);
 81:   KSPSetOperators(solver,B,B,DIFFERENT_NONZERO_PATTERN);
 82:   KSPSolve(solver,X,Z);
 83:   VecAXPY(Z,-1.0,Y);
 84:   VecNorm(Z,NORM_2,&nrm);
 85:   printf("Test1; error norm=%e\n",nrm);

 87:   /* Free spaces */
 88:   PetscFree(b);
 89:   PetscFree(x);
 90:   PetscFree(y);
 91:   PetscFree(z);
 92:   VecDestroy(&X);
 93:   VecDestroy(&Y);
 94:   VecDestroy(&Z);
 95:   MatDestroy(&A);
 96:   MatDestroy(&B);
 97:   KSPDestroy(&solver);

 99:   PetscFinalize();
100:   return 0;
101: }