Peano
Loading...
Searching...
No Matches
dg-tasking.py
Go to the documentation of this file.
1import os, sys
2import argparse
3import peano4.api
4import mghype
5import numpy as np
6
7print( """
8
9Peano 4 multigrid solver using Discontinuous Galerkin
10
11""")
12
13
14parser = argparse.ArgumentParser(description='Multigrid - Poisson solver')
15parser.add_argument("-j", "--parallel-builds", dest="j", type=int, default=-1, help="Parallel builds" )
16parser.add_argument("-pt", "--plot-sweep", dest="plot_after_each_mesh_sweep", action="store_true", default=False, help="Plot after each timestep. By default (False) we plot after initialisation and at the end" )
17parser.add_argument("-pd", "--peano-dir", dest="peanodir", default="../../../../", help="Peano4 directory" )
18parser.add_argument("-v", "--verbose", dest="verbose", action="store_true", default=False, help="Verbose")
19parser.add_argument("-d", "--dimensions", dest="dimensions", type=int, default=2, help="Dimensions")
20parser.add_argument("-p", "--poly_degree", dest="poly_degree", type=int, default=1, help="Polynomial Degree")
21parser.add_argument("-meshsize", "--meshsize", dest="meshsize", default=0.3, help="Mesh size")
22parser.add_argument("-omega_c", "--omega_c", dest="omega_c", default=0.5, help="Mesh size")
23parser.add_argument("-omega_f", "--omega_f", dest="omega_f", default=1.0, help="Mesh size")
24parser.add_argument("-m", "--mode", dest="mode", choices=["release","stats","asserts", "trace"], required=True, help="Pick build type" )
25args = parser.parse_args()
26
27#! [Create project]
28project = mghype.matrixfree.api.Project( project_name = "DGPointwise",
29 namespace = [ "tests", "multigrid", "matrixfree", "poisson" ]
30 )
31#! [Create project]
32
33
34#! [Construct matrices]
35
37 args.dimensions,
38 args.poly_degree,
39 1, # Unknowns per cell dof. Scalar PDE here
40 2, # We use the penalty formulation (see docu in tutorials)
41 2
42)
43
44assembly_matrix, assembly_matrix_scaling = matrices.get_cell_system_matrix_for_laplacian()
45mass_matrix, mass_matrix_scaling = matrices.get_cell_mass_matrix()
46face_from_cell_projection, \
47face_from_cell_projection_scaling = matrices.get_face_from_cell_matrix()
48cell_from_face_projection, \
49cell_from_face_projection_scaling = matrices.get_cell_from_face_matrix()
50approximate_system_matrix, \
51approximate_system_matrix_scaling = matrices.get_A_tilde()
52#! [Construct matrices]
53
54
55
56#! [Instantiate solver]
57solver = mghype.matrixfree.solvers.api.DGTaskingSolver(
58 name = "DGPoisson",
59 dimensions = args.dimensions,
60 poly_degree = args.poly_degree,
61 unknowns_per_cell_node = 1,
62 solutions_per_face_node = 2,
63 projections_per_face_node = 2,
64 min_h = args.meshsize,
65 max_h = args.meshsize,
66 assembly_matrix= assembly_matrix,
67 assembly_matrix_scaling = assembly_matrix_scaling,
68 mass_matrix = mass_matrix,
69 mass_matrix_scaling = mass_matrix_scaling,
70 face_from_cell_projection = face_from_cell_projection,
71 face_from_cell_projection_scaling = face_from_cell_projection_scaling,
72 cell_from_face_projection = cell_from_face_projection,
73 cell_from_face_projection_scaling = cell_from_face_projection_scaling,
74 riemann_matrix = matrices.get_face_face_riemann_problem_matrix(),
75 boundary_matrix = matrices.get_boundary_matrix(),
76 cell_relaxation = args.omega_c,
77 face_relaxation = args.omega_f, # default here is 1, i.e. we solve exactly. See class docu
78 approximate_system_matrix = approximate_system_matrix,
79 approximate_system_matrix_scaling = approximate_system_matrix_scaling,
80 solver_tolerance = 0.01,
81)
82
83#! [Instantiate solver]
84
85project.add_solver(solver)
86
87#
88# Configure build
89#
90if args.mode=="release":
91 build_mode = peano4.api.output.CompileMode.RELEASE
92if args.mode=="stats":
93 build_mode = peano4.api.output.CompileMode.STATS
94if args.mode=="asserts":
95 build_mode = peano4.api.output.CompileMode.ASSERTS
96if args.mode=="trace":
97 build_mode = peano4.api.output.CompileMode.TRACE
98
99
100cube_size = 1.0
101project.set_global_simulation_parameters(
102 dimensions = args.dimensions,
103 offset = [ 0.0 for _ in range(args.dimensions) ],
104 domain_size = [ cube_size for _ in range(args.dimensions) ],
105 plot_after_each_mesh_sweep = args.plot_after_each_mesh_sweep,
106 max_iterations = 10000
107)
108
109project.set_load_balancing( "toolbox::loadbalancing::strategies::SpreadOutOnceGridStagnates", "new ::exahype2::LoadBalancingConfiguration(0.9, 0, false, 8, 50)" )
110project.set_Peano4_installation( args.peanodir, build_mode )
111
112peano4_project = project.generate_Peano4_project(args.verbose)
113peano4_project.output.makefile.add_cpp_file( "Scenario.cpp" )
114peano4_project.generate()
115
116os.system( "make clean" )
117if args.j>0:
118 os.system( "make -j{}".format(args.j) )
119else:
120 os.system( "make -j$(nproc --all)" )
121