Peano
Loading...
Searching...
No Matches
poisson.py
Go to the documentation of this file.
1import os
2import sys
3import argparse
4import peano4.api
5import exahype2
6
7modes = {
8 "release": peano4.api.output.CompileMode.RELEASE,
9 "trace": peano4.api.output.CompileMode.TRACE,
10 "assert": peano4.api.output.CompileMode.ASSERTS,
11 "stats": peano4.api.output.CompileMode.STATS,
12 "debug": peano4.api.output.CompileMode.DEBUG,
13}
14
15parser = argparse.ArgumentParser(description='ExaHyPE 2 - Euler benchmarking script')
16parser.add_argument("-cs", "--cell-size", dest="h", type=float, required=True, help="Mesh size")
17parser.add_argument("-j", "--parallel-builds", dest="j", type=int, default=-1, help="Parallel builds. Set to 0 to disable compile or to -1 to use all cores")
18parser.add_argument("-d", "--dimensions", dest="dimensions", type=int, default=2, help="Dimensions")
19parser.add_argument("-m", "--mode", dest="mode", default="release", help="|".join(modes.keys()))
20parser.add_argument("-et", "--end-time", dest="end_time", type=float, default=1.0, help="Number of timesteps")
21parser.add_argument("-pd", "--peano-dir", dest="peanodir", default="../../../../../", help="Peano4 directory")
22parser.add_argument("-cd", "--configure-dir", dest="configuredir", default="../../../../../", help="Location of configure" )
23parser.add_argument("-amr", "--adaptive-levels", dest="adaptivity_levels", type=int, default=0, help="Number of AMR grid levels on top of hmax (0 by default)")
24parser.add_argument("-t", "--type", dest="type", choices=["global-fixed", "global-adaptive"], required=True)
25parser.add_argument("-pdt", "--plot-dt", dest="plot_snapshot_interval", default=0, help="Time interval in-between two snapshots (switched off by default")
26parser.add_argument("-v", "--verbose", dest="verbose", action="store_true", default=False, help="Verbose")
27parser.add_argument("-ps", "--patch-size", dest="patch_size", type=int, default=17, help="Dimensions")
28args = parser.parse_args()
29
30if args.dimensions not in [2,3]:
31 print("Error, dimension must be 2 or 3, you supplied {}".format(args.dimensions))
32 import sys
33 sys.exit(1)
34
35if args.mode not in modes:
36 print("Error, mode must be {} or {}, you supplied {}".format(", ",join(modes.keys()[:-1]),modes.keys()[-1],args.mode))
37 import sys
38 sys.exit(1)
39
40print("\nConfiguring {}D Euler problem. Buildmode is {}, nbuilds={}.\n".format(args.dimensions, args.mode, args.j))
41
42#
43# Create a project and configure it to end up in a subnamespace (and thus
44# subdirectory).
45#
46project = exahype2.Project(
47 namespace = ["applications", "exahype2", "euler", "selfgravitation"],
48 project_name = "Poisson",
49 directory = ".",
50 executable = "subcycling-scheme",
51 abstract_overwrite = False,
52)
53
54#
55# Add the Finite Volumes solver
56#
57max_h = args.h / args.patch_size
58min_h = 0.9 * args.h * 3.0**(-args.adaptivity_levels) / args.patch_size
59
60time_step_size = 0.1 * min_h
61
62auxiliary_variables = 0
63
64euler_solver = None
65poisson_solver = None
66if args.type=="global-fixed":
67 euler_solver = exahype2.solvers.fv.rusanov.GlobalFixedTimeStep(
68 "Euler",
69 args.patch_size,
70 5, #unknowns,
71 3, #auxiliary_variables,
72 min_h, max_h,
73 time_step_size,
74 flux = exahype2.solvers.PDETerms.User_Defined_Implementation,
75 eigenvalues = exahype2.solvers.PDETerms.User_Defined_Implementation,
76 source_term = exahype2.solvers.PDETerms.User_Defined_Implementation
77 )
78 poisson_solver = exahype2.solvers.fv.rusanov.GlobalFixedTimeStep(
79 "Poisson",
80 args.patch_size,
81 4, #unknowns,
82 1, #auxiliary_variables,
83 min_h, max_h,
84 time_step_size / 4 / 3.1415**2,
85 flux = exahype2.solvers.PDETerms.User_Defined_Implementation,
86 eigenvalues = exahype2.solvers.PDETerms.User_Defined_Implementation,
87 source_term = exahype2.solvers.PDETerms.User_Defined_Implementation
88 )
89if args.type=="global-adaptive":
90 euler_solver = exahype2.solvers.fv.rusanov.GlobalAdaptiveTimeStep(
91 "Euler",
92 args.patch_size,
93 5, #unknowns,
94 3, #auxiliary_variables,
95 min_h, max_h,
96 time_step_relaxation = 1e-2,
97 flux = exahype2.solvers.PDETerms.User_Defined_Implementation,
98 eigenvalues = exahype2.solvers.PDETerms.User_Defined_Implementation,
99 source_term = exahype2.solvers.PDETerms.User_Defined_Implementation
100 )
101 poisson_solver = exahype2.solvers.fv.rusanov.GlobalAdaptiveTimeStep(
102 "Poisson",
103 args.patch_size,
104 4, #unknowns,
105 1, #auxiliary_variables,
106 min_h, max_h,
107 time_step_relaxation = 1e-3,
108 flux = exahype2.solvers.PDETerms.User_Defined_Implementation,
109 eigenvalues = exahype2.solvers.PDETerms.User_Defined_Implementation,
110 source_term = exahype2.solvers.PDETerms.User_Defined_Implementation
111 )
112
113euler_solver.set_implementation(refinement_criterion=exahype2.solvers.PDETerms.User_Defined_Implementation)
114
115project.add_solver(euler_solver)
116project.add_solver(poisson_solver)
117
118#
119# Time step synchronisation. Ensure the Euler solver doesn't run ahead but waits
120# for the Poisson updates.
121#
122euler_solver._action_set_update_cell.guard += " and tarch::la::greaterEquals( fineGridCell" + \
123 poisson_solver.name + "CellLabel.getTimeStamp(), fineGridCell" + euler_solver.name + \
124 "CellLabel.getTimeStamp() )"
125
126#
127# Add the coupling terms
128#
129euler_solver.add_user_action_set_includes( """
130#include "toolbox/blockstructured/Copy.h"
131""")
132euler_solver.postprocess_updated_patch = """
133 ::toolbox::blockstructured::copyUnknown(
134 {}, // no of unknowns per dimension
135 fineGridCellEulerQ.value, // source
136 0, // the first index (0) is rho
137 5+3, // unknowns in source (incl material parameters)
138 0, // no overlap/halo here
139 fineGridCellPoissonQ.value, // dest
140 4, // index four in destination, i.e. fifth entry
141 4+1, // four unknowns in source (incl material parameters)
142 0 // no overlap/halo here
143 );
144""".format(args.patch_size)
145
146poisson_solver.add_user_action_set_includes( """
147#include "toolbox/blockstructured/Derivative.h"
148""")
149poisson_solver.postprocess_updated_patch = """
150 double delta =
151 ::toolbox::blockstructured::computeGradientAndReturnMaxDifference(
152 {}, // no of unknowns per dimension
153 fineGridCellPoissonQ.value, // source
154 0, // take first entry of solution vector, ignore helper entries
155 4+1, // unknowns in source (incl material parameters)
156 0, // no overlap/halo here
157 fineGridCellEulerQ.value, // source
158 #if Dimensions==2
159 {{5,6}}, // indices to which we write the gradient. Depends on dimension
160 #else
161 {{5,6,7}}, // and uses two brackets as escape symbol
162 #endif
163 5+3, // four unknowns in source (incl material parameters)
164 0, // no overlap/halo here
165 marker.h()
166 );
167 repositories::instanceOf{}.reportGradientDelta( delta );
168""".format(args.patch_size, poisson_solver.name)
169
170#
171# Ensure the Poisson solver does never overtake the Euler
172#
173poisson_solver._compute_new_time_step_size += """
174if (fineGridCell""" + poisson_solver.name + "CellLabel.getTimeStamp() > fineGridCell" + euler_solver.name + """CellLabel.getTimeStamp() ) {
175 timeStamp = fineGridCell""" + euler_solver.name + """CellLabel.getTimeStamp(); // reset time step size
176 timeStepSize = 0.0; // invalidate time step size; the one chosen didn't make sense
177 fineGridCell""" + poisson_solver.name + """CellLabel.setTimeStamp( timeStamp );
178}
179else {
180}
181"""
182
183if args.dimensions == 2:
184 size = [1.0, 1.0]
185 offset = [0.0, 0.0]
186else:
187 size = [1.0, 1.0, 1.0]
188 offset = [0.0, 0.0, 0.0]
189
190#
191# Lets configure some global parameters
192#
193project.set_global_simulation_parameters(
194 dimensions = args.dimensions,
195 offset = offset,
196 size = size,
197 min_end_time = args.end_time,
198 max_end_time = args.end_time,
199 first_plot_time_stamp = 0.0,
200 time_in_between_plots = args.plot_snapshot_interval, # snapshots
201 periodic_BC = [False, False, False]
202)
203
204#
205# So here's the parallel stuff. This is new compared to the serial
206# prototype we did start off with.
207#
208project.set_load_balancing("toolbox::loadbalancing::strategies::RecursiveBipartition", "new ::exahype2::LoadBalancingConfiguration()")
209project.set_Peano4_installation(args.peanodir, modes[args.mode])
210peano4_project = project.generate_Peano4_project(args.verbose)
211peano4_project.output.makefile.add_h_file("Euler.h")
212peano4_project.output.makefile.add_cpp_file("Euler.cpp")
213peano4_project.output.makefile.add_h_file("Poisson.h")
214peano4_project.output.makefile.add_cpp_file("Poisson.cpp")
215peano4_project.output.makefile.parse_configure_script_outcome(args.configuredir)
216if args.j==0:
217 peano4_project.generate()
218else:
219 peano4_project.build(make_clean_first=True, number_of_parallel_builds=args.j)
220
221print("Convert any output via pvpython ~/git/Peano/python/peano4/visualisation/render.py solution-Euler.peano-patch-file")