102 {
103 constexpr size_t nStages[6] = {0, 1, 2, 3, 4, 6};
104
105
106
107
108
109
110
111
112
113
114
115 constexpr NekDouble Acoefficients[2][6][15] =
116 { { { 0., 0., 0., 0., 0.,
117 0., 0., 0., 0., 0.,
118 0., 0., 0., 0., 0. },
119
120 { 0., 0., 0., 0., 0.,
121 0., 0., 0., 0., 0.,
122 0., 0., 0., 0., 0. },
123
124 { 1./2,
125 0., 0., 0., 0.,
126 0., 0., 0., 0., 0.,
127 0., 0., 0., 0., 0. },
128
129 { 1./2.,
130 0., 3./4.,
131 0., 0.,
132 0., 0., 0., 0., 0.,
133 0., 0., 0., 0., 0. },
134
135 { 1./2.,
136 0., 1./2.,
137 0., 0., 1.,
138 0., 0., 0., 0.,
139 0., 0., 0., 0., 0. },
140
141
142
143
144
145 { 1./4.,
146 1./8., 1./8.,
147 0., -1./2., 1.,
148 3./16., 0., 0., 9./16.,
149 -3./7., 2./7., 12./7., -12./7., 8./7. } },
150
151 { { 0., 0., 0., 0., 0.,
152 0., 0., 0., 0., 0.,
153 0., 0., 0., 0., 0. },
154
155 { 0., 0., 0., 0., 0.,
156 0., 0., 0., 0., 0.,
157 0., 0., 0., 0., 0. },
158
159 { 1.,
160 0., 0., 0., 0.,
161 0., 0., 0., 0., 0.,
162 0., 0., 0., 0., 0. },
163
164 { 1.,
165 1./4., 1./4.,
166 0, 0.,
167 0., 0., 0., 0., 0.,
168 0., 0., 0., 0., 0. },
169
170 { 1./2.,
171 0., 1./2.,
172 0., 0., 1.,
173 0., 0., 0., 0.,
174 0., 0., 0., 0., 0. },
175
176
177
178
179
180 { 1./4.,
181 1./8., 1./8.,
182 0., -1./2., 1.,
183 3./16., 0., 0., 9./16.,
184 -3./7., 2./7., 12./7., -12./7., 8./7. } } };
185
186
187
188
189
190 constexpr NekDouble Bcoefficients[2][6][6] =
191 { { { 0., 0., 0., 0., 0., 0. },
192
193 { 1., 0., 0., 0., 0., 0. },
194
195 { 0., 1., 0., 0., 0., 0. },
196
197 { 2./9., 3./9., 4./9., 0., 0., 0. },
198
199 { 1./6., 2./6., 2./6., 1./6., 0., 0. },
200
201
202
203
204
205 { 7./90., 0., 32./90., 12./90., 32./90., 7./90.} },
206
207 { { 0., 0., 0., 0., 0., 0. },
208
209 { 1., 0., 0., 0., 0., 0. },
210
211 { 1./2., 1./2., 0., 0., 0., 0. },
212
213 { 1./6., 1./6., 4./6., 0., 0., 0. },
214
215 { 1./6., 2./6., 2./6., 1./6., 0., 0. },
216
217
218
219
220
221 { 7./90., 0., 32./90., 12./90., 32./90., 7./90. } } };
222
223
224 size_t index = (variant == "SSP" || variant == "ImprovedEuler");
225
227 phase->m_variant = variant;
228 phase->m_order = order;
229 phase->m_name = std::string("RungeKutta") + phase->m_variant +
230 std::string("Order") + std::to_string(phase->m_order);
231
232 phase->m_numsteps = 1;
233 phase->m_numstages = nStages[phase->m_order];
234
235 phase->m_A = Array<OneD, Array<TwoD, NekDouble>>(1);
236 phase->m_B = Array<OneD, Array<TwoD, NekDouble>>(1);
237
238 phase->m_A[0] =
239 Array<TwoD, NekDouble>(phase->m_numstages, phase->m_numstages, 0.0);
240 phase->m_B[0] =
241 Array<TwoD, NekDouble>(phase->m_numsteps, phase->m_numstages, 0.0);
242 phase->m_U =
243 Array<TwoD, NekDouble>(phase->m_numstages, phase->m_numsteps, 1.0);
244 phase->m_V =
245 Array<TwoD, NekDouble>(phase->m_numsteps, phase->m_numsteps, 1.0);
246
247
248
249
250 size_t cc = 0;
251
252 for (size_t s = 1; s < phase->m_numstages; ++s)
253 {
254 for (size_t i = 0; i < s; ++i)
255 {
256 phase->m_A[0][s][i] =
257 Acoefficients[index][phase->m_order][cc++];
258 }
259 }
260
261
262 for (size_t n = 0; n < phase->m_numstages; ++n)
263 {
264 phase->m_B[0][0][n] = Bcoefficients[index][phase->m_order][n];
265 }
266
267 phase->m_numMultiStepValues = 1;
268 phase->m_numMultiStepImplicitDerivs = 0;
269 phase->m_numMultiStepExplicitDerivs = 0;
270 phase->m_timeLevelOffset = Array<OneD, size_t>(phase->m_numsteps);
271 phase->m_timeLevelOffset[0] = 0;
272
273 phase->CheckAndVerify();
274 }
@ eExplicit
Formally explicit scheme.