# gmgrid: Geometric multigrid on CPU (OpenMP)

### Status on 2025-May-14
 - The multigrid part is deactivated via `*#undef MG` in *main.cpp* and so only a simple Jacobi iteration is performed as solver.
 - `make run`
 - or `main.GCC_ levels`  with number of `levels` in [0,7].

### Data structures/implementation for GPU
 - use data structures from cg_2:Framework for preconditioned solvers on GPU and CPU
 - suggested: class vec from vdop_gpu.h
 - suggested: class CRS_Matrix_GPU from crsmatrix_gpu.h
 - use cuBLAS, cuSPARSE and more libraries whenever possible.
 
### current code structure
 - *main.cpp*
 - *binaryIO.cpp*    : reads CRS matrix and vector from files
 - *vdop.cpp*        : some basic vector operations on CPU, also in *utils.h*
 - *geom.cpp*        : reads the coarse geometry, performes mesh handling and includes mesh hierarchy
 - *getmatrix.cpp*   : compressed row storage matrix and its generation from a 2D mesh
 - *cuthill_mckee_ordering.cpp* : graph reordering to minimize the bandwidth
 - *jacsolve.cpp*    : Jacobi solver/smoother for a linear system of equations with CRS matrix; multigrid solver
 - *elements.cpp*    : more general elements - experimental. Try with *el_main.cpp*
 - *generateCRS.cpp* : Reads mesh files and generates files output with stiffness matrix (Laplace) and right hand side.

