GCC Code Coverage Report


Directory: ./
File: Solver/bdf.cpp
Date: 2024-04-14 07:32:34
Exec Total Coverage
Lines: 142 397 35.8%
Branches: 36 138 26.1%

Line Branch Exec Source
1 // ______ ______ _ _ _____ ______
2 // | ____| ____| | (_)/ ____| | ____|
3 // | |__ | |__ | | _| (___ ___| |__
4 // | __| | __| | | | |\___ \ / __| __|
5 // | | | |____| |____| |____) | (__| |____
6 // |_| |______|______|_|_____/ \___|______|
7 // Finite Elements for Life Sciences and Engineering
8 //
9 // License: LGL2.1 License
10 // FELiScE default license: LICENSE in root folder
11 //
12 // Main authors:
13 //
14
15 // System includes
16
17 // External includes
18
19 // Project includes
20 #include "Solver/bdf.hpp"
21
22 namespace felisce {
23 102 Bdf::Bdf():
24 102 m_order(0),
25 102 m_numberOfComp(1),
26 102 m_size(0),
27 102 m_build_order_2(false),
28 102 m_build_order_3(false),
29 102 m_build_RHS(false) {
30
31 102 }
32
33 102 Bdf::~Bdf() {
34 102 m_alpha.clear();
35 102 m_beta.clear();
36
2/2
✓ Branch 0 taken 102 times.
✓ Branch 1 taken 102 times.
204 for (felInt i=0 ; i< m_numberOfComp; i++) {
37
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 90 times.
102 if (m_build_order_2)
38 12 m_sol_n_1[i].destroy();
39
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 102 times.
102 if (m_build_order_3)
40 m_sol_n_2[i].destroy();
41
2/2
✓ Branch 0 taken 98 times.
✓ Branch 1 taken 4 times.
102 if (m_build_RHS) {
42 98 m_sol_n[i].destroy();
43 98 m_rhs[i].destroy();
44 }
45 }
46 102 }
47
48 116 void Bdf::defineOrder(int n, int nComp) {
49 116 m_order = n;
50 116 m_numberOfComp=nComp;
51 116 m_alpha.resize(n+1);
52 116 m_beta.resize(n);
53 116 m_sol_n.resize(nComp);
54 116 m_sol_n_1.resize(nComp);
55 116 m_sol_n_2.resize(nComp);
56 116 m_rhs.resize(nComp);
57 116 m_solExtrapol.resize(nComp);
58
59
2/4
✓ Branch 0 taken 116 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 116 times.
116 if ( n <= 0 || n > BDF_MAX_ORDER ) {
60 FEL_ERROR(" We support BDF order from 1 to 3 \n");
61 }
62
63
2/4
✓ Branch 0 taken 108 times.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
116 switch (n) {
64 108 case 1:
65 108 m_alpha[0] = 1.0; // Backward Euler
66 108 m_alpha[1] = 1.0;
67 108 m_beta[0] = 1.0;// u^{n+1} \approx u^n
68 108 break;
69 8 case 2:
70 8 m_alpha[0] = 3.0 / 2.0;
71 8 m_alpha[1] = 2.0;
72 8 m_alpha[2] = -1.0 / 2.0;
73 8 m_beta[0] = 2.0;
74 8 m_beta[1] = -1.0;
75 8 break;
76 case 3:
77 m_alpha[0] = 11.0 / 6.0;
78 m_alpha[1] = 3.0;
79 m_alpha[2] = -3.0 / 2.0;
80 m_alpha[3] = 1.0 / 3.0;
81 m_beta[0] = 3.0;
82 m_beta[1] = -3.0;
83 m_beta[2] = 1.0;
84 break;
85 }
86 116 }
87
88
89 94 void Bdf::initialize(const PetscVector& sol_0) {
90
2/4
✓ Branch 0 taken 86 times.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
94 switch (m_order) {
91 86 case 1:
92 //!Get size.
93 86 sol_0.getSize(&m_size);
94 86 m_sol_n[0].duplicateFrom(sol_0);
95 //!Copy because you want to keep sol_0.
96 86 m_sol_n[0].copyFrom(sol_0);
97
98 86 m_rhs[0].duplicateFrom(sol_0);
99 86 m_build_RHS = true;
100 86 break;
101 8 case 2:
102 8 sol_0.getSize(&m_size);
103 8 m_sol_n[0].duplicateFrom(sol_0);
104 8 m_sol_n[0].copyFrom(sol_0);
105
106 8 m_sol_n_1[0].duplicateFrom(sol_0);
107 8 m_sol_n_1[0].copyFrom(sol_0);
108 8 m_build_order_2 = true;
109
110 8 m_rhs[0].duplicateFrom(sol_0);
111 8 m_build_RHS = true;
112 8 break;
113 case 3:
114 sol_0.getSize(&m_size);
115 m_sol_n[0].duplicateFrom(sol_0);
116 m_sol_n[0].copyFrom(sol_0);
117
118 m_sol_n_1[0].duplicateFrom(sol_0);
119 m_sol_n_1[0].copyFrom(sol_0);
120 m_build_order_2 = true;
121
122 m_sol_n_2[0].duplicateFrom(sol_0);
123 m_sol_n_2[0].copyFrom(sol_0);
124 m_build_order_3 = true;
125
126 m_rhs[0].duplicateFrom(sol_0);
127 m_build_RHS = true;
128 break;
129 default:
130 FEL_ERROR("unknown BDF order");
131 break;
132 }
133 94 }
134
135 void Bdf::initialize(std::vector<PetscVector>& sol_0) {
136 switch (m_order) {
137 case 1:
138 for (felInt i=0 ; i< m_numberOfComp; i++) {
139 //!Get size.
140 sol_0[i].getSize(&m_size);
141 m_sol_n[i].duplicateFrom(sol_0[i]);
142 //!Copy because you want to keep sol_0.
143 m_sol_n[i].copyFrom(sol_0[i]);
144
145 m_rhs[i].duplicateFrom(sol_0[i]);
146 }
147 m_build_RHS = true;
148 break;
149 case 2:
150 for (felInt i=0 ; i< m_numberOfComp; i++) {
151 sol_0[i].getSize(&m_size);
152 m_sol_n[i].duplicateFrom(sol_0[i]);
153 m_sol_n[i].copyFrom(sol_0[i]);
154
155 m_sol_n_1[i].duplicateFrom(sol_0[i]);
156 m_sol_n_1[i].copyFrom(sol_0[i]);
157 }
158 m_build_order_2 = true;
159 for (felInt i=0 ; i< m_numberOfComp; i++) {
160 m_rhs[i].duplicateFrom(sol_0[i]);
161 }
162 m_build_RHS = true;
163 break;
164 case 3:
165 for (felInt i=0 ; i< m_numberOfComp; i++) {
166 sol_0[i].getSize(&m_size);
167 m_sol_n[i].duplicateFrom(sol_0[i]);
168 m_sol_n[i].copyFrom(sol_0[i]);
169
170 m_sol_n_1[i].duplicateFrom(sol_0[i]);
171 m_sol_n_1[i].copyFrom(sol_0[i]);
172 }
173 m_build_order_2 = true;
174 for (felInt i=0 ; i< m_numberOfComp; i++) {
175 m_sol_n_2[i].duplicateFrom(sol_0[i]);
176 m_sol_n_2[i].copyFrom(sol_0[i]);
177 }
178 m_build_order_3 = true;
179 for (felInt i=0 ; i< m_numberOfComp; i++) {
180 m_rhs[i].duplicateFrom(sol_0[i]);
181 }
182 m_build_RHS = true;
183 break;
184 default:
185 FEL_ERROR("unknown BDF order");
186 break;
187 }
188 }
189
190
191 20 void Bdf::initialize(const PetscVector& sol_0, const PetscVector& sol_1) {
192 20 sol_0.getSize(&m_size);
193
194 20 m_sol_n[0].duplicateFrom(sol_1);
195 //VecSwap(m_sol_n,sol_1);
196 20 m_sol_n[0].copyFrom(sol_1);
197
198 20 m_sol_n_1[0].duplicateFrom(sol_0);
199 //VecSwap(m_sol_n_1,sol_0);
200 20 m_sol_n_1[0].copyFrom(sol_0);
201
202 20 m_build_order_2 = true;
203
204 20 m_rhs[0].duplicateFrom(sol_0);
205 20 m_build_RHS = true;
206 20 }
207
208
209 void Bdf::initialize(std::vector<PetscVector>& sol_0, std::vector<PetscVector>& sol_1) {
210
211 for (felInt i=0 ; i< m_numberOfComp; i++) {
212 sol_0[i].getSize(&m_size);
213
214 m_sol_n[i].duplicateFrom(sol_1[i]);
215 m_sol_n[i].copyFrom(sol_1[i]);
216
217 m_sol_n_1[i].duplicateFrom(sol_0[i]);
218 m_sol_n_1[i].copyFrom(sol_0[i]);
219 }
220 m_build_order_2 = true;
221 for (felInt i=0 ; i< m_numberOfComp; i++) {
222 m_rhs[i].duplicateFrom(sol_0[i]);
223 }
224 m_build_RHS = true;
225 }
226
227 void Bdf::initialize(const PetscVector& sol_0, const PetscVector& sol_1, const PetscVector& sol_2) {
228
229 sol_0.getSize(&m_size);
230
231 m_sol_n[0].duplicateFrom(sol_2);
232 //VecSwap(m_sol_n,sol_2);
233 m_sol_n[0].copyFrom(sol_2);
234
235 m_sol_n_1[0].duplicateFrom(sol_1);
236 //VecSwap(m_sol_n_1,sol_1);
237 m_sol_n_1[0].copyFrom(sol_1);
238
239 m_sol_n_2[0].duplicateFrom(sol_0);
240 //VecSwap(m_sol_n_2,sol_0);
241 m_sol_n_2[0].copyFrom(sol_0);
242
243 m_build_order_3 = true;
244
245 m_rhs[0].duplicateFrom(sol_0);
246 m_build_RHS = true;
247 }
248
249 void Bdf::initialize(std::vector<PetscVector>& sol_0, std::vector<PetscVector>& sol_1, std::vector<PetscVector>& sol_2) {
250
251 for (felInt i=0 ; i< m_numberOfComp; i++) {
252 sol_0[i].getSize(&m_size);
253
254 m_sol_n[i].duplicateFrom(sol_2[i]);
255 //VecSwap(m_sol_n,sol_2);
256 m_sol_n[i].copyFrom(sol_2[i]);
257
258 m_sol_n_1[i].duplicateFrom(sol_1[i]);
259 //VecSwap(m_sol_n_1,sol_1);
260 m_sol_n_1[i].copyFrom(sol_1[i]);
261
262 m_sol_n_2[i].duplicateFrom(sol_0[i]);
263 //VecSwap(m_sol_n_2,sol_0);
264 m_sol_n_2[i].copyFrom(sol_0[i]);
265 }
266 m_build_order_3 = true;
267 for (felInt i=0 ; i< m_numberOfComp; i++) {
268 m_rhs[i].duplicateFrom(sol_0[i]);
269 }
270 m_build_RHS = true;
271 }
272
273 18 void Bdf::reinitialize(int order, const PetscVector& sol0, const PetscVector& sol1, const PetscVector& sol2) {
274 // destroy everything
275 18 m_alpha.clear();
276 18 m_beta.clear();
277
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 2 times.
18 if (m_build_order_2)
278 16 m_sol_n_1[0].destroy();
279
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 if (m_build_order_3)
280 m_sol_n_2[0].destroy();
281
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 2 times.
18 if (m_build_RHS) {
282 16 m_sol_n[0].destroy();
283 16 m_rhs[0].destroy();
284 }
285
286 18 m_build_order_2 = false;
287 18 m_build_order_3 = false;
288 18 m_build_RHS = false;
289
290 // reallocate everything
291 18 defineOrder(order);
292
293
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
18 if(sol2.isNotNull())
294 initialize(sol0, sol1, sol2);
295
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 else if(sol1.isNotNull())
296 18 initialize(sol0, sol1);
297 else
298 initialize(sol0);
299 18 }
300
301 2129 void Bdf::update(PetscVector& new_sol_n) {
302 /*switch (m_order) {
303 case 1:
304 sol_n[0].copyFrom(new_sol_n);
305 break;
306 case 2:
307 sol_n_1[0].copyFrom(m_sol_n[0]);
308 sol_n[0].copyFrom(new_sol_n);
309 break;
310 case 3:
311 sol_n_2[0].copyFrom(m_sol_n_1[0]);
312 sol_n_1[0].copyFrom(m_sol_n[0]);
313 sol_n[0].copyFrom(new_sol_n);
314 break;
315 default:
316 FEL_ERROR("BDF not yet implemented for order grater than 3.");
317 break;
318 }*/
319
320 // use m_build_order instead of m_order in case someone wants to initialize the bdf with more time step
321
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2129 times.
2129 if(m_build_order_3) {
322 m_sol_n_2[0].copyFrom(m_sol_n_1[0]);
323 m_sol_n_1[0].copyFrom(m_sol_n[0]);
324 m_sol_n[0].copyFrom(new_sol_n);
325
2/2
✓ Branch 0 taken 127 times.
✓ Branch 1 taken 2002 times.
2129 } else if(m_build_order_2) {
326 127 m_sol_n_1[0].copyFrom(m_sol_n[0]);
327 127 m_sol_n[0].copyFrom(new_sol_n);
328
1/2
✓ Branch 0 taken 2002 times.
✗ Branch 1 not taken.
2002 } else if(m_build_RHS) {
329 2002 m_sol_n[0].copyFrom(new_sol_n);
330 } else {
331 FEL_ERROR("BDF not yet implemented for order grater than 3.");
332 }
333 2129 }
334
335 void Bdf::update(std::vector<PetscVector>& new_sol_n) {
336 /*switch (m_order) {
337 case 1:
338 for (felInt i=0 ; i< m_numberOfComp; i++) {
339 m_sol_n[i].copyFrom(new_sol_n[i]);
340 }
341 break;
342 case 2:
343 for (felInt i=0 ; i< m_numberOfComp; i++) {
344 m_sol_n_1[i].copyFrom(m_sol_n[i]);
345 m_sol_n[i].copyFrom(new_sol_n[i]);
346 }
347 break;
348 case 3:
349 for (felInt i=0 ; i< m_numberOfComp; i++) {
350 m_sol_n_2[i].copyFrom(m_sol_n_1[i]);
351 m_sol_n_1[i].copyFrom(m_sol_n[i]);
352 m_sol_n[i].copyFrom(new_sol_n[i]);
353 }
354 break;
355 default:
356 FEL_ERROR("BDF not yet implemented for order grater than 3.");
357 break;
358 }*/
359
360 // use m_build_order instead of m_order in case someone wants to initialize the bdf with more time step
361 if(m_build_order_3) {
362 for (felInt i=0 ; i< m_numberOfComp; i++) {
363 m_sol_n_2[i].copyFrom(m_sol_n_1[i]);
364 m_sol_n_1[i].copyFrom(m_sol_n[i]);
365 m_sol_n[i].copyFrom(new_sol_n[i]);
366 }
367 } else if(m_build_order_2) {
368 for (felInt i=0 ; i< m_numberOfComp; i++) {
369 m_sol_n_1[i].copyFrom(m_sol_n[i]);
370 m_sol_n[i].copyFrom(new_sol_n[i]);
371 }
372 } else if(m_build_RHS) {
373 for (felInt i=0 ; i< m_numberOfComp; i++) {
374 m_sol_n[i].copyFrom(new_sol_n[i]);
375 }
376 } else {
377 FEL_ERROR("BDF not yet implemented for order grater than 3.");
378 }
379 }
380
381
382 2248 void Bdf::computeRHSTime(double dt, PetscVector& RHSTime) {
383 2248 RHSTime.zeroEntries();
384
2/4
✓ Branch 0 taken 2128 times.
✓ Branch 1 taken 120 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2248 switch (m_order) {
385 2128 case 1:
386 //RHSTime = m_alpha[0](1)*m_sol_n
387 2128 RHSTime.axpy(m_alpha[1]/dt,m_sol_n[0]);
388 2128 break;
389 120 case 2:
390 //RHSTime = m_alpha[0](1)*m_sol_n
391 120 RHSTime.axpy(m_alpha[1]/dt,m_sol_n[0]);
392 //RHSTime = m_alpha[0](1)*m_sol_n + m_alpha[0](2)*m_sol_n_1
393 120 RHSTime.axpy(m_alpha[2]/dt,m_sol_n_1[0]);
394 120 break;
395 case 3:
396 RHSTime.axpy(m_alpha[1]/dt,m_sol_n[0]);
397 RHSTime.axpy(m_alpha[2]/dt,m_sol_n_1[0]);
398 RHSTime.axpy(m_alpha[3]/dt,m_sol_n_2[0]);
399 break;
400 default:
401 FEL_ERROR("BDF not yet implemented for order grater than 3.");
402 break;
403 }
404 2248 }
405
406 void Bdf::computeRHSTime(double dt, std::vector<PetscVector>& RHSTime) {
407 for (felInt i=0 ; i< m_numberOfComp; i++)
408 RHSTime[i].zeroEntries();
409 switch (m_order) {
410 case 1:
411 //RHSTime = m_alpha[0](1)*m_sol_n
412 for (felInt i=0 ; i< m_numberOfComp; i++)
413 RHSTime[i].axpy(m_alpha[1]/dt,m_sol_n[i]);
414 break;
415 case 2:
416 for (felInt i=0 ; i< m_numberOfComp; i++) {
417 //RHSTime = m_alpha[0](1)*m_sol_n
418 RHSTime[i].axpy(m_alpha[1]/dt,m_sol_n[i]);
419 //RHSTime = m_alpha[0](1)*m_sol_n + m_alpha[0](2)*m_sol_n_1
420 RHSTime[i].axpy(m_alpha[2]/dt,m_sol_n_1[i]);
421 }
422 break;
423 case 3:
424 for (felInt i=0 ; i< m_numberOfComp; i++) {
425 RHSTime[i].axpy(m_alpha[1]/dt,m_sol_n[i]);
426 RHSTime[i].axpy(m_alpha[2]/dt,m_sol_n_1[i]);
427 RHSTime[i].axpy(m_alpha[3]/dt,m_sol_n_2[i]);
428 }
429 break;
430 default:
431 FEL_ERROR("BDF not yet implemented for order grater than 3.");
432 break;
433 }
434 }
435
436 20 void Bdf::computeRHSTimeByPart(double dt, std::vector<PetscVector>& RHSTimeByPart) {
437
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 20 times.
20 if(m_order != static_cast<felInt>(RHSTimeByPart.size()))
438 FEL_ERROR("The bdf order and the size of the rhs part std::vector are not the same");
439
440
2/2
✓ Branch 1 taken 20 times.
✓ Branch 2 taken 20 times.
40 for(std::size_t i=0; i<RHSTimeByPart.size(); ++i)
441 20 RHSTimeByPart[i].zeroEntries();
442
443
1/4
✓ Branch 0 taken 20 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
20 switch (m_order) {
444 20 case 1:
445 // RHSTime[0] = m_alpha[0](1)*m_sol_n
446 20 RHSTimeByPart[0].axpy(m_alpha[1]/dt, m_sol_n[0]);
447 20 break;
448
449 case 2:
450 // RHSTime[0] = m_alpha[0](1)*m_sol_n
451 RHSTimeByPart[0].axpy(m_alpha[1]/dt, m_sol_n[0]);
452
453 //RHSTime[1] = m_alpha[0](2)*m_sol_n_1
454 RHSTimeByPart[1].axpy(m_alpha[2]/dt, m_sol_n_1[0]);
455 break;
456
457 case 3:
458 RHSTimeByPart[0].axpy(m_alpha[1]/dt, m_sol_n[0]);
459 RHSTimeByPart[1].axpy(m_alpha[2]/dt, m_sol_n_1[0]);
460 RHSTimeByPart[2].axpy(m_alpha[3]/dt, m_sol_n_2[0]);
461 break;
462
463 default:
464 FEL_ERROR("BDF not yet implemented for order grater than 3.");
465 break;
466 }
467 20 }
468
469
470 2248 void Bdf::computeRHSTime(double dt) {
471 2248 computeRHSTime(dt,m_rhs[0]);
472 2248 }
473
474 // Evaluates extrapolation
475 2068 void Bdf::extrapolate( PetscVector& extrap) {
476 2068 extrap.zeroEntries();
477
2/4
✓ Branch 0 taken 1948 times.
✓ Branch 1 taken 120 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2068 switch (m_order) {
478 1948 case 1:
479 1948 extrap.axpy(m_beta[0],m_sol_n[0]);
480 1948 break;
481 120 case 2:
482 120 extrap.axpy(m_beta[0],m_sol_n[0]);
483 120 extrap.axpy(m_beta[1],m_sol_n_1[0]);
484 120 break;
485 case 3:
486 extrap.axpy(m_beta[0],m_sol_n[0]);
487 extrap.axpy(m_beta[1],m_sol_n_1[0]);
488 extrap.axpy(m_beta[2],m_sol_n_2[0]);
489 break;
490 default:
491 FEL_ERROR("unknown BDF order");
492 break;
493 }
494 2068 }
495
496 void Bdf::extrapolate( std::vector<PetscVector>& extrap) {
497 for (felInt i=0 ; i< m_numberOfComp; i++)
498 extrap[i].zeroEntries();
499 switch (m_order) {
500 case 1:
501 for (felInt i=0 ; i< m_numberOfComp; i++)
502 extrap[i].axpy(m_beta[0],m_sol_n[i]);
503 break;
504 case 2:
505 for (felInt i=0 ; i< m_numberOfComp; i++) {
506 extrap[i].axpy(m_beta[0],m_sol_n[i]);
507 extrap[i].axpy(m_beta[1],m_sol_n_1[i]);
508 }
509 break;
510 case 3:
511 for (felInt i=0 ; i< m_numberOfComp; i++) {
512 extrap[i].axpy(m_beta[0],m_sol_n[i]);
513 extrap[i].axpy(m_beta[1],m_sol_n_1[i]);
514 extrap[i].axpy(m_beta[2],m_sol_n_2[i]);
515 }
516 break;
517 default:
518 FEL_ERROR("unknown BDF order");
519 break;
520 }
521 }
522
523 20 void Bdf::extrapolateByPart(std::vector<PetscVector>& partExtrap) {
524
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 20 times.
20 if(m_order != static_cast<felInt>(partExtrap.size()))
525 FEL_ERROR("The bdf order and the size of the extrapolation part std::vector are not the same");
526
527
2/2
✓ Branch 1 taken 20 times.
✓ Branch 2 taken 20 times.
40 for(std::size_t i=0; i<partExtrap.size(); i++)
528 20 partExtrap[i].zeroEntries();
529
530
1/4
✓ Branch 0 taken 20 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
20 switch (m_order) {
531 20 case 1:
532 20 partExtrap[0].axpy(m_beta[0], m_sol_n[0]);
533 20 break;
534 case 2:
535 partExtrap[0].axpy(m_beta[0], m_sol_n[0]);
536 partExtrap[1].axpy(m_beta[1], m_sol_n_1[0]);
537 break;
538 case 3:
539 partExtrap[0].axpy(m_beta[0], m_sol_n[0]);
540 partExtrap[1].axpy(m_beta[1], m_sol_n_1[0]);
541 partExtrap[2].axpy(m_beta[2], m_sol_n_2[0]);
542 break;
543 default:
544 FEL_ERROR("unknown BDF order");
545 break;
546 }
547 20 }
548
549 // evaluates time derivative std::vector a posteriori; to call before update
550 void Bdf::time_der( double dt, const PetscVector& m_vecSol, PetscVector& deriv ) const {
551 deriv.zeroEntries();
552 deriv.axpy(m_alpha[0],m_vecSol);
553
554 switch (m_order) {
555 case 1:
556 deriv.axpy(-1.0*m_alpha[1],m_sol_n[0]);
557 break;
558 case 2:
559 deriv.axpy(-1.0*m_alpha[1],m_sol_n[0]);
560 deriv.axpy(-1.0*m_alpha[2],m_sol_n_1[0]);
561 break;
562 case 3:
563 deriv.axpy(-1.0*m_alpha[1],m_sol_n[0]);
564 deriv.axpy(-1.0*m_alpha[2],m_sol_n_1[0]);
565 deriv.axpy(-1.0*m_alpha[3],m_sol_n_2[0]);
566 break;
567 default:
568 FEL_ERROR("unknown BDF order");
569 break;
570 }
571 deriv.scale(1./dt);
572 }
573
574 void Bdf::time_der( double dt, const std::vector<PetscVector>& m_vecSol, std::vector<PetscVector>& deriv ) const {
575 for (felInt i=0 ; i< m_numberOfComp; i++) {
576 deriv[i].zeroEntries();
577 deriv[i].axpy(m_alpha[0],m_vecSol[i]);
578 }
579 switch (m_order) {
580 case 1:
581 for (felInt i=0 ; i< m_numberOfComp; i++)
582 deriv[i].axpy(-1.0*m_alpha[1],m_sol_n[i]);
583 break;
584 case 2:
585 for (felInt i=0 ; i< m_numberOfComp; i++) {
586 deriv[i].axpy(-1.0*m_alpha[1],m_sol_n[i]);
587 deriv[i].axpy(-1.0*m_alpha[2],m_sol_n_1[i]);
588 }
589 break;
590 case 3:
591 for (felInt i=0 ; i< m_numberOfComp; i++) {
592 deriv[i].axpy(-1.0*m_alpha[1],m_sol_n[i]);
593 deriv[i].axpy(-1.0*m_alpha[2],m_sol_n_1[i]);
594 deriv[i].axpy(-1.0*m_alpha[3],m_sol_n_2[i]);
595 }
596 break;
597 default:
598 FEL_ERROR("unknown BDF order");
599 break;
600 }
601 for (felInt i=0 ; i< m_numberOfComp; i++)
602 deriv[i].scale(1./dt);
603 }
604 }
605
606