El 08/08/2011, a las 09:14, Shitij Bhargava escribi?:

> Thank you Jed. That was indeed the problem. I installed a separate MPI for 
> PETSc/SLEPc, but was running my program with a default, already installed one.
> 
> Now, I have a different question. What I want to do is this:
> 
> 1. Only 1 process, say root, calculates the matrix in SeqAIJ format
> 2. Then root creates the EPS context, eps and initializes,sets parameters, 
> problem type,etc. properly
> 3. After this the root process broadcasts this eps object to other processes
> 4. I use EPSSolve to solve for eigenvalues (all process together in 
> cooperation resulting in memory distribution)
> 5. I get the results from root
> 
> is this possible ? I am not able to broadcast the EPS object, because it is 
> not an MPI_DataType. Is there any PETSc/SLEPc function for this ? I am 
> avoiding using MPIAIJ because that will mean making many changes in the 
> existing code, including the numerous write(*,*) statements (i would have to 
> convert them to PetscPrint in FORTRAN or something like that). 
> So I want a single process to handle matrix generation and assembly, but want 
> to solve the eigenproblem in parallel by different processes. Running the 
> subroutine EPSSolve in parallel and hence distribute memory is the only 
> reason why I want to use MPI.
> 
> Thanks a lot !!
> 
> Shitij

No, you cannot use a solver in parallel with a matrix in SeqAIJ format. The 
matrix must be MPIAIJ.

If you want to generate the matrix only in process 0, you can do 
MPI_Comm_rank(PETSC_COMM_WORLD,&rank) and then enclose the matrix generation 
(setvalues only) in an if clause:

if (!rank) {
    ierr = MatSetValues(A,...);CHKERRQ(ierr);
}
ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);

However, it is better to do the matrix generation in parallel also.

Jose

Reply via email to