[petsc-users] Storing a matrix in PETSc binary form?

John Chludzinski jchludzinski at gmail.com
Wed Jul 13 02:40:57 CDT 2011


$ ls -l
-rw-r--r-- 1 John None 192208072 Jul 13 03:31 binaryoutput
-rw-r--r-- 1 John None 0 Jul 13 03:31 binaryoutput.info
-rw-r--r-- 1 John None 128128032 Jul 13 01:43 DOF4002_k_double.bin
-rw-r--r-- 1 John None 128128032 Jul 13 01:43 DOF4002_m_double.bin

where DOF4002_k_double.bin and DOF4002_m_double.bin are the file to be
converted.

What is binaryoutput.info (size=0)?
And why is binaryoutput so much fatter than either DOF4002_k_double.bin or
DOF4002_m_double.bin?

---John

On Wed, Jul 13, 2011 at 3:24 AM, John Chludzinski <jchludzinski at gmail.com>wrote:

> Is this what you had in mind (more or less)?  ---John
>
>
> //-----------------------------------CONVERTER---------------------------------------------------------------------------------------------------------
>
> static char help[] = "Reads matrix: \n -f <input_file> : file to load
> \n\n";
>
> #define SIZE 4002
>
> #include <stdio.h>
> #include <stdlib.h>
> #include "petscmat.h"
>
> int main(int argc,char **args)
> {
>      Mat A;
>      char file[PETSC_MAX_PATH_LEN];
>      PetscErrorCode ierr;
>      PetscScalar *a;
>      PetscTruth flg;
>      PetscInt n=SIZE;
>      int i, j;
>
>      PetscInitialize(&argc,&args,(char *)0,help);
>
>      ierr =
> PetscOptionsGetString(PETSC_NULL,"-f",file,PETSC_MAX_PATH_LEN-1,&flg);CHKERRQ(ierr);
>      if (!flg) SETERRQ(1,"Must indicate binary file with the -f option");
>
>      ierr = PetscMalloc(SIZE*SIZE*sizeof(PetscScalar),&a);CHKERRQ(ierr);
>
>      FILE *fpK;
>
>      double *K = (double *)calloc( sizeof(double), SIZE*SIZE );
>
>      if((fpK = fopen(file, "rb")) == NULL)
>      {
>         printf("Cannot open joe_DOF4002_k_double.bin\n");
>         exit(1);
>      }
>
>     fprintf(stderr, "Doubles read for K = %d\n", fread( (void *)K,
> sizeof(double), SIZE*SIZE, fpK ));
>
>     for ( i = 0; i < SIZE; i++ )
>         for ( j = i; j < SIZE; j++ ) a[i+j*SIZE]= *(K+i*SIZE+j);
>
>     MatCreateSeqDense(PETSC_COMM_SELF, n, n, a, &A);
>
>     MatView(A,PETSC_VIEWER_BINARY_(PETSC_COMM_WORLD));
>
>     ierr = PetscFinalize();CHKERRQ(ierr);
>     return 0;
> }
>
>
>
> On Wed, Jul 13, 2011 at 1:02 AM, Barry Smith <bsmith at mcs.anl.gov> wrote:
>
>>
>>   If it is truly a dense matrix then it isn't clear that you want to store
>> it as a PETSc binary matrix but you can using the following code
>>
>>   PetscInt   n;
>>   PetscScalar *values;
>>
>>   allocate values the correct size; read the entries into values then call
>> MatCreateSeqDense(PETSC_COMM_SELF,n,n,values,&A); the call
>> MatView(A,PETSC_VIEWER_BINARY_(PETSC_COMM_WORLD));
>>
>>   Barry
>>
>> On Jul 12, 2011, at 11:41 PM, John Chludzinski wrote:
>>
>> > I have a matrix stored as a sequential list of binary values (not PETSc
>> binary form) that I read in with a single block read:
>> >
>> >    read( (void *)K, sizeof(double), SIZE*SIZE, fpK ).
>> >
>> > How do I convert this simple binary file of (sequentially stored)
>> doubles into a "PETSc binary matrix file"?
>> >
>> > ---John
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20110713/5894f59c/attachment-0001.htm>


More information about the petsc-users mailing list