[petsc-users] question about arbitrary eigenvector selection in SLEPC

Jose E. Roman jroman at dsic.upv.es
Thu May 29 13:51:32 CDT 2014


El 29/05/2014, a las 17:03, Giacomo Mulas escribió:

> Hi Jose, and list.
> 
> I am in the process of writing the function to use with
> EPSSetArbitrarySelection().
> 
> Inside it, I will need to take some given component (which one is included
> in the info passed via ctx) of the eigenvector and square it. To do this,
> since the eigenvector is not necessarily local, I will need to first do a
> scatter to a local 1-component vector. So this would be like:
> 
> ... some omitted machinery to cast the info from *ctx to more easily
> accessible form...
> 
>  ierr = ISCreateStride(PETXC_COMM_WORLD,1,myindex,1,&is1_from);CHKERRQ(ierr);
>  ierr = ISCreateStride(PETSC_COMM_WORLD,1,0,1,&is1_to);CHKERRQ(ierr);
>  ierr = VecCreateSeq(PETSC_COMM_SELF, 1, &localx1);CHKERRQ(ierr);
>  ierr = VecScatterCreate(xr,is1_from,localx1,is1_to,&scatter1); CHKERRQ(ierr);
>  ierr = VecScatterBegin(scatter1,xr,localx1,INSERT_VALUES,
> 			 SCATTER_FORWARD);
>  ierr = VecScatterEnd(scatter1,xr,localx1,INSERT_VALUES,
> 		       SCATTER_FORWARD);
>  ierr = VecGetArray(localx1,&comp);
>  *rr = comp*comp;
>  ierr = VecRestoreArray(localx1, &comp);
>  ierr = VecDestroy(localx1);
>  ierr = VecScatterDestroy(&scatter1);
>  ierr = ISDestroy(&is1_from);
>  ierr = ISDestroy(&is1_to);
>  *ri = 0;
> 
> ... some internal housekeeping omitted
> 
>  return 0;
> 
> The questions are:
> 
> 1) when the arbitrary function is called, is it called on all nodes
> simultaneously, so that collective functions can be expected to work
> properly, being called on all involved nodes at the same time? Should all
> processes compute the *rr and *ri to be returned, and return the same value?
> would it be more efficient to create a unit vector uv containing only one
> nonzero component, and then use VecDot(xr, uv, &comp), instead of pulling
> the component I need and squaring it as I did above?
> 

Yes, all processes must have the same values.
Use the code snippet proposed by Matt.

> 
> 2) since the stride, the 1-component vector, the scatter are presumably the same through all calls within one EPSSolve, can I take them out of the arbitrary function, and make them available to it through *ctx? For this
> to work, the structure of xr, the eigenvector passed to the arbitrary
> function, must be known outside of EPSSolve.

Yes.
Internally, all vectors are basically cloned from a template vector created with MatGetVecs(A,xr,NULL) so you can do the same outside EPSSolve() to determine local sizes.

Jose


> 
> 
> Thanks, bye
> Giacomo
> 
> -- 
> _________________________________________________________________
> 
> Giacomo Mulas <gmulas at oa-cagliari.inaf.it>
> _________________________________________________________________
> 
> INAF - Osservatorio Astronomico di Cagliari
> via della scienza 5 - 09047 Selargius (CA)
> 
> tel.   +39 070 71180244
> mob. : +39 329  6603810
> _________________________________________________________________
> 
> "When the storms are raging around you, stay right where you are"
>                         (Freddy Mercury)
> _________________________________________________________________



More information about the petsc-users mailing list