Actual source code: ex32.c
1: /*$Id: ex32.c,v 1.30 2001/09/11 16:32:50 bsmith Exp $*/
3: static char help[] = "Reads in a matrix and vector in ASCII slap format. Writes\n\
4: them using the PETSc sparse format. Input parameters are:\n\
5: -fin <filename> : input file\n\
6: -fout <filename> : output file\n\n";
8: #include petscmat.h
12: int main(int argc,char **args)
13: {
14: Mat A;
15: Vec b;
16: char filein[128],fileout[128];
17: int i,j,m,n,nnz,ierr,rank,size,start,end,*col,*row,*brow,length;
18: PetscScalar *val,*bval;
19: FILE* file;
20: PetscViewer view;
21: PetscTruth opt;
23: PetscInitialize(&argc,&args,(char *)0,help);
25: /* Read in matrix and RHS */
26: PetscOptionsGetString(PETSC_NULL,"-fin",filein,127,&opt);
27: if (opt == PETSC_FALSE) {
28: SETERRQ(PETSC_ERR_ARG_WRONG, "No filename was specified for this test");
29: }
30: MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
31: MPI_Comm_size(PETSC_COMM_WORLD,&size);
33: PetscFOpen(PETSC_COMM_SELF,filein,"r",&file);
35: fscanf(file," NUNKNS =%d NCOEFF =%d\n",&n,&nnz);
36: fscanf(file," JA POINTER IN SLAPSV\n");
38: MatCreateSeqAIJ(PETSC_COMM_WORLD,n,n,20,0,&A);
39: VecCreate(PETSC_COMM_WORLD,&b);
40: VecSetSizes(b,PETSC_DECIDE,n);
41: VecSetFromOptions(b);
43: PetscMalloc((n+1)*sizeof(int),&col);
44: for (i=0; i<n+1; i++)
45: fscanf(file," I=%d%d\n",&j,&col[i]);
46: fscanf(file," EOD JA\n");
48: PetscMalloc(nnz*sizeof(PetscScalar),&val);
49: PetscMalloc(nnz*sizeof(int),&row);
50: fscanf(file," COEFFICIENT MATRIX IN SLAPSV: I, IA, A\n");
51: for (i=0; i<nnz; i++) {
52: fscanf(file," %d%d%le\n",&j,&row[i],&val[i]);
53: row[i]--;
54: }
55: fscanf(file," EOD IA\n");
57: PetscMalloc(n*sizeof(PetscScalar),&bval);
58: PetscMalloc(n*sizeof(int),&brow);
59: fscanf(file," RESIDUAL IN SLAPSV ;IRHS=%d\n",&j);
60: for (i=0; i<n; i++) {
61: fscanf(file," %d%le%d\n",&j,bval+i,&j);
62: brow[i] = i;
63: }
64: fscanf(file," EOD RESIDUAL");
65: fclose(file);
67: m = n/size+1;
68: start = rank*m;
69: end = (rank+1)*m; if (end > n) end = n;
70: for (j=start; j<end; j++) {
71: length = col[j+1]-col[j];
72: MatSetValues(A,length,&row[col[j]-1],1,&j,&val[col[j]-1],INSERT_VALUES);
73: }
74: MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);
75: MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);
77: VecGetOwnershipRange(b,&start,&end);
78: VecSetValues(b,end-start,brow+start,bval+start,INSERT_VALUES);
79: VecAssemblyBegin(b);
80: VecAssemblyEnd(b);
82: PetscFree(col);
83: PetscFree(val);
84: PetscFree(row);
85: PetscFree(bval);
86: PetscFree(brow);
88: PetscPrintf(PETSC_COMM_SELF,"Reading matrix completes.\n");
89: PetscOptionsGetString(PETSC_NULL,"-fout",fileout,127,PETSC_NULL);
90: PetscViewerBinaryOpen(PETSC_COMM_WORLD,fileout,PETSC_BINARY_CREATE,&view);
91: MatView(A,view);
92: VecView(b,view);
93: PetscViewerDestroy(view);
95: VecDestroy(b);
96: MatDestroy(A);
98: PetscFinalize();
99: return 0;
100: }