Skip to content

[Issue] When I set the convergence criterion to the absolute residual, the AMGX iteration log reports that “Relative residual has reached machine precision” and then stops further iterations. #350

@Haiqing-Fang

Description

@Haiqing-Fang

When I set "convergence": "ABSOLUTE", "tolerance": 1e-7 in AMGX, the solver prints:

Relative residual has reached machine precision.

However, my stopping criterion is the absolute residual. Why is the relative residual being used? I would like the solver to use the absolute residual as the convergence criterion. Is it possible that my AMGX solver configuration is not actually taking effect?
I am using double precision, so the machine precision is about 1e-16.

AMGX solver configuration
CHECK_AMGX(AMGX_initialize());

AMGX_config_handle cfg;
CHECK_AMGX(AMGX_config_create_from_file(&cfg, "./amgx_SH.json"));

AMGX_resources_handle rsrc;
CHECK_AMGX(AMGX_resources_create_simple(&rsrc, cfg));

AMGX_matrix_handle A;
AMGX_vector_handle b, x;
AMGX_solver_handle solver;

CHECK_AMGX(AMGX_matrix_create(&A, rsrc, AMGX_mode_dDDI));
CHECK_AMGX(AMGX_vector_create(&b, rsrc, AMGX_mode_dDDI));
CHECK_AMGX(AMGX_vector_create(&x, rsrc, AMGX_mode_dDDI));
CHECK_AMGX(AMGX_solver_create(&solver, rsrc, AMGX_mode_dDDI, cfg));

CHECK_AMGX(AMGX_matrix_upload_all(
A, N, nnz,
1, 1,
row_ptr.data(),
col_ind.data(),
values.data(),
nullptr
));

CHECK_AMGX(AMGX_vector_upload(b, N, 1, rhs.data()));
std::vector h_x0(N, 0.0);
CHECK_AMGX(AMGX_vector_upload(x, N, 1, h_x0.data()));

CHECK_AMGX(AMGX_solver_setup(solver, A));
CHECK_AMGX(AMGX_solver_solve(solver, b, x));

AMGX_SOLVE_STATUS status;
CHECK_AMGX(AMGX_solver_get_status(solver, &status));
int iters = 0;
CHECK_AMGX(AMGX_solver_get_iterations_number(solver, &iters));

Configuration: amgx_SH.json:
{
"config_version": 2,
"determinism_flag": 1,

"solver": {
"solver": "FGMRES",
"scope": "main",

"preconditioner": {
  "solver": "AMG",
  "scope": "amg",

  "algorithm": "AGGREGATION",
  "cycle": "V",
  "max_levels": 30,
  "max_iters": 1,

  "smoother": "JACOBI_L1",
  "presweeps": 1,
  "postsweeps": 1,
  "coarsest_sweeps": 1,
  "selector": "SIZE_2"
},

"print_solve_stats": 1,
"obtain_timings": 1,
"monitor_residual": 1,

"max_iters": 1000,
"convergence": "ABSOLUTE",
"tolerance": 1e-7,
"norm": "L2"

}
}

Run log
Output around the end of the solve:
AMGX_solver_get_status(solver, &status):
669 16.2383 5.897965e-04 0.9862
670 16.2383 5.758887e-04 0.9764
671 16.2383 5.513113e-04 0.9573
672 16.2383 5.288395e-04 0.9592
673 16.2383 5.166605e-04 0.9770
674 16.2383 5.016301e-04 0.9709
675 16.2383 4.859083e-04 0.9687
676 16.2383 4.735401e-04 0.9745
677 16.2383 4.577987e-04 0.9668
678 16.2383 4.396150e-04 0.9603
679 16.2383 4.195545e-04 0.9544
Relative residual has reached machine precision
680 16.2383 4.045309e-04 0.9642
----------------------------------------------------------------------
Total Iterations: 681
Avg Convergence Rate: 0.9602
Final Residual: 4.045309e-04
Total Reduction in Residual: 9.873147e-13
Maximum Memory Usage: 16.238 GB
----------------------------------------------------------------------
Total Time: 13.1027
setup: 0.502298 s
solve: 12.6004 s
solve(per iteration): 0.0185028 s

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions