12Peano 4 multigrid solver using Discontinuous Galerkin and PETSc
14@author 2022 Sean Baccas, Dmitry Nikolaenko, Tobias Weinzierl
18parser = argparse.ArgumentParser(description=
'Multigrid - Poisson solver')
19parser.add_argument(
"-j",
"--parallel-builds", dest=
"j", type=int, default=-1, help=
"Parallel builds" )
20parser.add_argument(
"-pd",
"--peano-dir", dest=
"peanodir", default=
"../../../../", help=
"Peano4 directory" )
21parser.add_argument(
"-v",
"--verbose", dest=
"verbose", action=
"store_true", default=
False, help=
"Verbose")
22parser.add_argument(
"-d",
"--dimensions", dest=
"dimensions", type=int, default=2, help=
"Dimensions")
23parser.add_argument(
"-deg",
"--degree", dest=
"degree", type=int, default=1, help=
"Polynomial degree")
24parser.add_argument(
"-upcn",
"--cell-unknowns", dest=
"upcn", type=int, default=1, help=
"Unknowns per cell node")
25parser.add_argument(
"-upfn",
"--face-unknowns", dest=
"upfn", type=int, default=2, help=
"Unknowns per face node")
26parser.add_argument(
"-meshsize",
"--meshsize", dest=
"meshsize", default=0.4, help=
"Mesh size")
27parser.add_argument(
"-m",
"--mode", dest=
"mode", choices=[
"release",
"stats",
"asserts",
"trace"], required=
True, help=
"Pick build type" )
28args = parser.parse_args()
30assert args.dimensions == 2,
"not ready for 3d yet"
33project = multigrid.petsc.api.Project(project_name =
"DG",
34 namespace = [
"benchmarks",
"multigrid",
"petsc",
"poisson" ],
38 preconditioner_type =
"JACOBI",
44matrices = multigrid.api.matrixgenerators.GaussLobatto(poly_degree = args.degree,
45 Dimensions = args.dimensions,
46 unknowns_per_cell_node = args.upcn,
48 unknowns_per_face_node = args.upfn,
52solver = multigrid.petsc.api.solvers.DiscontinuousGalerkinDiscretisation(name =
"DGPoisson",
53 polynomial_degree = args.degree,
54 cell_unknowns = args.upcn,
55 face_unknowns = args.upfn,
56 dimensions = args.dimensions,
57 min_h = args.meshsize,
58 max_h = args.meshsize,
59 cell_cell_rhs_matrix = matrices.get_cell_mass_matrix(),
60 cell_cell_lhs_matrix = matrices.get_cell_system_matrix_for_laplacian(),
61 cell_cell_lhs_matrix_scaling = args.dimensions-2,
62 cell_cell_rhs_matrix_scaling = args.dimensions,
63 cell_to_face_matrix = matrices.get_cell_to_face_matrix(),
64 face_to_cell_matrix = matrices.get_face_to_cell_matrix(),
67 cell_to_face_matrix_scaling =
None,
68 face_to_cell_matrix_scaling =
None,
69 face_face_Riemann_problem_matrix=matrices.get_face_face_riemann_problem_matrix(),
70 quadrature_points_in_unit_interval = matrices.get_points_unit_interval(),
71 gaussian_integration_points= matrices.get_points1d_legendre(),
72 gaussian_integration_weights=matrices.get_weights1d_legendre()
75project.add_solver( solver )
79if args.mode==
"release":
80 build_mode = peano4.api.output.CompileMode.RELEASE
82 build_mode = peano4.api.output.CompileMode.STATS
83if args.mode==
"asserts":
84 build_mode = peano4.api.output.CompileMode.ASSERTS
86 build_mode = peano4.api.output.CompileMode.TRACE
89project.set_global_simulation_parameters(
90 dimensions = args.dimensions,
91 offset = [ 0.0
for _
in range(args.dimensions) ],
92 domain_size = [ cube_size
for _
in range(args.dimensions) ],
96project.set_load_balancing(
"toolbox::loadbalancing::strategies::RecursiveSubdivision",
"new ::exahype2::LoadBalancingConfiguration()" )
97project.set_Peano4_installation( args.peanodir, build_mode )
102peano4_project = project.generate_Peano4_project(args.verbose)
103peano4_project.generate()
105os.system(
"make clean" )
107 os.system(
"make -j{}".format(args.j) )
109 os.system(
"make -j" )