[petsc-users] DMDACoor3d and VecView

Jed Brown jedbrown at mcs.anl.gov
Thu May 23 11:31:59 CDT 2013


Roc Wang <pengxwang at hotmail.com> writes:

>> From: jedbrown at mcs.anl.gov
>> To: pengxwang at hotmail.com; petsc-users at mcs.anl.gov
>> Subject: Re: [petsc-users] DMDACoor3d and VecView
>> Date: Thu, 23 May 2013 10:10:19 -0500
>> 
>> Roc Wang <pengxwang at hotmail.com> writes:
>> 
>> > The coordinates of nodes are needed to plot the 3-D distributions of
>> > the solution. The matrix and the vector are managed with DMDA, so the
>> > array for the coordinates can be obtained by
>> > DMDAGetCoordinateDA(da,&cda) and DMDAVecGetArray(cda,gc,&coors).
>> > Here, coors is defined as DMDACoor3d ***coors.  Since the function
>> > VecVeiw can only output one vector, Vec sol, to a binary file , the
>> > array of coordinates must be output to another file and thus must be
>> > read separately. 
>> 
>> Not true, just read them in the same order you wrote them.
>
> Does this mean I can save the vectors in the same binary file? If yes, whether the following procedure is correct?
> /* writing vectors in solver program */
>    DM             cda;
>    Vec            gc;
>    ierr = DMDAGetCoordinateDA(da,&cda);CHKERRQ(ierr); 
>    ierr = DMDAGetCoordinates(cda, &gc);CHKERRQ(ierr);
>
>
>   ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,"vector.bin",FILE_MODE_WRITE,&viewer);CHKERRQ(ierr);
>   ierr = VecView(sol,viewer);CHKERRQ(ierr);  //write solution vector
>   ierr = VecView(gc,viewer);CHKERRQ(ierr);   //write coordinate vector
>   ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);  
>
> /* reading vectors in a stand-along program */
>   ierr = VecCreate(PETSC_COMM_WORLD,&sol);CHKERRQ(ierr);
>   ierr = VecCreate(PETSC_COMM_WORLD,&gc);CHKERRQ(ierr);

Create your DM and coordinate DM, then

  DMCreateGlobalVector(da,&sol);
  DMCreateGlobalVector(cda,&gc);

then below

>   ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,"vector.bin",FILE_MODE_READ,&viewer);CHKERRQ(ierr);
>   ierr = VecLoad(sol,viewer);CHKERRQ(ierr); //read solution vector
>   ierr = VecLoad(gc,viewer);CHKERRQ(ierr);  //read coordinate vector
>   ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);  

Alternatively, write the DM too so that you can load it instead of
making it from out-of-band knowledge of sizes:

  ierr = DMView(da,viewer);CHKERRQ(ierr);
  ierr = VecView(global,viewer);CHKERRQ(ierr);
  ierr = DMView(cda,viewer);CHKERRQ(ierr);
  ierr = VecView(gc,viewer);CHKERRQ(ierr);

and read with

  ierr = DMLoad(da,bviewer);CHKERRQ(ierr);
  ierr = DMCreateGlobalVector(da,&sol);CHKERRQ(ierr);
  ierr = VecLoad(sol,viewer);CHKERRQ(ierr);
  ierr = DMLoad(cda,viewer);CHKERRQ(ierr);
  ierr = DMCreateGlobalVector(cda,&gc);CHKERRQ(ierr);
  ierr = VecLoad(gc,viewer);CHKERRQ(ierr);

See src/dm/examples/tests/ex14.c and ex13.c.

>> > The problem is that the array of coordinates is local array and the
>> > number of processes in the post-processing program must be same as
>> > that in the solver. 
>> 
>> DMGetCoordinates() returns a global Vec.  Store that, not the local Vec.
>> 
>> From the names, you must have an older version of PETSc.  Please upgrade
>> to petsc-3.4.
>  		 	   		  


More information about the petsc-users mailing list