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. 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 )
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/> >