Thanks, I will write the stand alone code for it. One more question about the 
global and local vector below.

> Subject: Re: [petsc-users] local Vec to global Vec and global 3-D array
> From: bsmith at mcs.anl.gov
> Date: Wed, 15 May 2013 14:09:42 -0500
> To: pengxwang at hotmail.com; petsc-users at mcs.anl.gov
> 
> 
> On May 15, 2013, at 12:41 PM, Roc Wang <pengxwang at hotmail.com> wrote:
> 
> > Thanks, please take a look my further questions. 
> > 
> > > Subject: Re: [petsc-users] local Vec to global Vec and global 3-D array
> > > From: bsmith at mcs.anl.gov
> > > Date: Wed, 15 May 2013 11:40:03 -0500
> > > CC: petsc-users at mcs.anl.gov
> > > To: pengxwang at hotmail.com
> > > 
> > > 
> > > On May 15, 2013, at 10:19 AM, Roc Wang <pengxwang at hotmail.com> wrote:
> > > 
> > > > Hello, 
> > > > 
> > > > 1. I am trying to save the solution of a PDE for a 3-D geometry domain. 
> > > > I used DM to manage the matrix and vector.
> > > > The solution vector was converted to local 3D arrays on each process 
> > > > successfully. But there was errors when the functions 
> > > > DMLocalToGlobalBegin() and DMLocalToGlobalEnd() were called.
> > > > 
> > > > I built the code by following the example in 
> > > > /petsc-3.3-p6/src/dm/examples/tutorials/ex3.c. The codes for this are 
> > > > as followings :
> > > > 
> > > > /*Get the solution vec */
> > > > ierr = KSPSolve(ksp,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
> > > > ierr = KSPGetSolution(ksp,&x);CHKERRQ(ierr);
> > > > 
> > > > /* local 3d arrays */ 
> > > > ierr = DMDAVecGetArray(da, x, &localArray3d ); CHKERRQ(ierr);
> > > > 
> > > > /* global 3d array */ 
> > > > ierr = DMCreateGlobalVector(da,&gsol3d);CHKERRQ(ierr);
> > > > ierr = DMLocalToGlobalBegin(da,x,INSERT_VALUES,gsol3d);CHKERRQ(ierr);
> > > > ierr = DMLocalToGlobalEnd(da,x,INSERT_VALUES,gsol3d);CHKERRQ(ierr);
> > > 
> > > The x here must not have been obtained from this da. You need to have 
> > > obtained the x somewhere before with DMCreateLocalVector(da,&x) or with a 
> > > VecDuplicate from such a vector. Likely the vector put into the KSP is 
> > > not from this da.
> > 
> > !***************************************
> >   The procedure of creating x is like this:
> >   
> >   call KSPCreate() to build ksp;
> >   call DMDACreate3d() to build da;
> >   ierr = KSPSetDM(ksp,da); // associate da with ksp;
> >   
> >   Then after ksp was solved:
> >   
> >   ierr = KSPSolve(ksp,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
> >   ierr = KSPGetSolution(ksp,&x);CHKERRQ(ierr);
> >   ierr = DMDAVecGetArray(da, x, &localArray3d ); CHKERRQ(ierr);
> > 
> >  Here, da was associated with the ksp by calling ierr = KSPSetDM(ksp,da).
> >  The x here was obtained by calling the KSPGetSolution(ksp,&x), before this 
> > I didn't call DMCreateLocalVector(da,&x).  It seems Vec x is associated 
> > with da since there is no errors when DMDAVecGetArray(da, x, &localArray3d 
> > ) was called.  
> 
>    The x from KSPGetSolution() IS a global vector, it is not a global vector. 
> You cannot do a local to global from the x global vector.

!*******************************
The x from KSPGetSolution() IS a global vector, it is not a "local" vector? (It 
should be a typo :) )
 So Can I convert the global x to a 3d array directly? Thank. 

> 
> > Do you mean I should call DMCreateLocalVector(da,&x) explicitly before ierr 
> > = KSPGetSolution(ksp,&x)?
> > !***************************************
> > 
> > > > 
> > > > 
> > > > 2. I am trying to visualize the solution in a 3-D domain by using some 
> > > > software such as Tecplot. To my understand, I need to output the 
> > > > solution in the format of 3-D array. The vectors of KSP solution in 
> > > > PETSc are local vectors on each process. So they have to be assembled 
> > > > to a global vector and then converted to a 3-D global array. I am not 
> > > > sure if my approach is a good way and if there is some functions in 
> > > > PETSc to output the global solutions directly?
> > > 
> > > Yes. VecView() on DMDA vectors automatically reorders the entries on the 
> > > file to use the natural ordering. There are variety of possible viewers 
> > > you can use including binary, ASCII (no good for anything but tiny 
> > > problems), VTK, HDF5 
> > 
> > !***************************************
> >  VecView only outputs the vector itself. How to output the indexes of nodes 
> > in 3 dimemsions (i,j,k) for each element of the vector, such as:
> >  
> >  i   j  k  x
> >  0 0 0  1.0
> >  0 0 1  2.0
> >  ...
> >  m n p  10.0
> > !***************************************
> 
>    If you want some ASCII format like that, then write a STAND ALONE 
> sequential program that reads from the binary file with VecLoad() and then 
> outputs the format you want. Never Never ever try to do a parallel output of 
> data in this kind of format, it will be slow and hard to write and there is 
> no reason to write it.
> 
>    Barry
> 
> > > 
> > > Barry
> > > 
> > > > 
> > > > Part of the error information when DMLocalToGlobalBegin() and 
> > > > DMLocalToGlobalEnd() were called 
> > > > 
> > > > [0]PETSC ERROR: [1]PETSC ERROR: [2]PETSC ERROR: --------------------- 
> > > > Error Message ------------------------------------
> > > > [3]PETSC ERROR: --------------------- Error Message 
> > > > ------------------------------------
> > > > [2]PETSC ERROR: [3]PETSC ERROR: --------------------- Error Message 
> > > > ------------------------------------
> > > > Nonconforming object sizes!
> > > > Nonconforming object sizes!
> > > > [2]PETSC ERROR: [3]PETSC ERROR: Vector wrong size 30 for scatter 60 
> > > > (scatter forward and vector from != ctx from size)!
> > > > Vector wrong size 20 for scatter 45 (scatter forward and vector from != 
> > > > ctx from size)!
> > >
> 
                                          
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20130515/c4cf7f89/attachment.html>

Reply via email to