// ====================================================================== double MaxEigPowerMethod(const Operator& Op, const bool DiagonalScaling) { ML_Krylov *kdata; double MaxEigen; kdata = ML_Krylov_Create(GetML_Comm()); if (DiagonalScaling == false) kdata->ML_dont_scale_by_diag = ML_TRUE; else kdata->ML_dont_scale_by_diag = ML_FALSE; ML_Krylov_Set_PrintFreq(kdata, 0); ML_Krylov_Set_ComputeNonSymEigenvalues(kdata); ML_Krylov_Set_Amatrix(kdata, Op.GetML_Operator()); ML_Krylov_Solve(kdata, Op.GetML_Operator()->outvec_leng, NULL, NULL); MaxEigen = ML_Krylov_Get_MaxEigenvalue(kdata); ML_Krylov_Destroy(&kdata); return(MaxEigen); }
int main(int argc, char *argv[]){ ML *ml_object; int i, N_grids = 3, N_levels; double sol[129], rhs[129]; ML_Aggregate *agg_object; ML_Operator *data; ML_Krylov *kdata; #ifdef ML_MPI MPI_Init(&argc,&argv); #endif for (i = 0; i < 129; i++) sol[i] = 0.; for (i = 0; i < 129; i++) rhs[i] = 2.; ML_Create (&ml_object, N_grids); ML_Init_Amatrix (ml_object, 0, 129, 129, NULL); ML_Set_Amatrix_Getrow(ml_object, 0, Poisson_getrow, NULL, 129); ML_Set_Amatrix_Matvec(ml_object, 0, Poisson_matvec); ML_Set_PrintLevel(10); ML_Aggregate_Create(&agg_object); ML_Aggregate_Set_MaxCoarseSize(agg_object,1); N_levels = ML_Gen_MGHierarchy_UsingAggregation(ml_object, 0, ML_INCREASING, agg_object); /******** Begin code to set a Jacobi smoother ****** ML_Gen_Smoother_Jacobi(ml_object, ML_ALL_LEVELS, ML_PRESMOOTHER, 1, ML_DEFAULT); ******** End code to set a Jacobi smoother ******/ /******** Begin code to set a user-defined smoother ******/ ML_Get_Amatrix(ml_object, 0, &data); ML_Set_Smoother(ml_object, 0, ML_BOTH, data, user_smoothing,"mine"); ML_Get_Amatrix(ml_object, 1, &data); ML_Set_Smoother(ml_object, 1, ML_BOTH, data, user_smoothing,"mine"); ML_Get_Amatrix(ml_object, 2, &data); ML_Set_Smoother(ml_object, 2, ML_BOTH, data, user_smoothing,"mine"); ML_Gen_Solver (ml_object, ML_MGV, 0, N_levels-1); /* This example uses an internal CG solver within ML */ /* ML has limited Krylov methods support. It is intended */ /* that ML be used with another package that supplies */ /* more sophisticated Krylov solver options (such as those */ /* found in the Trilinos or Aztec packages. */ kdata = ML_Krylov_Create(ml_object->comm); ML_Krylov_Set_PrintFreq( kdata, 1 ); ML_Krylov_Set_Method(kdata, ML_CG); ML_Krylov_Set_Amatrix(kdata, &(ml_object->Amat[0])); ML_Krylov_Set_PreconFunc(kdata, ML_MGVSolve_Wrapper); ML_Krylov_Set_Precon(kdata, ml_object); ML_Krylov_Set_Tolerance(kdata, 1.e-7); ML_Krylov_Solve(kdata, 129, rhs, sol); ML_Krylov_Destroy( &kdata ); ML_Aggregate_Destroy(&agg_object); ML_Destroy(&ml_object); /******** End code to set a user-defined smoother ******/ printf("answer is %e %e %e %e %e\n",sol[0],sol[1],sol[2],sol[3],sol[4]); #ifdef ML_MPI MPI_Finalize(); #endif exit(EXIT_SUCCESS); }