Thank you very much.

> El 05/04/2011, a las 05:07, Gong Ding escribi?:
> 
> 
> 
> > Hi,
> 
> > I use slepc eigen value solver to evaluate the eigen values of jacobian 
> > matrix on each nonlinear iteration.
> 
> > 
> 
> > First, I create the EPS structure and set the operator to jacobian matrix. 
> > And then call the EPSSolve in the SNES build 
> 
> > jacobian matrix functuion. This method create EPS once, call EPSSolve many 
> > times. However, it seems EPSSolve only work at
> 
> > first time, and result eigen value never changes (however, relative error 
> > becomes larger and larger) in the following solve procedure. 
> 
> > 
> 
> > Then I create EPS each time in the SNES build jacobian matrix functuion, do 
> > EPSSolve and delete EPS at the end of function.
> 
> > This method gives eigen value for the jacobian matrix with small relative 
> > error ~1e-8. Of course, create and destroy the EPS solver each time
> 
> > is not efficient.
> 
> > 
> 
> > Does something get wrong in the first method? 
> 
> 
> 
> You will always solve the same eigenproblem, unless you call EPSSetOperators 
> every time the matrix changes.
> 
> When EPSSetOperators is called, the EPS object is reset and therefore 
> EPSSetUp will be called in the next EPSSolve. So basically the first approach 
> will have the same cost as the second approach.
> 
> 
> 
> By the way, you are not using STSINVERT correctly. You should set 
> EPS_TARGET_MAGNITUDE (instead of EPS_SMALLEST_MAGNITUDE) together with 
> target=0.0 with EPSSetTarget.
> 
> 
> 
> Jose
> 
> 
> 
> > 
> 
> > The code I used is attached here
> 
> > 
> 
> >  // create the EPS solver for smallest and largest eigen value
> 
> >  EPS            eps_s;
> 
> >  EPS            eps_l;
> 
> > 
> 
> >  FVM_NonlinearSolver & nonlinear_solver = dynamic_cast<FVM_NonlinearSolver 
> > &>(_solver);
> 
> >  Mat & J = nonlinear_solver.jacobian_matrix();
> 
> > 
> 
> >  // create eigen value problem solver
> 
> >  EPSCreate(PETSC_COMM_WORLD, &eps_s);
> 
> >  EPSCreate(PETSC_COMM_WORLD, &eps_l);
> 
> >  // Set operator
> 
> >  EPSSetOperators(eps_s, J, PETSC_NULL);
> 
> >  EPSSetOperators(eps_l, J, PETSC_NULL);
> 
> > 
> 
> >  // calculate smallest and largest eigen value
> 
> >  EPSSetWhichEigenpairs(eps_s, EPS_SMALLEST_MAGNITUDE);
> 
> >  EPSSetWhichEigenpairs(eps_l, EPS_LARGEST_MAGNITUDE);
> 
> > 
> 
> >  // shift-and-invert spectral transformation to enhance convergence of 
> > eigenvalues near zero
> 
> >  ST st_s;
> 
> >  EPSGetST(eps_s, &st_s);
> 
> >  STSetType(st_s, STSINVERT);
> 
> > 
> 
> > 
> 
> >  // Set solver parameters at runtime
> 
> >  EPSSetFromOptions(eps_s);
> 
> >  EPSSetFromOptions(eps_l);
> 
> > 
> 
> > 
> 
> > ///////////////////////////////////////////////////////////////////////////////
> 
> > 
> 
> >  // this part is called after jacobian matrix assemly
> 
> > 
> 
> >  PetscScalar kr_s, ki_s;
> 
> >  PetscScalar kr_l, ki_l;
> 
> >  PetscReal error_s;
> 
> >  PetscReal error_l;
> 
> >  PetscInt nconv_s;
> 
> >  PetscInt nconv_l;
> 
> > 
> 
> >  // get the smallest eigen value
> 
> >  EPSSolve( eps_s );
> 
> >  EPSGetConverged( eps_s, &nconv_s );
> 
> >  if( nconv_s > 0 )
> 
> >  {
> 
> >    EPSGetEigenvalue( eps_s, 0, &kr_s, &ki_s );
> 
> >    EPSComputeRelativeError( eps_s, 0, &error_s );
> 
> >  }
> 
> > 
> 
> >  // get the largest eigen value
> 
> >  EPSSolve( eps_l );
> 
> >  EPSGetConverged( eps_l, &nconv_l );
> 
> >  if( nconv_l > 0 )
> 
> >  {
> 
> >    EPSGetEigenvalue( eps_l, 0, &kr_l, &ki_l );
> 
> >    EPSComputeRelativeError( eps_l, 0, &error_l );
> 
> >  }
> 
> > 
> 
> > 
> 
> 
> 
>

Reply via email to