On Mon, Oct 15, 2018 at 12:03 PM Yingjie Wu <yjw...@gmail.com> wrote:
> Thanks,Matt > > I'm sorry I didn't describe the problem clearly. > I'm still wondering how, although VecLoad supports parallel vector > reading, how can I guarantee that the local vector on the processor > corresponds to the DM's IS? > For example, when in FormInitialGuess, I want to make sure that the array > VecGetArray() obtained by the local vector(Vectors read from binary files) > and the array DMGlobalToLocal () DMVecGetArray () obtained by the DM > belong to the same processor, so that some errors in the mpi can be avoided. > I think I understand your question. If you give in a Vec in natural ordering, you can use VecLoad with a Vec you get from DMCreateGlobalVector(), and it will automatically reorder it into the right parallel ordering. Thanks, Matt > Thanks, > Yingjie > > Matthew Knepley <knep...@gmail.com> 于2018年10月15日周一 下午11:32写道: > >> On Mon, Oct 15, 2018 at 11:13 AM Yingjie Wu <yjw...@gmail.com> wrote: >> >>> Thank you very much, Matt. >>> >>> My problem is actually a two-dimensional problem, and the matrix in my >>> binary file is actually a two-dimensional array, each point corresponding >>> to a value on the two-dimensional grid. >>> >> >> These are still vectors. Vec store fields, which gives values to points >> on your grid. Matrices map between states, so between vectors. >> >> >>> Your suggestion is very useful to me. I can try to convert the matrix >>> binary file into a vector binary file to give program an initial value. So >>> what I should do is: >>> 1. establish parallel vectors. >>> 2. reads data from binary files to vectors. (VecLoad()) >>> 3. use VecGetArray() in FormInitialGuess() to use vector elements to >>> give the initial values of the field variables. >>> I know DM can support parallel computing (domain decomposition). How can >>> I ensure that the part of the vector built on each processor corresponds to >>> the index of DM object? (Cause my field variables are established by >>> DMDACreate2d, and I want to assign initial values to field variables using >>> read vectors ) >>> >> >> Yes. Many times you will want to VecLoad, then DMGlobalToLocal() to get >> ghosted vectors, then DMVecGetArray() to get ghosted arrays. >> >> Matt >> >> >>> >>> Thanks, >>> Yingjie >>> >>> Matthew Knepley <knep...@gmail.com> 于2018年10月15日周一 下午10:52写道: >>> >>>> On Mon, Oct 15, 2018 at 10:42 AM Yingjie Wu <yjw...@gmail.com> wrote: >>>> >>>>> Dear Petsc developer: >>>>> Hi, >>>>> Thank you very much for your previous reply. >>>>> I recently wanted to modify my program to parallel version, and >>>>> encountered some problems in modifying it. >>>>> 1. There are functions (read matrix) in the program that reads >>>>> files,will they affect my parallelism? >>>>> >>>> >>>> No, MatLoad works in parallel. This will work unchanged if you want the >>>> default layout. If you want a special partition, >>>> you must call MatSetSizes() after MatCreate(). >>>> >>>> >>>>> The codes are as follows: >>>>> >>>>> ierr = PetscViewerBinaryOpen (PETSC_COMM_WORLD, file, FILE_MODE_READ, >>>>> &viewer); CHKERRQ (ierr); >>>>> ierr = MatCreate (PETSC_COMM_WORLD, &A1); CHKERRQ (ierr); >>>>> ierr = MatSetFromOptions (A1); CHKERRQ (ierr); >>>>> ierr = MatCreate (PETSC_COMM_WORLD, &A2); CHKERRQ (ierr); >>>>> ierr = MatSetFromOptions (A2); CHKERRQ (ierr); >>>>> ierr = MatLoad (A1, viewer); CHKERRQ (ierr); >>>>> ierr = MatLoad (A2, viewer); CHKERRQ (ierr); >>>>> ierr = PetscViewerDestroy (&viewer); CHKERRQ (ierr); >>>>> >>>>> I read two matrix information from a binary file and wanted to use it >>>>> on each processor (in fact, my goal was to use these two matrices to give >>>>> initial values to the two field variables). The program can run in serial >>>>> time. Now I want to change it to parallel program. What do I need to >>>>> modify? >>>>> 2. Following the last question, I used the following code in giving >>>>> initial value procedure FormInitialGuess(): >>>>> >>>>> ierr = MatSeqAIJGetArray (A1, &initial_phi1); CHKERRQ (ierr); >>>>> >>>>> ierr = MatSeqAIJGetArray (A2, &initial_phi2); CHKERRQ (ierr); >>>>> >>>>> >>>>> I found this function on manualpages, and I felt that it could fulfill >>>>> my need to represent the elements of the matrix in arrays to give field >>>>> variables an initial value in each grid. The matrix A1 and A2 above are >>>>> actually the matrix information that was read from the file before. Now I >>>>> want to modify it as a parallel program. How do I use matrix information >>>>> to >>>>> give initial values in parallel? (In program, field variables are >>>>> implemented through DM because parallel computing and Ghost Value are >>>>> supported) >>>>> >>>> >>>> I do not understand the use of matrices to initialize field values. >>>> Usually field values are stored on Vec objects, and this is >>>> the philosophy of DM objects. >>>> >>>> Thanks, >>>> >>>> Matt >>>> >>>> >>>>> Thanks, >>>>> Yingjie >>>>> >>>> >>>> >>>> -- >>>> 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 >>>> >>>> https://www.cse.buffalo.edu/~knepley/ >>>> <http://www.cse.buffalo.edu/~knepley/> >>>> >>> >> >> -- >> 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 >> >> https://www.cse.buffalo.edu/~knepley/ >> <http://www.cse.buffalo.edu/~knepley/> >> > -- 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 https://www.cse.buffalo.edu/~knepley/ <http://www.cse.buffalo.edu/~knepley/>