Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] fix multigrid agglomeration #2375

Open
wants to merge 4 commits into
base: develop
Choose a base branch
from

Conversation

bigfooted
Copy link
Contributor

Proposed Changes

Implement multigrid agglomeration rules according to Nishikawa et al paper:

https://www.researchgate.net/publication/267557097_Development_and_Application_of_Parallel_Agglomerated_Multigrid_Method_for_Complex_Geometries

These rules were not consistently implemented. Issues:

  1. Ridge -> ridge agglomeration was not possible.
  2. Interior points were allowed to be agglomerated with boundary points.
  3. The symmetry plane / euler wall agglomeration rules are too restrictive.

TO DO: properly agglomerate nodes that are on mpi interfaces (SEND_RECEIVE markers)

PR Checklist

Put an X by all that apply. You can fill this out after submitting the PR. If you have any questions, don't hesitate to ask! We want to help. These are a guide for you to know what the reviewers will be looking for in your contribution.

  • I am submitting my contribution to the develop branch.
  • My contribution generates no new compiler warnings (try with --warnlevel=3 when using meson).
  • My contribution is commented and consistent with SU2 style (https://su2code.github.io/docs_v7/Style-Guide/).
  • I used the pre-commit hook to prevent dirty commits and used pre-commit run --all to format old commits.
  • I have added a test case that demonstrates my contribution, if necessary.
  • I have updated appropriate documentation (Tutorials, Docs Page, config_template.cpp), if necessary.

@@ -45,7 +45,7 @@ class CMultiGridGeometry final : public CGeometry {
* \param[in] config - Definition of the particular problem.
* \return <code>TRUE</code> or <code>FALSE</code> depending if the control volume can be agglomerated.
*/
bool SetBoundAgglomeration(unsigned long CVPoint, short marker_seed, const CGeometry* fine_grid,
bool SetBoundAgglomeration(unsigned long CVPoint, vector<short> marker_seed, const CGeometry* fine_grid,
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need to pass information about all markers on the seed node (number of markers and index of marker)

Common/src/geometry/CMultiGridGeometry.cpp Fixed Show fixed Hide fixed
Common/src/geometry/CMultiGridGeometry.cpp Fixed Show fixed Hide fixed
Common/src/geometry/CMultiGridGeometry.cpp Fixed Show fixed Hide fixed
Common/src/geometry/CMultiGridGeometry.cpp Fixed Show fixed Hide fixed
Common/src/geometry/CMultiGridGeometry.cpp Fixed Show fixed Hide fixed
Common/src/geometry/CMultiGridGeometry.cpp Fixed Show fixed Hide fixed
Comment on lines 584 to 589
//if ((config->GetMarker_All_KindBC(marker_seed[0]) == SYMMETRY_PLANE) ||
// (config->GetMarker_All_KindBC(marker_seed[0]) == EULER_WALL)) {
// if (config->GetMarker_All_KindBC(copy_marker[0]) == SEND_RECEIVE) {
// agglomerate_CV = false;
// }
//}

Check notice

Code scanning / CodeQL

Commented-out code Note

This comment appears to contain commented-out code.
//if ((config->GetMarker_All_KindBC(copy_marker[0]) == EULER_WALL) ||
// (config->GetMarker_All_KindBC(copy_marker[1]) == EULER_WALL)) {
agglomerate_seed = true;
//}

Check notice

Code scanning / CodeQL

Commented-out code Note

This comment appears to contain commented-out code.
Comment on lines +558 to +560
//if (config->GetMarker_All_KindBC(copy_marker[0]) == SEND_RECEIVE) {
// agglomerate_CV = true;
//}

Check notice

Code scanning / CodeQL

Commented-out code Note

This comment appears to contain commented-out code.
Comment on lines +591 to +593
// agglomerate_CV = true;
// }
// }

Check notice

Code scanning / CodeQL

Commented-out code Note

This comment appears to contain commented-out code.
@@ -307,6 +307,7 @@
case SUB_SOLVER_TYPE::TURB_SST:
genericSolver = CreateTurbSolver(kindTurbModel, solver, geometry, config, iMGLevel, false);
metaData.integrationType = INTEGRATION_TYPE::SINGLEGRID;
//metaData.integrationType = INTEGRATION_TYPE::MULTIGRID;

Check notice

Code scanning / CodeQL

Commented-out code Note

This comment appears to contain commented-out code.
@YairMO
Copy link

YairMO commented Nov 16, 2024

Hi,

It would be great to make the MG work better. I would like to take this opportunity to improve my understanding of the MG inputs in the cfg file. Here is an example of MG input:

MGLEVEL=3
MGCYCLE= V_CYCLE
MG_PRE_SMOOTH= ( 5, 5, 5, 10 )
MG_POST_SMOOTH= ( 5, 5, 5, 5 )
MG_CORRECTION_SMOOTH= ( 25, 20, 15, 10 )

I was expecting to obtain the same report in the SU2 output file. However, there seems to be a gap between the input and the output reports. I attached the corresponding report output (of the above input):
MG-Output

Also, could you tell me how a turbulence model is handled within the MG? Is it projected or solved using the MG method?

Thank you

@bigfooted
Copy link
Contributor Author

In SU2, we overwrite part of the config settings. The nr of pre-smoothing steps for the finest grid is always 1. The nr of post-smoothing steps for the coarsest and finest grid is always 0. I do not know why.
At the moment, we do not use multigrid for additional scalar equations like turbulence and species transport.

@YairMO
Copy link

YairMO commented Nov 18, 2024

Thank you.
I understand why pre- and post-smoothing of the coarsest and finest levels may be indistinguishable. Therefore, I understand why the post-smoothing of these levels is zero, but I expect instead to control the pre-smoothing relaxation of the finest level. Fixing the pre-smoothing of the finest level to 1 relaxation may be insufficient.

We wish to contribute our knowledge about MG for scalar transport equations; if an exciting group is on this topic, we will be happy to collaborate.

@bigfooted
Copy link
Contributor Author

Nice to hear there is a larger interest in getting the multigrid method to a higher level. If you would like to enable multigrid for species transport, the first thing to do is change the integration type from SINGLEGRID to MULTIGRID for CreateSpeciesSolver in CSolverFactory.cpp. Then in CMultigridIntegration.cpp, there might be some solver specific things that need to be added.
Another thing that seems important for viscous applications is to agglomerate along implicit lines normal to viscous walls.

@YairMO
Copy link

YairMO commented Nov 19, 2024

Thank you for pointing this out. Does the current agglomeration (for the mean-flow equations) consider lines normal to the surface? I think that the Hiroaki paper (MG) considred implicit line?

@bigfooted
Copy link
Contributor Author

Hi, No we currently do not do agglomeration along lines. I suspect this is one reason that we do not have good multigrid performance for a number of viscous testcases. @EvertBunschoten was looking into this as well, but he was not yet able to reproduce the good performance reported by the papers of Diskin, Nishikawa and others.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants