[petsc-users] petscviewerbinaryread
Frederik Treue
frtr at fysik.dtu.dk
Mon Jun 17 07:47:28 CDT 2013
OK, so I got a little further: Now I can read 1D fields on any amount of
processors, and 2D fields on 1 processor :). My code:
MPI_Comm_size(PETSC_COMM_WORLD,&cs);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
ierr = VecGetArray(dummy,&dump); CHKERRQ(ierr);
ierr = VecGetArray(ReRead,&readarray); CHKERRQ(ierr);
ierr=PetscViewerBinaryOpen(PETSC_COMM_WORLD,"./testvector",FILE_MODE_READ,&fileview);CHKERRQ(ierr);
for (i=0;i<rank;i++) {
printf("Rank BEFORE: %d\n",rank);
ierr=PetscViewerBinaryRead(fileview,(void*)dump,nx*ny/cs,PETSC_SCALAR);CHKERRQ(ierr);
}
ierr=PetscViewerBinaryRead(fileview,(void*)readarray,nx*ny/cs,PETSC_SCALAR);CHKERRQ(ierr);
for (i=rank+1;i<cs;i++) {
printf("Rank: AFTER: %d\n",rank);
ierr=PetscViewerBinaryRead(fileview,(void*)dump,nx*ny/cs,PETSC_SCALAR);CHKERRQ(ierr);
}
However, this fails for 2D with more than one processor: The resulting
vector is garbled and I get memory corruption. Am I on the right track,
or is there another way to achieve an MPI version of binary read? The
above code seems somewhat cumbersome...
/Frederik Treue
On Mon, 2013-06-17 at 11:06 +0200, Matthew Knepley wrote:
> On Mon, Jun 17, 2013 at 10:59 AM, Frederik Treue <frtr at fysik.dtu.dk>
> wrote:
> Hi guys,
>
> is petscviewerbinaryread working? The examples given at the
> webpage
> either fails with out of memory error issues (ex65 and ex65dm)
> or
> doesn't compile (ex61) for me?
>
> Oddly I have problems only when trying to use mpi. My code:
>
> ierr=DMDACreate1d(PETSC_COMM_WORLD,DMDA_BOUNDARY_GHOSTED,156,1,1,PETSC_NULL,&da);CHKERRQ(ierr);
>
> ierr=DMCreateGlobalVector(da,&ReRead);CHKERRQ(ierr);
>
> ierr=VecAssemblyBegin(ReRead);CHKERRQ(ierr);
> ierr=VecAssemblyEnd(ReRead);CHKERRQ(ierr);
>
> double *workarray=(double*)malloc(156*sizeof(double));
>
> ierr = VecGetArray(ReRead,&workarray); CHKERRQ(ierr);
>
>
> 1) This does not make sense. You allocate an array, but then overwrite
> that
> array with the one inside the vector ReRead.
>
> ierr=PetscViewerBinaryOpen(PETSC_COMM_WORLD,"./testvector",FILE_MODE_READ,&fileview);CHKERRQ(ierr);
>
> ierr=PetscViewerBinaryRead(fileview,&dummy,1,PETSC_SCALAR);CHKERRQ(ierr);
>
> ierr=PetscViewerBinaryRead(fileview,(void*)workarray,156,PETSC_SCALAR);CHKERRQ(ierr);
> printf("TEST: %g\n",workarray[144]);
> ierr=VecRestoreArray(ReRead,&workarray);
>
>
> 2) In parallel, the local array in your vector ReRead will be smaller
> than the global size 156. Thus this read also
> does not makes sense.
>
>
> Matt
>
> VecView(ReRead,PETSC_VIEWER_DRAW_WORLD);
>
> This works fine as long as I'm on a single processor. The file
> read also
> works on mpi with 2 processors, as evidenced by the result of
> the printf
> statement (which gives the right result from both processors).
> However
> the VecView statement fails with "Vector not generated from a
> DMDA!".
> Why?
>
> And second question: How do I generalize to 2d? Can I give a
> 2d array to
> PetscViewerBinaryRead and expect it to work? And how should it
> be
> malloc'ed? Or does one give a 1d array to
> PetscViewerBinaryRead and let
> VecRestoreArray do the rest? Or what?
>
> /Frederik Treue
>
>
>
>
>
> --
> What most experimenters take for granted before they begin their
> experiments is infinitely more interesting than any results to which
> their experiments lead.
> -- Norbert Wiener
More information about the petsc-users
mailing list