Roc Wang <[email protected]> writes: >> From: [email protected] >> To: [email protected]; [email protected] >> Subject: Re: [petsc-users] DMDACoor3d and VecView >> Date: Thu, 23 May 2013 10:10:19 -0500 >> >> Roc Wang <[email protected]> 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. >
