Actual source code: ex30.c
petsc-3.4.2 2013-07-02

      1: static char help[] = " * Example code testing SeqDense matrices with an LDA (leading dimension of the user-allocated arrray) larger than M.\n";

      3: #include <petscksp.h>

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

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

     31:   MatDenseGetArray(A,&a);
     32:   for (i=0; i<size; i++) {
     33:     for (j=0; j<size; j++) {
     34:       a[i+j*size] = b[i+j*lda];
     35:     }
     36:   }
     37:   MatDenseRestoreArray(A,&a);
     38:   MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);
     39:   MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);

     41:   MatCreate(MPI_COMM_SELF,&B);
     42:   MatSetSizes(B,size,size,size,size);
     43:   MatSetType(B,MATSEQDENSE);
     44:   MatSeqDenseSetPreallocation(B,b);
     45:   MatSeqDenseSetLDA(B,lda);
     46:   MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);
     47:   MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);

     49:   PetscMalloc(size*sizeof(PetscScalar),&x);
     50:   for (i=0; i<size; i++) x[i] = 1.0;
     51:   VecCreateSeqWithArray(MPI_COMM_SELF,1,size,x,&X);
     52:   VecAssemblyBegin(X);
     53:   VecAssemblyEnd(X);

     55:   PetscMalloc(size*sizeof(PetscScalar),&y);
     56:   VecCreateSeqWithArray(MPI_COMM_SELF,1,size,y,&Y);
     57:   VecAssemblyBegin(Y);
     58:   VecAssemblyEnd(Y);

     60:   PetscMalloc(size*sizeof(PetscScalar),&z);
     61:   VecCreateSeqWithArray(MPI_COMM_SELF,1,size,z,&Z);
     62:   VecAssemblyBegin(Z);
     63:   VecAssemblyEnd(Z);

     65:   /*
     66:    * Solve with A and B
     67:    */
     68:   KSPCreate(MPI_COMM_SELF,&solver);
     69:   KSPSetType(solver,KSPPREONLY);
     70:   KSPGetPC(solver,&pc);
     71:   PCSetType(pc,PCLU);
     72:   KSPSetOperators(solver,A,A,DIFFERENT_NONZERO_PATTERN);
     73:   KSPSolve(solver,X,Y);
     74:   KSPSetOperators(solver,B,B,DIFFERENT_NONZERO_PATTERN);
     75:   KSPSolve(solver,X,Z);
     76:   VecAXPY(Z,-1.0,Y);
     77:   VecNorm(Z,NORM_2,&nrm);
     78:   printf("Test1; error norm=%e\n",nrm);

     80:   /* Free spaces */
     81:   PetscFree(b);
     82:   PetscFree(x);
     83:   PetscFree(y);
     84:   PetscFree(z);
     85:   VecDestroy(&X);
     86:   VecDestroy(&Y);
     87:   VecDestroy(&Z);
     88:   MatDestroy(&A);
     89:   MatDestroy(&B);
     90:   KSPDestroy(&solver);

     92:   PetscFinalize();
     93:   return 0;
     94: }