Actual source code: ex32.c

  1: /*$Id: ex32.c,v 1.27 2001/04/10 19:35:44 bsmith Exp $*/

  3: static char help[] = "Reads in a matrix and vector in ASCII slap format. Writesn
  4: them using the PETSc sparse format. Input parameters are:n
  5:   -fin <filename> : input filen
  6:   -fout <filename> : output filenn";

  8: #include "petscmat.h"

 10: int main(int argc,char **args)
 11: {
 12:   Mat         A;
 13:   Vec         b;
 14:   char        filein[128],fileout[128];
 15:   int         i,j,m,n,nnz,ierr,rank,size,start,end,*col,*row,*brow,length;
 16:   Scalar      *val,*bval;
 17:   FILE*       file;
 18:   PetscViewer view;

 20:   PetscInitialize(&argc,&args,(char *)0,help);

 22:   /* Read in matrix and RHS */
 23:   PetscOptionsGetString(PETSC_NULL,"-fin",filein,127,PETSC_NULL);
 24:   MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
 25:   MPI_Comm_size(PETSC_COMM_WORLD,&size);

 27:   PetscFOpen(PETSC_COMM_SELF,filein,"r",&file);

 29:   fscanf(file,"  NUNKNS =%d  NCOEFF =%dn",&n,&nnz);
 30:   fscanf(file,"  JA POINTER IN SLAPSVn");

 32:   MatCreateSeqAIJ(PETSC_COMM_WORLD,n,n,20,0,&A);
 33:   VecCreateMPI(PETSC_COMM_WORLD,PETSC_DECIDE,n,&b);

 35:   PetscMalloc((n+1)*sizeof(int),&col);
 36:   for (i=0; i<n+1; i++)
 37:     fscanf(file,"     I=%d%dn",&j,&col[i]);
 38:   fscanf(file,"  EOD JAn");

 40:   PetscMalloc(nnz*sizeof(Scalar),&val);
 41:   PetscMalloc(nnz*sizeof(int),&row);
 42:   fscanf(file,"  COEFFICIENT MATRIX IN SLAPSV: I, IA, An");
 43:   for (i=0; i<nnz; i++) {
 44:     fscanf(file,"    %d%d%len",&j,&row[i],&val[i]);
 45:     row[i]--;
 46:   }
 47:   fscanf(file,"  EOD IAn");

 49:   PetscMalloc(n*sizeof(Scalar),&bval);
 50:   PetscMalloc(n*sizeof(int),&brow);
 51:   fscanf(file,"  RESIDUAL IN SLAPSV ;IRHS=%dn",&j);
 52:   for (i=0; i<n; i++) {
 53:     fscanf(file,"      %d%le%dn",&j,bval+i,&j);
 54:     brow[i] = i;
 55:   }
 56:   fscanf(file,"  EOD RESIDUAL");
 57:   fclose(file);

 59:   m = n/size+1;
 60:   start = rank*m;
 61:   end = (rank+1)*m; if (end > n) end = n;
 62:   for (j=start; j<end; j++) {
 63:     length = col[j+1]-col[j];
 64:     MatSetValues(A,length,&row[col[j]-1],1,&j,&val[col[j]-1],INSERT_VALUES);
 65:   }
 66:   MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);
 67:   MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);

 69:   VecGetOwnershipRange(b,&start,&end);
 70:   VecSetValues(b,end-start,brow+start,bval+start,INSERT_VALUES);
 71:   VecAssemblyBegin(b);
 72:   VecAssemblyEnd(b);

 74:   PetscFree(col);
 75:   PetscFree(val);
 76:   PetscFree(row);
 77:   PetscFree(bval);
 78:   PetscFree(brow);

 80:   PetscPrintf(PETSC_COMM_SELF,"Reading matrix completes.n");
 81:   PetscOptionsGetString(PETSC_NULL,"-fout",fileout,127,PETSC_NULL);
 82:   PetscViewerBinaryOpen(PETSC_COMM_WORLD,fileout,PETSC_BINARY_CREATE,&view);
 83:   MatView(A,view);
 84:   VecView(b,view);
 85:   PetscViewerDestroy(view);

 87:   VecDestroy(b);
 88:   MatDestroy(A);

 90:   PetscFinalize();
 91:   return 0;
 92: }