Skip to content

Commit d0e1cb7

Browse files
committed
Make GMG default preconditioner
1 parent 0d485a6 commit d0e1cb7

File tree

1,866 files changed

+635024
-639630
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,866 files changed

+635024
-639630
lines changed

benchmarks/newton_solver_benchmark_set/tosi_et_al_2015/input.prm

+2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ subsection Solver parameters
2828
subsection Stokes solver parameters
2929
set Number of cheap Stokes solver steps = 200
3030
set Linear solver tolerance = 1e-6
31+
set Stokes solver type = block AMG
3132
end
3233

3334
subsection Newton solver parameters
@@ -100,6 +101,7 @@ end
100101

101102
subsection Material model
102103
set Model name = TosiMaterial
104+
set Material averaging = none
103105

104106
subsection Tosi benchmark
105107
set Reference density = 1
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
Changed: ASPECT's default Stokes preconditioner has been changed from
2+
a block AMG preconditioner to the geometric multigrid (GMG) preconditioner
3+
described in Clevenger and Heister, 2021 (https://doi.org/10.1002/nla.2375).
4+
The GMG preconditioner generally performs better, but requires that
5+
the viscosity is averaged using one of the material model averaging functions.
6+
If models use features that are not supported by the GMG preconditioner
7+
and the GMG preconditioner has not been explicitly set ASPECT will
8+
fall back to the AMG preconditioner.
9+
<br>
10+
(Rene Gassmoeller, 2024/06/09)

include/aspect/material_model/interface.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -712,7 +712,8 @@ namespace aspect
712712
log_average,
713713
harmonic_average_only_viscosity,
714714
geometric_average_only_viscosity,
715-
project_to_Q1_only_viscosity
715+
project_to_Q1_only_viscosity,
716+
solver_default
716717
};
717718

718719

include/aspect/parameters.h

+5-2
Original file line numberDiff line numberDiff line change
@@ -323,12 +323,13 @@ namespace aspect
323323
{
324324
block_amg,
325325
direct_solver,
326-
block_gmg
326+
block_gmg,
327+
default_solver
327328
};
328329

329330
static const std::string pattern()
330331
{
331-
return "block AMG|direct solver|block GMG";
332+
return "default solver|block AMG|direct solver|block GMG";
332333
}
333334

334335
static Kind
@@ -340,6 +341,8 @@ namespace aspect
340341
return direct_solver;
341342
else if (input == "block GMG")
342343
return block_gmg;
344+
else if (input == "default solver")
345+
return default_solver;
343346
else
344347
AssertThrow(false, ExcNotImplemented());
345348

include/aspect/simulator.h

+8
Original file line numberDiff line numberDiff line change
@@ -1740,6 +1740,14 @@ namespace aspect
17401740
void
17411741
check_consistency_of_formulation ();
17421742

1743+
/**
1744+
* This function checks if the default solver and/or material
1745+
* averaging were selected and if so, determines the appropriate
1746+
* solver and/or averaging option.
1747+
*/
1748+
void
1749+
select_default_solver_and_averaging ();
1750+
17431751
/**
17441752
* This function checks that the user-selected boundary conditions do not
17451753
* contain contradictions. If an incorrect selection is detected it

source/material_model/interface.cc

+3-1
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ namespace aspect
430430
{
431431
std::string get_averaging_operation_names ()
432432
{
433-
return "none|arithmetic average|harmonic average|geometric average|pick largest|project to Q1|log average|harmonic average only viscosity|geometric average only viscosity|project to Q1 only viscosity";
433+
return "none|solver default|arithmetic average|harmonic average|geometric average|pick largest|project to Q1|log average|harmonic average only viscosity|geometric average only viscosity|project to Q1 only viscosity";
434434
}
435435

436436

@@ -456,6 +456,8 @@ namespace aspect
456456
return geometric_average_only_viscosity;
457457
else if (s == "project to Q1 only viscosity")
458458
return project_to_Q1_only_viscosity;
459+
else if (s == "solver default")
460+
return solver_default;
459461
else
460462
AssertThrow (false,
461463
ExcMessage ("The value <" + s + "> for a material "

source/simulator/core.cc

+5-1
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,8 @@ namespace aspect
212212
Triangulation<dim>::do_not_produce_unrefined_islands)
213213
)
214214
,
215-
(parameters.stokes_solver_type == Parameters<dim>::StokesSolverType::block_gmg
215+
(parameters.stokes_solver_type == Parameters<dim>::StokesSolverType::block_gmg ||
216+
parameters.stokes_solver_type == Parameters<dim>::StokesSolverType::default_solver
216217
?
217218
static_cast<typename parallel::distributed::Triangulation<dim>::Settings>
218219
(parallel::distributed::Triangulation<dim>::mesh_reconstruction_after_repartitioning |
@@ -423,6 +424,9 @@ namespace aspect
423424
newton_handler->parameters.parse_parameters(prm);
424425
}
425426

427+
// choose the default solver and averaging scheme
428+
select_default_solver_and_averaging();
429+
426430
if (parameters.stokes_solver_type == Parameters<dim>::StokesSolverType::block_gmg)
427431
{
428432
switch (parameters.stokes_velocity_degree)

source/simulator/helper_functions.cc

+51-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <aspect/global.h>
2727

2828
#include <aspect/geometry_model/interface.h>
29+
#include <aspect/geometry_model/ellipsoidal_chunk.h>
2930
#include <aspect/heating_model/interface.h>
3031
#include <aspect/heating_model/adiabatic_heating.h>
3132
#include <aspect/material_model/interface.h>
@@ -2131,6 +2132,7 @@ namespace aspect
21312132
}
21322133

21332134

2135+
21342136
template <int dim>
21352137
void
21362138
Simulator<dim>::replace_outflow_boundary_ids(const unsigned int offset)
@@ -2533,7 +2535,53 @@ namespace aspect
25332535
}
25342536
return new_linear_stokes_solver_tolerance;
25352537
}
2538+
2539+
2540+
2541+
template <int dim>
2542+
void
2543+
Simulator<dim>::select_default_solver_and_averaging()
2544+
{
2545+
if (parameters.stokes_solver_type == Parameters<dim>::StokesSolverType::default_solver)
2546+
{
2547+
// Catch all situations that are not supported by the GMG solver:
2548+
// - Melt transport
2549+
// - Ellipsoidal geometry
2550+
// - Locally conservative discretization
2551+
// - Implicit reference density profile
2552+
// - Periodic boundaries
2553+
// - Stokes velocity degree not 2 or 3
2554+
// - Material averaging explicitly disabled
2555+
if (parameters.include_melt_transport == true ||
2556+
dynamic_cast<const GeometryModel::EllipsoidalChunk<dim>*>(geometry_model.get()) != nullptr ||
2557+
parameters.use_locally_conservative_discretization == true ||
2558+
(material_model->is_compressible() == true && parameters.formulation_mass_conservation ==
2559+
Parameters<dim>::Formulation::MassConservation::implicit_reference_density_profile) ||
2560+
(geometry_model->get_periodic_boundary_pairs().size()) > 0 ||
2561+
(parameters.stokes_velocity_degree < 2 || parameters.stokes_velocity_degree > 3) ||
2562+
parameters.material_averaging == MaterialModel::MaterialAveraging::none)
2563+
{
2564+
// GMG is not supported (yet), by default fall back to AMG.
2565+
parameters.stokes_solver_type = Parameters<dim>::StokesSolverType::block_amg;
2566+
}
2567+
else
2568+
{
2569+
// GMG is supported for all other cases
2570+
parameters.stokes_solver_type = Parameters<dim>::StokesSolverType::block_gmg;
2571+
}
2572+
}
2573+
2574+
// Now pick an appropriate material averaging for the chosen solver
2575+
if (parameters.material_averaging == MaterialModel::MaterialAveraging::solver_default)
2576+
{
2577+
if (parameters.stokes_solver_type == Parameters<dim>::StokesSolverType::block_gmg)
2578+
parameters.material_averaging = MaterialModel::MaterialAveraging::project_to_Q1_only_viscosity;
2579+
else
2580+
parameters.material_averaging = MaterialModel::MaterialAveraging::none;
2581+
}
2582+
}
25362583
}
2584+
25372585
// explicit instantiation of the functions we implement in this file
25382586
namespace aspect
25392587
{
@@ -2573,7 +2621,9 @@ namespace aspect
25732621
const double linear_stokes_solver_tolerance, \
25742622
const double stokes_residual, \
25752623
const double newton_residual, \
2576-
const double newton_residual_old);
2624+
const double newton_residual_old); \
2625+
template void Simulator<dim>::select_default_solver_and_averaging();
2626+
25772627

25782628
ASPECT_INSTANTIATE(INSTANTIATE)
25792629

source/simulator/parameters.cc

+2-2
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@ namespace aspect
376376

377377
prm.enter_subsection ("Stokes solver parameters");
378378
{
379-
prm.declare_entry ("Stokes solver type", "block AMG",
379+
prm.declare_entry ("Stokes solver type", "default solver",
380380
Patterns::Selection(StokesSolverType::pattern()),
381381
"This is the type of solver used on the Stokes system. The block geometric "
382382
"multigrid solver currently has a limited implementation and therefore "
@@ -1342,7 +1342,7 @@ namespace aspect
13421342
// preconditioner
13431343
prm.enter_subsection ("Material model");
13441344
{
1345-
prm.declare_entry ("Material averaging", "none",
1345+
prm.declare_entry ("Material averaging", "solver default",
13461346
Patterns::Selection(MaterialModel::MaterialAveraging::
13471347
get_averaging_operation_names()),
13481348
"Whether or not (and in the first case, how) to do any averaging of "

0 commit comments

Comments
 (0)