Peano
Loading...
Searching...
No Matches
dg.py
Go to the documentation of this file.
1# This file is part of the Peano multigrid project. For conditions of
2# distribution and use, please see the copyright notice at www.peano-framework.org
3
4
5import os, sys
6import argparse
7import peano4.api
8import multigrid
9
10print( """
11
12Peano 4 multigrid solver using Discontinuous Galerkin and PETSc
13
14@author 2022 Sean Baccas, Dmitry Nikolaenko, Tobias Weinzierl
15
16""")
17
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()
29
30assert args.dimensions == 2, "not ready for 3d yet"
31
32#! [Create project]
33project = multigrid.petsc.api.Project(project_name = "DG",
34 namespace = [ "benchmarks", "multigrid", "petsc", "poisson" ],
35
36 # next two arguments let us customise the solver we use in petsc
37 # see enum class in Peano/src/petsc/LinearEquationSystem.h for implemented options
38 preconditioner_type = "JACOBI",
39 solver_type = "GMRES"
40 )
41#! [Create project]
42
43
44matrices = multigrid.api.matrixgenerators.GaussLobatto(poly_degree = args.degree,
45 Dimensions = args.dimensions,
46 unknowns_per_cell_node = args.upcn,
47 # this attribute is not used by code written by Alex
48 unknowns_per_face_node = args.upfn,
49 )
50
51#! [Create solver]
52solver = multigrid.petsc.api.solvers.DiscontinuousGalerkinDiscretisation(name = "DGPoisson",
53 polynomial_degree = args.degree,
54 cell_unknowns = args.upcn, # unknowns_per_cell_dof,
55 face_unknowns = args.upfn, # unknowns_per_face_dof,
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(),
65
66 # removing scaling for debugging
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()
73 )
74
75project.add_solver( solver )
76#! [Create solver]
77
78#! [Configure build]
79if args.mode=="release":
80 build_mode = peano4.api.output.CompileMode.RELEASE
81if args.mode=="stats":
82 build_mode = peano4.api.output.CompileMode.STATS
83if args.mode=="asserts":
84 build_mode = peano4.api.output.CompileMode.ASSERTS
85if args.mode=="trace":
86 build_mode = peano4.api.output.CompileMode.TRACE
87
88cube_size = 1.0
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) ],
93)
94
95
96project.set_load_balancing( "toolbox::loadbalancing::strategies::RecursiveSubdivision", "new ::exahype2::LoadBalancingConfiguration()" )
97project.set_Peano4_installation( args.peanodir, build_mode )
98#! [Configure build]
99
100
101#! [Create Peano project]
102peano4_project = project.generate_Peano4_project(args.verbose)
103peano4_project.generate()
104
105os.system( "make clean" )
106if args.j>0:
107 os.system( "make -j{}".format(args.j) )
108else:
109 os.system( "make -j" )
110#! [Create Peano project]
111
112print("Done")