Peano
Loading...
Searching...
No Matches
Quadrature.py
Go to the documentation of this file.
1# This file is part of the ExaHyPE2 project. For conditions of distribution and
2# use, please see the copyright notice at www.peano-framework.org
3from copy import deepcopy
4
5import peano4.output
6
7from exahype2.solvers.MathUtils import MathUtils
8from exahype2.solvers.aderdg.Architectures import Architectures
9
10
11class Quadrature(object):
12 def __init__(self, dictionary):
13 self.d = deepcopy(dictionary)
14
16 self, namespace, output, subdirectory, template_prefix, output_path
17 ):
18 if self.d["POLYNOMIAL_TYPE"] == "legendre":
19 QuadratureWeights, QuadratureNodes = MathUtils.getGaussLegendre(
20 self.d["NUMBER_OF_DOF"]
21 )
22 OtherQuadratureWeights, OtherQuadratureNodes = MathUtils.getGaussLobatto(
23 self.d["NUMBER_OF_DOF"]
24 )
25 elif self.d["POLYNOMIAL_TYPE"] == "lobatto":
26 QuadratureWeights, QuadratureNodes = MathUtils.getGaussLobatto(
27 self.d["NUMBER_OF_DOF"]
28 )
29 OtherQuadratureWeights, OtherQuadratureNodes = MathUtils.getGaussLobatto(
30 self.d["NUMBER_OF_DOF"]
31 )
32 QuadratureNodes = QuadratureNodes[::-1]
33 else:
34 raise ValueError(
35 "Quadrature type " + self.d["POLYNOMIAL_TYPE"] + " not supported."
36 )
37
38 weightsVector = MathUtils.vectorPad(
39 QuadratureWeights, self.d["NUMBER_OF_DOF_PADDED"] - self.d["NUMBER_OF_DOF"]
40 )
41 self.d["weights1"] = weightsVector
42 self.d["w1Size"] = len(self.d["weights1"])
43 self.d["w1_seq"] = range(self.d["w1Size"])
44
45 # inverse of weights1
46 self.d["iweights1"] = [
47 1.0 / self.d["weights1"][i] if self.d["weights1"][i] != 0.0 else 0.0
48 for i in self.d["w1_seq"]
49 ]
50
51 if self.d["DIMENSIONS"] == 2:
52 # weightsVector is QuadratureWeights itself
53 weightsVector = MathUtils.vectorPad(
54 QuadratureWeights,
55 Architectures.get_pad_size(
56 self.d["ARCHITECTURE"], len(QuadratureWeights)
57 ),
58 )
59 self.d["weights2"] = weightsVector
60 self.d["w2Size"] = len(self.d["weights2"])
61 self.d["w2_seq"] = range(self.d["w2Size"])
62
63 # all combinations of two weights, written as an 1D array
64 weightsVector = [
65 QuadratureWeights[i] * QuadratureWeights[j]
66 for i in range(self.d["NUMBER_OF_DOF"])
67 for j in range(self.d["NUMBER_OF_DOF"])
68 ]
69 weightsVector = MathUtils.vectorPad(
70 weightsVector,
71 Architectures.get_pad_size(self.d["ARCHITECTURE"], len(weightsVector)),
72 )
73 self.d["weights3"] = weightsVector
74 self.d["w3Size"] = len(self.d["weights3"])
75 self.d["w3_seq"] = range(self.d["w3Size"])
76
77 # all combinations of three weights, written as an 1D array
78 weightsVector = [
79 QuadratureWeights[i] * QuadratureWeights[j] * QuadratureWeights[k]
80 for i in range(self.d["NUMBER_OF_DOF"])
81 for j in range(self.d["NUMBER_OF_DOF"])
82 for k in range(self.d["NUMBER_OF_DOF"])
83 ]
84 weightsVector = MathUtils.vectorPad(
85 weightsVector,
86 Architectures.get_pad_size(self.d["ARCHITECTURE"], len(weightsVector)),
87 )
88 self.d["weights4"] = weightsVector
89 self.d["w4Size"] = len(self.d["weights4"])
90 self.d["w4_seq"] = range(self.d["w4Size"])
91 else:
92 # all combinations of two weights, written as an 1D array
93 weightsVector = [
94 QuadratureWeights[i] * QuadratureWeights[j]
95 for i in range(self.d["NUMBER_OF_DOF"])
96 for j in range(self.d["NUMBER_OF_DOF"])
97 ]
98 weightsVector = MathUtils.vectorPad(
99 weightsVector,
100 Architectures.get_pad_size(self.d["ARCHITECTURE"], len(weightsVector)),
101 )
102 self.d["weights2"] = weightsVector
103 self.d["w2Size"] = len(self.d["weights2"])
104 self.d["w2_seq"] = range(self.d["w2Size"])
105
106 # all combination of three weights, written as an 1D array
107 weightsVector = [
108 QuadratureWeights[i] * QuadratureWeights[j] * QuadratureWeights[k]
109 for i in range(self.d["NUMBER_OF_DOF"])
110 for j in range(self.d["NUMBER_OF_DOF"])
111 for k in range(self.d["NUMBER_OF_DOF"])
112 ]
113 weightsVector = MathUtils.vectorPad(
114 weightsVector,
115 Architectures.get_pad_size(self.d["ARCHITECTURE"], len(weightsVector)),
116 )
117 self.d["weights3"] = weightsVector
118 self.d["w3Size"] = len(self.d["weights3"])
119 self.d["w3_seq"] = range(self.d["w3Size"])
120
121 # all combination of four weights, written as an 1D array
122 weightsVector = [
123 QuadratureWeights[i]
124 * QuadratureWeights[j]
125 * QuadratureWeights[k]
126 * QuadratureWeights[l]
127 for i in range(self.d["NUMBER_OF_DOF"])
128 for j in range(self.d["NUMBER_OF_DOF"])
129 for k in range(self.d["NUMBER_OF_DOF"])
130 for l in range(self.d["NUMBER_OF_DOF"])
131 ]
132 weightsVector = MathUtils.vectorPad(
133 weightsVector,
134 Architectures.get_pad_size(self.d["ARCHITECTURE"], len(weightsVector)),
135 )
136 self.d["weights4"] = weightsVector
137 self.d["w4Size"] = len(self.d["weights4"])
138 self.d["w4_seq"] = range(self.d["w4Size"])
139
140 # inverse of weight3
141 self.d["iweights3"] = [
142 1.0 / self.d["weights3"][i] if self.d["weights3"][i] != 0.0 else 0.0
143 for i in self.d["w3_seq"]
144 ]
145
146 self.d["QuadratureWeights"], self.d["QuadratureNodes"] = (
147 QuadratureWeights,
148 QuadratureNodes,
149 )
150 self.d["quadrature_seq"] = range(self.d["NUMBER_OF_DOF"])
151
153 headfile_template=template_prefix + "Quadrature.template.h",
154 cppfile_template=template_prefix + "Quadrature.template.cpp",
155 classname=output_path + "/Quadrature",
156 namespace=namespace,
157 subdirectory=subdirectory + ".",
158 dictionary=self.d,
159 default_overwrite=True,
160 apply_iteratively=True,
161 )
162 output.add(generated_kernels)
163 output.makefile.add_h_file(output_path + "/Quadrature.h", generated=True)
164 output.makefile.add_cpp_file(output_path + "/Quadrature.cpp", generated=True)
generate_kernels(self, namespace, output, subdirectory, template_prefix, output_path)
Definition Quadrature.py:17