Nektar++
Loading...
Searching...
No Matches
TestSegCollection.cpp
Go to the documentation of this file.
1///////////////////////////////////////////////////////////////////////////////
2//
3// File: TestSegCollection.cpp
4//
5// For more information, please see: http://www.nektar.info
6//
7// The MIT License
8//
9// Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA),
10// Department of Aeronautics, Imperial College London (UK), and Scientific
11// Computing and Imaging Institute, University of Utah (USA).
12//
13// Permission is hereby granted, free of charge, to any person obtaining a
14// copy of this software and associated documentation files (the "Software"),
15// to deal in the Software without restriction, including without limitation
16// the rights to use, copy, modify, merge, publish, distribute, sublicense,
17// and/or sell copies of the Software, and to permit persons to whom the
18// Software is furnished to do so, subject to the following conditions:
19//
20// The above copyright notice and this permission notice shall be included
21// in all copies or substantial portions of the Software.
22//
23// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
24// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
26// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
29// DEALINGS IN THE SOFTWARE.
30//
31// Description:
32//
33///////////////////////////////////////////////////////////////////////////////
34
37#include <LocalRegions/SegExp.h>
39#include <boost/test/tools/floating_point_comparison.hpp>
40#include <boost/test/unit_test.hpp>
41
43{
47 int coordim = 1)
48{
49 std::array<SpatialDomains::PointGeom *, 2> vertices = {v0, v1};
51 new SpatialDomains::SegGeom(id, coordim, vertices));
52 return result;
53}
54
55BOOST_AUTO_TEST_CASE(TestSegBwdTrans_StdMat_UniformP)
56{
58 new SpatialDomains::PointGeom(1u, 0u, -1.0, 0.0, 0.0));
60 new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0));
61
63 CreateSegGeom(0, v0.get(), v1.get());
64
65 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
69 unsigned int numSegPoints = 6;
70 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(numSegPoints,
71 segPointsTypeDir1);
72 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
73 segPointsKeyDir1);
74
77 basisKeyDir1, segGeom.get());
78
79 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
80 CollExp.push_back(Exp);
81
83 Collections::CollectionOptimisation colOpt(dummySession, 1,
86 Collections::Collection c(CollExp, impTypes);
88
89 Array<OneD, NekDouble> coeffs(Exp->GetNcoeffs(), 1.0), tmp;
90 for (int i = 0; i < coeffs.size(); ++i)
91 {
92 coeffs[i] = i + 1;
93 }
94 Array<OneD, NekDouble> phys1(Exp->GetTotPoints());
95 Array<OneD, NekDouble> phys2(Exp->GetTotPoints());
96
97 Exp->BwdTrans(coeffs, phys1);
98 c.ApplyOperator(Collections::eBwdTrans, coeffs, phys2);
99
100 double epsilon = 1.0e-8;
101 for (int i = 0; i < phys1.size(); ++i)
102 {
103 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
104 }
105}
106
107BOOST_AUTO_TEST_CASE(TestSegBwdTrans_StdMat_UniformP_MultiElmt)
108{
110 new SpatialDomains::PointGeom(1u, 0u, -1.0, 0.0, 0.0));
112 new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0));
113
115 CreateSegGeom(0, v0.get(), v1.get());
116
117 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
119 Nektar::LibUtilities::BasisType basisTypeDir1 =
121 unsigned int numSegPoints = 6;
122 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(numSegPoints,
123 segPointsTypeDir1);
124 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
125 segPointsKeyDir1);
126
129 basisKeyDir1, segGeom.get());
130
131 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
132
133 int nelmts = 10;
134 for (int i = 0; i < nelmts; ++i)
135 {
136 CollExp.push_back(Exp);
137 }
138
140 Collections::CollectionOptimisation colOpt(dummySession, 1,
142 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
143 Collections::Collection c(CollExp, impTypes);
145
146 Array<OneD, NekDouble> coeffs(nelmts * Exp->GetNcoeffs(), 1.0), tmp;
147 for (int i = 0; i < coeffs.size(); ++i)
148 {
149 coeffs[i] = i + 1;
150 }
151 Array<OneD, NekDouble> phys1(nelmts * Exp->GetTotPoints());
152 Array<OneD, NekDouble> phys2(nelmts * Exp->GetTotPoints());
153
154 for (int i = 0; i < nelmts; ++i)
155 {
156 Exp->BwdTrans(coeffs + i * Exp->GetNcoeffs(),
157 tmp = phys1 + i * Exp->GetTotPoints());
158 }
159 c.ApplyOperator(Collections::eBwdTrans, coeffs, phys2);
160
161 double epsilon = 1.0e-8;
162 for (int i = 0; i < phys1.size(); ++i)
163 {
164 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
165 }
166}
167
168BOOST_AUTO_TEST_CASE(TestSegBwdTrans_IterPerExp_UniformP)
169{
171 new SpatialDomains::PointGeom(1u, 0u, -1.0, 0.0, 0.0));
173 new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0));
174
176 CreateSegGeom(0, v0.get(), v1.get());
177
178 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
180 Nektar::LibUtilities::BasisType basisTypeDir1 =
182 unsigned int numSegPoints = 6;
183 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(numSegPoints,
184 segPointsTypeDir1);
185 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
186 segPointsKeyDir1);
187
190 basisKeyDir1, segGeom.get());
191
192 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
193 CollExp.push_back(Exp);
194
196 Collections::CollectionOptimisation colOpt(dummySession, 1,
198 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
199 Collections::Collection c(CollExp, impTypes);
201
202 Array<OneD, NekDouble> coeffs(Exp->GetNcoeffs(), 1.0), tmp;
203 for (int i = 0; i < coeffs.size(); ++i)
204 {
205 coeffs[i] = i + 1;
206 }
207 Array<OneD, NekDouble> phys1(Exp->GetTotPoints());
208 Array<OneD, NekDouble> phys2(Exp->GetTotPoints());
209
210 Exp->BwdTrans(coeffs, phys1);
211 c.ApplyOperator(Collections::eBwdTrans, coeffs, phys2);
212
213 double epsilon = 1.0e-8;
214 for (int i = 0; i < phys1.size(); ++i)
215 {
216 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
217 }
218}
219
220BOOST_AUTO_TEST_CASE(TestSegBwdTrans_SumFac_UniformP)
221{
223 new SpatialDomains::PointGeom(1u, 0u, -1.0, 0.0, 0.0));
225 new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0));
226
228 CreateSegGeom(0, v0.get(), v1.get());
229
230 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
232 Nektar::LibUtilities::BasisType basisTypeDir1 =
234 unsigned int numSegPoints = 6;
235 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(numSegPoints,
236 segPointsTypeDir1);
237 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
238 segPointsKeyDir1);
239
242 basisKeyDir1, segGeom.get());
243
244 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
245
246 int nelmts = 1;
247 for (int i = 0; i < nelmts; ++i)
248 {
249 CollExp.push_back(Exp);
250 }
251
253 Collections::CollectionOptimisation colOpt(dummySession, 1,
255 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
256 Collections::Collection c(CollExp, impTypes);
258
259 Array<OneD, NekDouble> coeffs(nelmts * Exp->GetNcoeffs(), 1.0), tmp;
260 for (int i = 0; i < coeffs.size(); ++i)
261 {
262 coeffs[i] = i + 1;
263 }
264 Array<OneD, NekDouble> phys1(nelmts * Exp->GetTotPoints());
265 Array<OneD, NekDouble> phys2(nelmts * Exp->GetTotPoints());
266
267 for (int i = 0; i < nelmts; ++i)
268 {
269 Exp->BwdTrans(coeffs + i * Exp->GetNcoeffs(),
270 tmp = phys1 + i * Exp->GetTotPoints());
271 }
272 c.ApplyOperator(Collections::eBwdTrans, coeffs, phys2);
273
274 double epsilon = 1.0e-8;
275 for (int i = 0; i < phys1.size(); ++i)
276 {
277 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
278 }
279}
280
281BOOST_AUTO_TEST_CASE(TestSegBwdTrans_SumFac_UniformP_MultiElmt)
282{
284 new SpatialDomains::PointGeom(1u, 0u, -1.0, 0.0, 0.0));
286 new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0));
287
289 CreateSegGeom(0, v0.get(), v1.get());
290
291 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
293 Nektar::LibUtilities::BasisType basisTypeDir1 =
295 unsigned int numSegPoints = 6;
296 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(numSegPoints,
297 segPointsTypeDir1);
298 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
299 segPointsKeyDir1);
300
303 basisKeyDir1, segGeom.get());
304
305 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
306
307 int nelmts = 10;
308 for (int i = 0; i < nelmts; ++i)
309 {
310 CollExp.push_back(Exp);
311 }
312
314 Collections::CollectionOptimisation colOpt(dummySession, 1,
316 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
317 Collections::Collection c(CollExp, impTypes);
319
320 Array<OneD, NekDouble> coeffs(nelmts * Exp->GetNcoeffs(), 1.0), tmp;
321 for (int i = 0; i < coeffs.size(); ++i)
322 {
323 coeffs[i] = i + 1;
324 }
325 Array<OneD, NekDouble> phys1(nelmts * Exp->GetTotPoints());
326 Array<OneD, NekDouble> phys2(nelmts * Exp->GetTotPoints());
327
328 for (int i = 0; i < nelmts; ++i)
329 {
330 Exp->BwdTrans(coeffs + i * Exp->GetNcoeffs(),
331 tmp = phys1 + i * Exp->GetTotPoints());
332 }
333 c.ApplyOperator(Collections::eBwdTrans, coeffs, phys2);
334
335 double epsilon = 1.0e-8;
336 for (int i = 0; i < phys1.size(); ++i)
337 {
338 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
339 }
340}
341
342BOOST_AUTO_TEST_CASE(TestSegBwdTrans_MatrixFree_UniformP_MultiElmt)
343{
345 new SpatialDomains::PointGeom(1u, 0u, -1.0, 0.0, 0.0));
347 new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0));
348
350 CreateSegGeom(0, v0.get(), v1.get());
351
352 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
354 Nektar::LibUtilities::BasisType basisTypeDir1 =
356 unsigned int numSegPoints = 6;
357 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(numSegPoints,
358 segPointsTypeDir1);
359 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
360 segPointsKeyDir1);
361
364 basisKeyDir1, segGeom.get());
365
366 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
367
368 int nelmts = 10;
369 for (int i = 0; i < nelmts; ++i)
370 {
371 CollExp.push_back(Exp);
372 }
373
375 Collections::CollectionOptimisation colOpt(dummySession, 1,
377 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
379 Collections::Collection c(CollExp, impTypes);
381
382 Array<OneD, NekDouble> coeffs(nelmts * Exp->GetNcoeffs(), 1.0), tmp;
383 for (int i = 0; i < coeffs.size(); ++i)
384 {
385 coeffs[i] = i + 1;
386 }
387 Array<OneD, NekDouble> phys1(nelmts * Exp->GetTotPoints());
388 Array<OneD, NekDouble> phys2(nelmts * Exp->GetTotPoints());
389
390 for (int i = 0; i < nelmts; ++i)
391 {
392 Exp->BwdTrans(coeffs + i * Exp->GetNcoeffs(),
393 tmp = phys1 + i * Exp->GetTotPoints());
394 }
395 c.ApplyOperator(Collections::eBwdTrans, coeffs, phys2);
396
397 double epsilon = 1.0e-8;
398 for (int i = 0; i < phys1.size(); ++i)
399 {
400 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
401 }
402}
403
404BOOST_AUTO_TEST_CASE(TestSegIProductWRTBase_IterPerExp_UniformP_MultiElmt)
405{
407 new SpatialDomains::PointGeom(1u, 0u, -1.5, 0.0, 0.0));
409 new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0));
410
412 CreateSegGeom(0, v0.get(), v1.get());
413
414 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
416 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(5,
417 segPointsTypeDir1);
418 Nektar::LibUtilities::BasisType basisTypeDir1 =
420 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
421 segPointsKeyDir1);
422
425 basisKeyDir1, segGeom.get());
426
427 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
428
429 int nelmts = 10;
430 for (int i = 0; i < nelmts; ++i)
431 {
432 CollExp.push_back(Exp);
433 }
434
436 Collections::CollectionOptimisation colOpt(dummySession, 1,
438 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
439 Collections::Collection c(CollExp, impTypes);
441
442 const int nq = Exp->GetTotPoints();
443 const int nc = Exp->GetNcoeffs();
444 Array<OneD, NekDouble> xc(nq), yc(nq);
445 Array<OneD, NekDouble> phys(nelmts * nq), tmp;
446 Array<OneD, NekDouble> coeffs1(nelmts * nc);
447 Array<OneD, NekDouble> coeffs2(nelmts * nc);
448
449 Exp->GetCoords(xc, yc);
450
451 for (int i = 0; i < nq; ++i)
452 {
453 phys[i] = sin(xc[i]);
454 }
455 Exp->IProductWRTBase(phys, coeffs1);
456
457 for (int i = 1; i < nelmts; ++i)
458 {
459 Vmath::Vcopy(nq, phys, 1, tmp = phys + i * nq, 1);
460 Exp->IProductWRTBase(phys + i * nq, tmp = coeffs1 + i * nc);
461 }
463
464 double epsilon = 1.0e-8;
465 for (int i = 0; i < coeffs1.size(); ++i)
466 {
467 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
468 }
469}
470
471BOOST_AUTO_TEST_CASE(TestSegIProductWRTBase_StdMat_UniformP_MultiElmt)
472{
474 new SpatialDomains::PointGeom(1u, 0u, -1.5, 0.0, 0.0));
476 new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0));
477
479 CreateSegGeom(0, v0.get(), v1.get());
480
481 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
483 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(5,
484 segPointsTypeDir1);
485 Nektar::LibUtilities::BasisType basisTypeDir1 =
487 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
488 segPointsKeyDir1);
489
492 basisKeyDir1, segGeom.get());
493
494 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
495
496 int nelmts = 10;
497 for (int i = 0; i < nelmts; ++i)
498 {
499 CollExp.push_back(Exp);
500 }
501
503 Collections::CollectionOptimisation colOpt(dummySession, 1,
505 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
506 Collections::Collection c(CollExp, impTypes);
508
509 const int nq = Exp->GetTotPoints();
510 const int nc = Exp->GetNcoeffs();
511 Array<OneD, NekDouble> xc(nq), yc(nq);
512 Array<OneD, NekDouble> phys(nelmts * nq), tmp;
513 Array<OneD, NekDouble> coeffs1(nelmts * nc);
514 Array<OneD, NekDouble> coeffs2(nelmts * nc);
515
516 Exp->GetCoords(xc, yc);
517
518 for (int i = 0; i < nq; ++i)
519 {
520 phys[i] = sin(xc[i]);
521 }
522 Exp->IProductWRTBase(phys, coeffs1);
523
524 for (int i = 1; i < nelmts; ++i)
525 {
526 Vmath::Vcopy(nq, phys, 1, tmp = phys + i * nq, 1);
527 Exp->IProductWRTBase(phys + i * nq, tmp = coeffs1 + i * nc);
528 }
530
531 double epsilon = 1.0e-8;
532 for (int i = 0; i < coeffs1.size(); ++i)
533 {
534 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
535 }
536}
537
538BOOST_AUTO_TEST_CASE(TestSegIProductWRTBase_SumFac_UniformP_MultiElmt)
539{
541 new SpatialDomains::PointGeom(1u, 0u, -1.5, 0.0, 0.0));
543 new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0));
544
546 CreateSegGeom(0, v0.get(), v1.get());
547
548 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
550 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(5,
551 segPointsTypeDir1);
552 Nektar::LibUtilities::BasisType basisTypeDir1 =
554 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
555 segPointsKeyDir1);
556
559 basisKeyDir1, segGeom.get());
560
561 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
562
563 int nelmts = 10;
564 for (int i = 0; i < nelmts; ++i)
565 {
566 CollExp.push_back(Exp);
567 }
568
570 Collections::CollectionOptimisation colOpt(dummySession, 1,
572 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
573 Collections::Collection c(CollExp, impTypes);
575
576 const int nq = Exp->GetTotPoints();
577 const int nc = Exp->GetNcoeffs();
578 Array<OneD, NekDouble> xc(nq), yc(nq);
579 Array<OneD, NekDouble> phys(nelmts * nq), tmp;
580 Array<OneD, NekDouble> coeffs1(nelmts * nc);
581 Array<OneD, NekDouble> coeffs2(nelmts * nc);
582
583 Exp->GetCoords(xc, yc);
584
585 for (int i = 0; i < nq; ++i)
586 {
587 phys[i] = sin(xc[i]);
588 }
589 Exp->IProductWRTBase(phys, coeffs1);
590
591 for (int i = 1; i < nelmts; ++i)
592 {
593 Vmath::Vcopy(nq, phys, 1, tmp = phys + i * nq, 1);
594 Exp->IProductWRTBase(phys + i * nq, tmp = coeffs1 + i * nc);
595 }
597
598 double epsilon = 1.0e-8;
599 for (int i = 0; i < coeffs1.size(); ++i)
600 {
601 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
602 }
603}
604
605BOOST_AUTO_TEST_CASE(TestSegIProductWRTBase_MatrixFree_UniformP_MultiElmt)
606{
608 new SpatialDomains::PointGeom(1u, 0u, -1.5, 0.0, 0.0));
610 new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0));
611
613 CreateSegGeom(0, v0.get(), v1.get());
614
615 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
617 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(5,
618 segPointsTypeDir1);
619 Nektar::LibUtilities::BasisType basisTypeDir1 =
621 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
622 segPointsKeyDir1);
623
626 basisKeyDir1, segGeom.get());
627
628 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
629
630 int nelmts = 10;
631 for (int i = 0; i < nelmts; ++i)
632 {
633 CollExp.push_back(Exp);
634 }
635
637 Collections::CollectionOptimisation colOpt(dummySession, 1,
639 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
641 Collections::Collection c(CollExp, impTypes);
643
644 const int nq = Exp->GetTotPoints();
645 const int nc = Exp->GetNcoeffs();
646 Array<OneD, NekDouble> xc(nq), yc(nq);
647 Array<OneD, NekDouble> phys(nelmts * nq), tmp;
648 Array<OneD, NekDouble> coeffs1(nelmts * nc);
649 Array<OneD, NekDouble> coeffs2(nelmts * nc);
650
651 Exp->GetCoords(xc, yc);
652
653 for (int i = 0; i < nq; ++i)
654 {
655 phys[i] = sin(xc[i]);
656 }
657 Exp->IProductWRTBase(phys, coeffs1);
658
659 for (int i = 1; i < nelmts; ++i)
660 {
661 Vmath::Vcopy(nq, phys, 1, tmp = phys + i * nq, 1);
662 Exp->IProductWRTBase(phys + i * nq, tmp = coeffs1 + i * nc);
663 }
665
666 double epsilon = 1.0e-8;
667 for (int i = 0; i < coeffs1.size(); ++i)
668 {
669 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
670 }
671}
672
673BOOST_AUTO_TEST_CASE(TestSegPhysDeriv_IterPerExp_UniformP)
674{
676 new SpatialDomains::PointGeom(1u, 0u, -1.5, 0.0, 0.0));
678 new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0));
679
681 CreateSegGeom(0, v0.get(), v1.get());
682
683 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
685 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(5,
686 segPointsTypeDir1);
687 Nektar::LibUtilities::BasisType basisTypeDir1 =
689 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
690 segPointsKeyDir1);
691
694 basisKeyDir1, segGeom.get());
695
696 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
697 CollExp.push_back(Exp);
698
700 Collections::CollectionOptimisation colOpt(dummySession, 1,
702 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
703 Collections::Collection c(CollExp, impTypes);
705
706 const int nq = Exp->GetTotPoints();
707 Array<OneD, NekDouble> xc(nq), yc(nq);
708 Array<OneD, NekDouble> phys(nq), tmp;
709 Array<OneD, NekDouble> diff1(nq);
710 Array<OneD, NekDouble> diff2(nq);
711
712 Exp->GetCoords(xc, yc);
713
714 for (int i = 0; i < nq; ++i)
715 {
716 phys[i] = sin(xc[i]);
717 }
718
719 Exp->PhysDeriv(phys, diff1);
721
722 double epsilon = 1.0e-8;
723 for (int i = 0; i < diff1.size(); ++i)
724 {
725 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
726 }
727}
728
729BOOST_AUTO_TEST_CASE(TestSegPhysDeriv_IterPerExp_UniformP_MultiElmt)
730{
732 new SpatialDomains::PointGeom(1u, 0u, -1.5, 0.0, 0.0));
734 new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0));
735
737 CreateSegGeom(0, v0.get(), v1.get());
738
739 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
741 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(5,
742 segPointsTypeDir1);
743 Nektar::LibUtilities::BasisType basisTypeDir1 =
745 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
746 segPointsKeyDir1);
747
750 basisKeyDir1, segGeom.get());
751
752 int nelmts = 10;
753
754 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
755 for (int i = 0; i < nelmts; ++i)
756 {
757 CollExp.push_back(Exp);
758 }
759
761 Collections::CollectionOptimisation colOpt(dummySession, 1,
763 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
764 Collections::Collection c(CollExp, impTypes);
766
767 const int nq = Exp->GetTotPoints();
769 Array<OneD, NekDouble> phys(nelmts * nq), tmp;
770 Array<OneD, NekDouble> diff1(nelmts * nq);
771 Array<OneD, NekDouble> diff2(nelmts * nq);
772
773 Exp->GetCoords(xc);
774
775 for (int i = 0; i < nq; ++i)
776 {
777 phys[i] = sin(xc[i]);
778 }
779 Exp->PhysDeriv(phys, diff1);
780
781 for (int i = 1; i < nelmts; ++i)
782 {
783 Vmath::Vcopy(nq, phys, 1, tmp = phys + i * nq, 1);
784 Exp->PhysDeriv(phys + i * nq, tmp = diff1 + i * nq);
785 }
786
788
789 double epsilon = 1.0e-8;
790 for (int i = 0; i < diff1.size(); ++i)
791 {
792 diff1[i] = (fabs(diff1[i]) < 1e-14) ? 0.0 : diff1[i];
793 diff2[i] = (fabs(diff2[i]) < 1e-14) ? 0.0 : diff2[i];
794 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
795 }
796}
797
798BOOST_AUTO_TEST_CASE(TestSegPhysDeriv_StdMat_UniformP)
799{
801 new SpatialDomains::PointGeom(1u, 0u, -1.5, 0.0, 0.0));
803 new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0));
804
806 CreateSegGeom(0, v0.get(), v1.get());
807
808 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
810 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(5,
811 segPointsTypeDir1);
812 Nektar::LibUtilities::BasisType basisTypeDir1 =
814 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
815 segPointsKeyDir1);
816
819 basisKeyDir1, segGeom.get());
820
821 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
822 CollExp.push_back(Exp);
823
825 Collections::CollectionOptimisation colOpt(dummySession, 1,
827 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
828 Collections::Collection c(CollExp, impTypes);
830
831 const int nq = Exp->GetTotPoints();
833 Array<OneD, NekDouble> phys(nq), tmp;
834 Array<OneD, NekDouble> diff1(nq);
835 Array<OneD, NekDouble> diff2(nq);
836
837 Exp->GetCoords(xc);
838
839 for (int i = 0; i < nq; ++i)
840 {
841 phys[i] = sin(xc[i]);
842 }
843
844 Exp->PhysDeriv(phys, diff1);
846
847 double epsilon = 1.0e-8;
848 for (int i = 0; i < diff1.size(); ++i)
849 {
850 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
851 }
852}
853
854BOOST_AUTO_TEST_CASE(TestSegPhysDeriv_StdMat_UniformP_MultiElmt)
855{
857 new SpatialDomains::PointGeom(1u, 0u, -1.5, 0.0, 0.0));
859 new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0));
860
862 CreateSegGeom(0, v0.get(), v1.get());
863
864 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
866 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(5,
867 segPointsTypeDir1);
868 Nektar::LibUtilities::BasisType basisTypeDir1 =
870 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
871 segPointsKeyDir1);
872
875 basisKeyDir1, segGeom.get());
876
877 int nelmts = 10;
878
879 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
880 for (int i = 0; i < nelmts; ++i)
881 {
882 CollExp.push_back(Exp);
883 }
884
886 Collections::CollectionOptimisation colOpt(dummySession, 1,
888 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
889 Collections::Collection c(CollExp, impTypes);
891
892 const int nq = Exp->GetTotPoints();
894 Array<OneD, NekDouble> phys(nelmts * nq), tmp;
895 Array<OneD, NekDouble> diff1(nelmts * nq);
896 Array<OneD, NekDouble> diff2(nelmts * nq);
897
898 Exp->GetCoords(xc);
899
900 for (int i = 0; i < nq; ++i)
901 {
902 phys[i] = sin(xc[i]);
903 }
904 Exp->PhysDeriv(phys, diff1);
905
906 for (int i = 1; i < nelmts; ++i)
907 {
908 Vmath::Vcopy(nq, phys, 1, tmp = phys + i * nq, 1);
909 Exp->PhysDeriv(phys + i * nq, tmp = diff1 + i * nq);
910 }
911
913
914 double epsilon = 1.0e-8;
915 for (int i = 0; i < diff1.size(); ++i)
916 {
917 diff1[i] = (fabs(diff1[i]) < 1e-14) ? 0.0 : diff1[i];
918 diff2[i] = (fabs(diff2[i]) < 1e-14) ? 0.0 : diff2[i];
919 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
920 }
921}
922
923BOOST_AUTO_TEST_CASE(TestSegPhysDeriv_SumFac_UniformP_MultiElmt)
924{
926 new SpatialDomains::PointGeom(1u, 0u, -1.5, 0.0, 0.0));
928 new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0));
929
931 CreateSegGeom(0, v0.get(), v1.get());
932
933 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
935 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(5,
936 segPointsTypeDir1);
937 Nektar::LibUtilities::BasisType basisTypeDir1 =
939 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
940 segPointsKeyDir1);
941
944 basisKeyDir1, segGeom.get());
945
946 int nelmts = 10;
947
948 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
949 for (int i = 0; i < nelmts; ++i)
950 {
951 CollExp.push_back(Exp);
952 }
953
955 Collections::CollectionOptimisation colOpt(dummySession, 1,
957 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
958 Collections::Collection c(CollExp, impTypes);
960
961 const int nq = Exp->GetTotPoints();
963 Array<OneD, NekDouble> phys(nelmts * nq), tmp;
964 Array<OneD, NekDouble> diff1(nelmts * nq);
965 Array<OneD, NekDouble> diff2(nelmts * nq);
966
967 Exp->GetCoords(xc);
968
969 for (int i = 0; i < nq; ++i)
970 {
971 phys[i] = sin(xc[i]);
972 }
973 Exp->PhysDeriv(phys, diff1);
974
975 for (int i = 1; i < nelmts; ++i)
976 {
977 Vmath::Vcopy(nq, phys, 1, tmp = phys + i * nq, 1);
978 Exp->PhysDeriv(phys + i * nq, tmp = diff1 + i * nq);
979 }
980
982
983 double epsilon = 1.0e-8;
984 for (int i = 0; i < diff1.size(); ++i)
985 {
986 diff1[i] = (fabs(diff1[i]) < 1e-14) ? 0.0 : diff1[i];
987 diff2[i] = (fabs(diff2[i]) < 1e-14) ? 0.0 : diff2[i];
988 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
989 }
990}
991
992BOOST_AUTO_TEST_CASE(TestSegPhysDeriv_MatrixFree_UniformP_MultiElmt_1D)
993{
995 new SpatialDomains::PointGeom(1u, 0u, -1.5, 0.0, 0.0));
997 new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0));
998
1000 CreateSegGeom(0, v0.get(), v1.get());
1001
1002 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
1004 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(5,
1005 segPointsTypeDir1);
1006 Nektar::LibUtilities::BasisType basisTypeDir1 =
1008 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
1009 segPointsKeyDir1);
1010
1013 basisKeyDir1, segGeom.get());
1014
1015 int nelmts = 10;
1016
1017 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
1018 for (int i = 0; i < nelmts; ++i)
1019 {
1020 CollExp.push_back(Exp);
1021 }
1022
1024 Collections::CollectionOptimisation colOpt(dummySession, 1,
1026 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
1028 Collections::Collection c(CollExp, impTypes);
1030
1031 const int nq = Exp->GetTotPoints();
1033 Array<OneD, NekDouble> phys(nelmts * nq), tmp;
1034 Array<OneD, NekDouble> diff1(nelmts * nq);
1035 Array<OneD, NekDouble> diff2(nelmts * nq);
1036
1037 Exp->GetCoords(xc);
1038
1039 for (int i = 0; i < nq; ++i)
1040 {
1041 phys[i] = sin(xc[i]);
1042 }
1043 Exp->PhysDeriv(phys, diff1);
1044
1045 for (int i = 1; i < nelmts; ++i)
1046 {
1047 Vmath::Vcopy(nq, phys, 1, tmp = phys + i * nq, 1);
1048 Exp->PhysDeriv(phys + i * nq, tmp = diff1 + i * nq);
1049 }
1050
1051 c.ApplyOperator(Collections::ePhysDeriv, phys, diff2);
1052
1053 double epsilon = 1.0e-8;
1054 for (int i = 0; i < diff1.size(); ++i)
1055 {
1056 diff1[i] = (fabs(diff1[i]) < 1e-14) ? 0.0 : diff1[i];
1057 diff2[i] = (fabs(diff2[i]) < 1e-14) ? 0.0 : diff2[i];
1058 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
1059 }
1060}
1061
1062BOOST_AUTO_TEST_CASE(TestSegPhysDeriv_MatrixFree_UniformP_MultiElmt_2D)
1063{
1065 new SpatialDomains::PointGeom(2u, 0u, -1.5, 0.0, 0.0));
1067 new SpatialDomains::PointGeom(2u, 1u, 1.0, 1.0, 0.0));
1068
1070 CreateSegGeom(0, v0.get(), v1.get(), 2u);
1071
1072 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
1074 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(5,
1075 segPointsTypeDir1);
1076 Nektar::LibUtilities::BasisType basisTypeDir1 =
1078 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
1079 segPointsKeyDir1);
1080
1083 basisKeyDir1, segGeom.get());
1084
1085 int nelmts = 10;
1086
1087 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
1088 for (int i = 0; i < nelmts; ++i)
1089 {
1090 CollExp.push_back(Exp);
1091 }
1092
1094 Collections::CollectionOptimisation colOpt(dummySession, 1,
1096 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
1098 Collections::Collection c(CollExp, impTypes);
1100
1101 const int nq = Exp->GetTotPoints();
1102 Array<OneD, NekDouble> xc(nq), yc(nq);
1103 Array<OneD, NekDouble> phys(nelmts * nq), tmp, tmp1;
1104 Array<OneD, NekDouble> diff1(2 * nelmts * nq);
1105 Array<OneD, NekDouble> diff2(2 * nelmts * nq);
1106
1107 Exp->GetCoords(xc, yc);
1108
1109 for (int i = 0; i < nq; ++i)
1110 {
1111 phys[i] = sin(xc[i]) * cos(yc[i]);
1112 }
1113 Exp->PhysDeriv(phys, diff1, tmp = diff1 + nelmts * nq);
1114
1115 for (int i = 1; i < nelmts; ++i)
1116 {
1117 Vmath::Vcopy(nq, phys, 1, tmp = phys + i * nq, 1);
1118 Exp->PhysDeriv(phys + i * nq, tmp = diff1 + i * nq,
1119 tmp1 = diff1 + (nelmts + i) * nq);
1120 }
1121
1123 tmp = diff2 + nelmts * nq);
1124
1125 double epsilon = 1.0e-8;
1126 for (int i = 0; i < diff1.size(); ++i)
1127 {
1128 diff1[i] = (fabs(diff1[i]) < 1e-14) ? 0.0 : diff1[i];
1129 diff2[i] = (fabs(diff2[i]) < 1e-14) ? 0.0 : diff2[i];
1130 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
1131 }
1132}
1133
1134BOOST_AUTO_TEST_CASE(TestSegPhysDeriv_MatrixFree_UniformP_MultiElmt_3D)
1135{
1137 new SpatialDomains::PointGeom(3u, 0u, -1.5, 0.0, 0.0));
1139 new SpatialDomains::PointGeom(3u, 1u, 1.0, 1.0, 1.0));
1140
1142 CreateSegGeom(0, v0.get(), v1.get(), 3u);
1143
1144 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
1146 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(5,
1147 segPointsTypeDir1);
1148 Nektar::LibUtilities::BasisType basisTypeDir1 =
1150 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
1151 segPointsKeyDir1);
1152
1155 basisKeyDir1, segGeom.get());
1156
1157 int nelmts = 10;
1158
1159 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
1160 for (int i = 0; i < nelmts; ++i)
1161 {
1162 CollExp.push_back(Exp);
1163 }
1164
1166 Collections::CollectionOptimisation colOpt(dummySession, 1,
1168 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
1170 Collections::Collection c(CollExp, impTypes);
1172
1173 const int nq = Exp->GetTotPoints();
1174 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
1175 Array<OneD, NekDouble> phys(nelmts * nq), tmp, tmp1, tmp2;
1176 Array<OneD, NekDouble> diff1(3 * nelmts * nq);
1177 Array<OneD, NekDouble> diff2(3 * nelmts * nq);
1178
1179 Exp->GetCoords(xc, yc, zc);
1180
1181 for (int i = 0; i < nq; ++i)
1182 {
1183 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1184 }
1185 Exp->PhysDeriv(phys, diff1, tmp = diff1 + nelmts * nq,
1186 tmp1 = diff1 + 2 * nelmts * nq);
1187
1188 for (int i = 1; i < nelmts; ++i)
1189 {
1190 Vmath::Vcopy(nq, phys, 1, tmp = phys + i * nq, 1);
1191 Exp->PhysDeriv(phys + i * nq, tmp = diff1 + i * nq,
1192 tmp1 = diff1 + (nelmts + i) * nq,
1193 tmp2 = diff1 + (2 * nelmts + i) * nq);
1194 }
1195
1197 tmp = diff2 + nelmts * nq, tmp1 = diff2 + 2 * nelmts * nq);
1198
1199 double epsilon = 1.0e-8;
1200 for (int i = 0; i < diff1.size(); ++i)
1201 {
1202 diff1[i] = (fabs(diff1[i]) < 1e-14) ? 0.0 : diff1[i];
1203 diff2[i] = (fabs(diff2[i]) < 1e-14) ? 0.0 : diff2[i];
1204 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
1205 }
1206}
1207
1208BOOST_AUTO_TEST_CASE(TestSegIProductWRTDerivBase_IterPerExp_UniformP)
1209{
1211 new SpatialDomains::PointGeom(1u, 0u, -1.0, 0.0, 0.0));
1213 new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0));
1214
1216 CreateSegGeom(0, v0.get(), v1.get());
1217
1218 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
1220 Nektar::LibUtilities::BasisType basisTypeDir1 =
1222 unsigned int numSegPoints = 6;
1223 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(numSegPoints,
1224 segPointsTypeDir1);
1225 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
1226 segPointsKeyDir1);
1227
1230 basisKeyDir1, segGeom.get());
1231
1232 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
1233 CollExp.push_back(Exp);
1234
1236 Collections::CollectionOptimisation colOpt(dummySession, 1,
1238 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
1239 Collections::Collection c(CollExp, impTypes);
1241
1242 const int nq = Exp->GetTotPoints();
1243 const int nm = Exp->GetNcoeffs();
1244 Array<OneD, NekDouble> phys1(nq);
1245 Array<OneD, NekDouble> coeffs1(nm);
1246 Array<OneD, NekDouble> coeffs2(nm);
1247
1249
1250 Exp->GetCoords(xc);
1251
1252 for (int i = 0; i < nq; ++i)
1253 {
1254 phys1[i] = sin(xc[i]);
1255 }
1256
1257 // Standard routines
1258 Exp->IProductWRTDerivBase(0, phys1, coeffs1);
1259
1261
1262 double epsilon = 1.0e-8;
1263 for (int i = 0; i < coeffs1.size(); ++i)
1264 {
1265 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
1266 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
1267 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1268 }
1269}
1270
1271BOOST_AUTO_TEST_CASE(TestSegIProductWRTDerivBase_IterPerExp_UniformP_MultiElmt)
1272{
1274 new SpatialDomains::PointGeom(1u, 0u, -1.0, 0.0, 0.0));
1276 new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0));
1277
1279 CreateSegGeom(0, v0.get(), v1.get());
1280
1281 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
1283 Nektar::LibUtilities::BasisType basisTypeDir1 =
1285 unsigned int numSegPoints = 6;
1286 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(numSegPoints,
1287 segPointsTypeDir1);
1288 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
1289 segPointsKeyDir1);
1290
1293 basisKeyDir1, segGeom.get());
1294
1295 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
1296
1297 int nelmts = 10;
1298 for (int i = 0; i < nelmts; ++i)
1299 {
1300 CollExp.push_back(Exp);
1301 }
1302
1304 Collections::CollectionOptimisation colOpt(dummySession, 1,
1306 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
1307 Collections::Collection c(CollExp, impTypes);
1309
1310 const int nq = Exp->GetTotPoints();
1311 const int nm = Exp->GetNcoeffs();
1312 Array<OneD, NekDouble> xc(nq), tmp, tmp1;
1313 Array<OneD, NekDouble> phys1(nelmts * nq);
1314 Array<OneD, NekDouble> coeffs1(nelmts * nm);
1315 Array<OneD, NekDouble> coeffs2(nelmts * nm);
1316
1317 Exp->GetCoords(xc);
1318
1319 for (int i = 0; i < nq; ++i)
1320 {
1321 phys1[i] = sin(xc[i]);
1322 }
1323 Exp->IProductWRTDerivBase(0, phys1, coeffs1);
1324
1325 for (int i = 1; i < nelmts; ++i)
1326 {
1327 Vmath::Vcopy(nq, phys1, 1, tmp = phys1 + i * nq, 1);
1328
1329 // Standard routines
1330 Exp->IProductWRTDerivBase(0, phys1 + i * nq, tmp = coeffs1 + i * nm);
1331 }
1332
1334
1335 double epsilon = 1.0e-8;
1336 for (int i = 0; i < coeffs1.size(); ++i)
1337 {
1338 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
1339 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
1340 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1341 }
1342}
1343
1344BOOST_AUTO_TEST_CASE(TestSegIProductWRTDerivBase_StdMat_UniformP)
1345{
1347 new SpatialDomains::PointGeom(1u, 0u, -1.0, 0.0, 0.0));
1349 new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0));
1350
1352 CreateSegGeom(0, v0.get(), v1.get());
1353
1354 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
1356 Nektar::LibUtilities::BasisType basisTypeDir1 =
1358 unsigned int numSegPoints = 6;
1359 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(numSegPoints,
1360 segPointsTypeDir1);
1361 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
1362 segPointsKeyDir1);
1363
1366 basisKeyDir1, segGeom.get());
1367
1368 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
1369 CollExp.push_back(Exp);
1370
1372 Collections::CollectionOptimisation colOpt(dummySession, 1,
1374 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
1375 Collections::Collection c(CollExp, impTypes);
1377
1378 const int nq = Exp->GetTotPoints();
1379 const int nm = Exp->GetNcoeffs();
1380 Array<OneD, NekDouble> phys1(nq);
1381 Array<OneD, NekDouble> coeffs1(nm);
1382 Array<OneD, NekDouble> coeffs2(nm);
1383
1385
1386 Exp->GetCoords(xc);
1387
1388 for (int i = 0; i < nq; ++i)
1389 {
1390 phys1[i] = sin(xc[i]);
1391 }
1392
1393 // Standard routines
1394 Exp->IProductWRTDerivBase(0, phys1, coeffs1);
1395
1397
1398 double epsilon = 1.0e-8;
1399 for (int i = 0; i < coeffs1.size(); ++i)
1400 {
1401 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
1402 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
1403 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1404 }
1405}
1406
1407BOOST_AUTO_TEST_CASE(TestSegIProductWRTDerivBase_StdMat_UniformP_MultiElmt)
1408{
1410 new SpatialDomains::PointGeom(1u, 0u, -1.0, 0.0, 0.0));
1412 new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0));
1413
1415 CreateSegGeom(0, v0.get(), v1.get());
1416
1417 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
1419 Nektar::LibUtilities::BasisType basisTypeDir1 =
1421 unsigned int numSegPoints = 6;
1422 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(numSegPoints,
1423 segPointsTypeDir1);
1424 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
1425 segPointsKeyDir1);
1426
1429 basisKeyDir1, segGeom.get());
1430
1431 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
1432
1433 int nelmts = 10;
1434 for (int i = 0; i < nelmts; ++i)
1435 {
1436 CollExp.push_back(Exp);
1437 }
1438
1440 Collections::CollectionOptimisation colOpt(dummySession, 1,
1442 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
1443 Collections::Collection c(CollExp, impTypes);
1445
1446 const int nq = Exp->GetTotPoints();
1447 const int nm = Exp->GetNcoeffs();
1448 Array<OneD, NekDouble> xc(nq), tmp, tmp1;
1449 Array<OneD, NekDouble> phys1(nelmts * nq);
1450 Array<OneD, NekDouble> coeffs1(nelmts * nm);
1451 Array<OneD, NekDouble> coeffs2(nelmts * nm);
1452
1453 Exp->GetCoords(xc);
1454
1455 for (int i = 0; i < nq; ++i)
1456 {
1457 phys1[i] = sin(xc[i]);
1458 }
1459 Exp->IProductWRTDerivBase(0, phys1, coeffs1);
1460
1461 for (int i = 1; i < nelmts; ++i)
1462 {
1463 Vmath::Vcopy(nq, phys1, 1, tmp = phys1 + i * nq, 1);
1464
1465 // Standard routines
1466 Exp->IProductWRTDerivBase(0, phys1 + i * nq, tmp = coeffs1 + i * nm);
1467 }
1468
1470
1471 double epsilon = 1.0e-8;
1472 for (int i = 0; i < coeffs1.size(); ++i)
1473 {
1474 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
1475 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
1476 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1477 }
1478}
1479
1480BOOST_AUTO_TEST_CASE(TestSegIProductWRTDerivBase_SumFac_UniformP)
1481{
1483 new SpatialDomains::PointGeom(1u, 0u, -1.0, 0.0, 0.0));
1485 new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0));
1486
1488 CreateSegGeom(0, v0.get(), v1.get());
1489
1490 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
1492 Nektar::LibUtilities::BasisType basisTypeDir1 =
1494 unsigned int numSegPoints = 6;
1495 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(numSegPoints,
1496 segPointsTypeDir1);
1497 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
1498 segPointsKeyDir1);
1499
1502 basisKeyDir1, segGeom.get());
1503
1504 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
1505 CollExp.push_back(Exp);
1506
1508 Collections::CollectionOptimisation colOpt(dummySession, 1,
1510 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
1511 Collections::Collection c(CollExp, impTypes);
1513
1514 const int nq = Exp->GetTotPoints();
1515 const int nm = Exp->GetNcoeffs();
1516 Array<OneD, NekDouble> phys1(nq);
1517 Array<OneD, NekDouble> coeffs1(nm);
1518 Array<OneD, NekDouble> coeffs2(nm);
1519
1521
1522 Exp->GetCoords(xc);
1523
1524 for (int i = 0; i < nq; ++i)
1525 {
1526 phys1[i] = sin(xc[i]);
1527 }
1528
1529 // Standard routines
1530 Exp->IProductWRTDerivBase(0, phys1, coeffs1);
1531
1533
1534 double epsilon = 1.0e-8;
1535 for (int i = 0; i < coeffs1.size(); ++i)
1536 {
1537 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
1538 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
1539 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1540 }
1541}
1542
1543BOOST_AUTO_TEST_CASE(TestSegIProductWRTDerivBase_SumFac_UniformP_MultiElmt)
1544{
1546 new SpatialDomains::PointGeom(1u, 0u, -1.0, 0.0, 0.0));
1548 new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0));
1549
1551 CreateSegGeom(0, v0.get(), v1.get());
1552
1553 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
1555 Nektar::LibUtilities::BasisType basisTypeDir1 =
1557 unsigned int numSegPoints = 6;
1558 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(numSegPoints,
1559 segPointsTypeDir1);
1560 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
1561 segPointsKeyDir1);
1562
1565 basisKeyDir1, segGeom.get());
1566
1567 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
1568
1569 int nelmts = 10;
1570 for (int i = 0; i < nelmts; ++i)
1571 {
1572 CollExp.push_back(Exp);
1573 }
1574
1576 Collections::CollectionOptimisation colOpt(dummySession, 1,
1578 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
1579 Collections::Collection c(CollExp, impTypes);
1581
1582 const int nq = Exp->GetTotPoints();
1583 const int nm = Exp->GetNcoeffs();
1584 Array<OneD, NekDouble> xc(nq), tmp, tmp1;
1585 Array<OneD, NekDouble> phys1(nelmts * nq);
1586 Array<OneD, NekDouble> coeffs1(nelmts * nm);
1587 Array<OneD, NekDouble> coeffs2(nelmts * nm);
1588
1589 Exp->GetCoords(xc);
1590
1591 for (int i = 0; i < nq; ++i)
1592 {
1593 phys1[i] = sin(xc[i]);
1594 }
1595 Exp->IProductWRTDerivBase(0, phys1, coeffs1);
1596
1597 for (int i = 1; i < nelmts; ++i)
1598 {
1599 Vmath::Vcopy(nq, phys1, 1, tmp = phys1 + i * nq, 1);
1600
1601 // Standard routines
1602 Exp->IProductWRTDerivBase(0, phys1 + i * nq, tmp = coeffs1 + i * nm);
1603 }
1604
1606
1607 double epsilon = 1.0e-8;
1608 for (int i = 0; i < coeffs1.size(); ++i)
1609 {
1610 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
1611 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
1612 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1613 }
1614}
1615
1617 TestSegIProductWRTDerivBase_SumFac_UniformP_MultiElmt_CoordimTwo)
1618{
1620 new SpatialDomains::PointGeom(1u, 0u, -1.0, 0.0, 0.0));
1622 new SpatialDomains::PointGeom(1u, 1u, 1.0, 1.0, 0.0));
1623
1625 CreateSegGeom(0, v0.get(), v1.get(), 2);
1626
1627 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
1629 Nektar::LibUtilities::BasisType basisTypeDir1 =
1631 unsigned int numSegPoints = 6;
1632 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(numSegPoints,
1633 segPointsTypeDir1);
1634 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
1635 segPointsKeyDir1);
1636
1639 basisKeyDir1, segGeom.get());
1640
1641 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
1642
1643 int nelmts = 10;
1644 for (int i = 0; i < nelmts; ++i)
1645 {
1646 CollExp.push_back(Exp);
1647 }
1648
1650 Collections::CollectionOptimisation colOpt(dummySession, 1,
1652 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
1653 Collections::Collection c(CollExp, impTypes);
1655
1656 const int nq = Exp->GetTotPoints();
1657 const int nm = Exp->GetNcoeffs();
1658 Array<OneD, NekDouble> xc(nq), yc(nq), tmp, tmp1;
1659 Array<OneD, NekDouble> phys1(nelmts * nq);
1660 Array<OneD, NekDouble> phys2(nelmts * nq);
1661 Array<OneD, NekDouble> coeffs1(nelmts * nm);
1662 Array<OneD, NekDouble> coeffs2(nelmts * nm);
1663
1664 Exp->GetCoords(xc, yc);
1665
1666 for (int i = 0; i < nq; ++i)
1667 {
1668 phys1[i] = sin(xc[i]);
1669 phys2[i] = cos(yc[i]);
1670 }
1671 Exp->IProductWRTDerivBase(0, phys1, coeffs1);
1672 Exp->IProductWRTDerivBase(1, phys2, coeffs2);
1673
1674 for (int i = 1; i < nelmts; ++i)
1675 {
1676 Vmath::Vcopy(nq, phys1, 1, tmp = phys1 + i * nq, 1);
1677 Vmath::Vcopy(nq, phys2, 1, tmp = phys2 + i * nq, 1);
1678
1679 // Standard routines
1680 Exp->IProductWRTDerivBase(0, phys1 + i * nq, tmp = coeffs1 + i * nm);
1681 Exp->IProductWRTDerivBase(1, phys2 + i * nq, tmp = coeffs2 + i * nm);
1682 }
1683 Vmath::Vadd(nelmts * nm, coeffs1, 1, coeffs2, 1, coeffs1, 1);
1684
1685 c.ApplyOperator(Collections::eIProductWRTDerivBase, phys1, phys2, coeffs2);
1686
1687 double epsilon = 1.0e-8;
1688 for (int i = 0; i < coeffs1.size(); ++i)
1689 {
1690 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
1691 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
1692 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1693 }
1694}
1695
1696BOOST_AUTO_TEST_CASE(TestSegIProductWRTDerivBase_MatrixFree_UniformP_MultiElmt)
1697{
1699 new SpatialDomains::PointGeom(1u, 0u, -1.0, 0.0, 0.0));
1701 new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0));
1702
1704 CreateSegGeom(0, v0.get(), v1.get());
1705
1706 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
1708 Nektar::LibUtilities::BasisType basisTypeDir1 =
1710 unsigned int numSegPoints = 6;
1711 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(numSegPoints,
1712 segPointsTypeDir1);
1713 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
1714 segPointsKeyDir1);
1715
1718 basisKeyDir1, segGeom.get());
1719
1720 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
1721
1722 int nelmts = 10;
1723 for (int i = 0; i < nelmts; ++i)
1724 {
1725 CollExp.push_back(Exp);
1726 }
1727
1729 Collections::CollectionOptimisation colOpt(dummySession, 1,
1731 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
1733 Collections::Collection c(CollExp, impTypes);
1735
1736 const int nq = Exp->GetTotPoints();
1737 const int nm = Exp->GetNcoeffs();
1738 Array<OneD, NekDouble> xc(nq), tmp, tmp1;
1739 Array<OneD, NekDouble> phys1(nelmts * nq);
1740 Array<OneD, NekDouble> coeffs1(nelmts * nm);
1741 Array<OneD, NekDouble> coeffs2(nelmts * nm);
1742
1743 Exp->GetCoords(xc);
1744
1745 for (int i = 0; i < nq; ++i)
1746 {
1747 phys1[i] = sin(xc[i]);
1748 }
1749 Exp->IProductWRTDerivBase(0, phys1, coeffs1);
1750
1751 for (int i = 1; i < nelmts; ++i)
1752 {
1753 Vmath::Vcopy(nq, phys1, 1, tmp = phys1 + i * nq, 1);
1754
1755 // Standard routines
1756 Exp->IProductWRTDerivBase(0, phys1 + i * nq, tmp = coeffs1 + i * nm);
1757 }
1758
1760
1761 double epsilon = 1.0e-8;
1762 for (int i = 0; i < coeffs1.size(); ++i)
1763 {
1764 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
1765 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
1766 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1767 }
1768}
1769
1771 TestSegIProductWRTDerivBase_MatrixFree_UniformP_MultiElmt_CoordimTwo)
1772{
1774 new SpatialDomains::PointGeom(2u, 0u, -1.0, 0.0, 0.0));
1776 new SpatialDomains::PointGeom(2u, 1u, 1.0, 1.0, 0.0));
1777
1779 CreateSegGeom(0, v0.get(), v1.get(), 2);
1780
1781 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
1783 Nektar::LibUtilities::BasisType basisTypeDir1 =
1785 unsigned int numSegPoints = 6;
1786 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(numSegPoints,
1787 segPointsTypeDir1);
1788 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
1789 segPointsKeyDir1);
1790
1793 basisKeyDir1, segGeom.get());
1794
1795 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
1796
1797 int nelmts = 10;
1798 for (int i = 0; i < nelmts; ++i)
1799 {
1800 CollExp.push_back(Exp);
1801 }
1802
1804 Collections::CollectionOptimisation colOpt(dummySession, 1,
1806 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
1808 Collections::Collection c(CollExp, impTypes);
1810
1811 const int nq = Exp->GetTotPoints();
1812 const int nm = Exp->GetNcoeffs();
1813 Array<OneD, NekDouble> xc(nq), yc(nq), tmp, tmp1;
1814 Array<OneD, NekDouble> phys1(nelmts * nq);
1815 Array<OneD, NekDouble> phys2(nelmts * nq);
1816 Array<OneD, NekDouble> coeffs1(nelmts * nm);
1817 Array<OneD, NekDouble> coeffs2(nelmts * nm);
1818
1819 Exp->GetCoords(xc, yc);
1820
1821 for (int i = 0; i < nq; ++i)
1822 {
1823 phys1[i] = sin(xc[i]);
1824 phys2[i] = cos(yc[i]);
1825 }
1826 Exp->IProductWRTDerivBase(0, phys1, coeffs1);
1827 Exp->IProductWRTDerivBase(1, phys2, coeffs2);
1828
1829 for (int i = 1; i < nelmts; ++i)
1830 {
1831 Vmath::Vcopy(nq, phys1, 1, tmp = phys1 + i * nq, 1);
1832 Vmath::Vcopy(nq, phys2, 1, tmp = phys2 + i * nq, 1);
1833
1834 // Standard routines
1835 Exp->IProductWRTDerivBase(0, phys1 + i * nq, tmp = coeffs1 + i * nm);
1836 Exp->IProductWRTDerivBase(1, phys2 + i * nq, tmp = coeffs2 + i * nm);
1837 }
1838 Vmath::Vadd(nelmts * nm, coeffs1, 1, coeffs2, 1, coeffs1, 1);
1839
1840 c.ApplyOperator(Collections::eIProductWRTDerivBase, phys1, phys2, coeffs2);
1841
1842 double epsilon = 1.0e-8;
1843 for (int i = 0; i < coeffs1.size(); ++i)
1844 {
1845 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
1846 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
1847 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1848 }
1849}
1850
1851BOOST_AUTO_TEST_CASE(TestSegPhysInterp1D_NoCollection_UniformP)
1852{
1854 new SpatialDomains::PointGeom(2u, 0u, -1.0, 0.0, 0.0));
1856 new SpatialDomains::PointGeom(2u, 1u, 1.0, 0.0, 0.0));
1857
1859 CreateSegGeom(0, v0.get(), v1.get(), 2);
1860
1861 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
1863 Nektar::LibUtilities::BasisType basisTypeDir1 =
1865 unsigned int numSegPoints = 6;
1866 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(numSegPoints,
1867 segPointsTypeDir1);
1868 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
1869 segPointsKeyDir1);
1870
1873 basisKeyDir1, segGeom.get());
1874
1875 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
1876 CollExp.push_back(Exp);
1877
1879 Collections::CollectionOptimisation colOpt(dummySession, 1,
1881 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
1882 Collections::Collection c(CollExp, impTypes);
1883
1885 factors[StdRegions::eFactorConst] = 1.5;
1887
1888 const int nq = Exp->GetTotPoints();
1889
1890 Array<OneD, NekDouble> xc(nq), yc(nq);
1891 Array<OneD, NekDouble> phys(nq), tmp;
1892
1893 Exp->GetCoords(xc, yc);
1894
1895 for (int i = 0; i < nq; ++i)
1896 {
1897 phys[i] = pow(xc[i], 3) + pow(yc[i], 3);
1898 }
1899
1901 Array<OneD, NekDouble> xc1(nq1);
1902 Array<OneD, NekDouble> yc1(nq1);
1903 Array<OneD, NekDouble> phys1(nq1);
1904
1908
1909 double epsilon = 1.0e-8;
1910 // since solution is a polynomial should be able to compare soln directly
1911 for (int i = 0; i < nq1; ++i)
1912 {
1913 NekDouble exact = pow(xc1[i], 3) + pow(yc1[i], 3);
1914 phys1[i] = (fabs(phys1[i]) < 1e-14) ? 0.0 : phys1[i];
1915 exact = (fabs(exact) < 1e-14) ? 0.0 : exact;
1916 BOOST_CHECK_CLOSE(phys1[i], exact, epsilon);
1917 }
1918}
1919
1920BOOST_AUTO_TEST_CASE(TestSegPhysInterp1D_MatrixFree_UniformP)
1921{
1923 new SpatialDomains::PointGeom(2u, 0u, -1.0, 1.0, 0.0));
1925 new SpatialDomains::PointGeom(2u, 1u, 1.0, 1.0, 0.0));
1926
1928 CreateSegGeom(0, v0.get(), v1.get(), 2);
1929
1930 Nektar::LibUtilities::PointsType segPointsTypeDir1 =
1932 Nektar::LibUtilities::BasisType basisTypeDir1 =
1934 unsigned int numSegPoints = 6;
1935 const Nektar::LibUtilities::PointsKey segPointsKeyDir1(numSegPoints,
1936 segPointsTypeDir1);
1937 const Nektar::LibUtilities::BasisKey basisKeyDir1(basisTypeDir1, 4,
1938 segPointsKeyDir1);
1939
1942 basisKeyDir1, segGeom.get());
1943
1944 std::vector<LocalRegions::ExpansionSharedPtr> CollExp;
1945 CollExp.push_back(Exp);
1946
1948 Collections::CollectionOptimisation colOpt(dummySession, 1,
1950 Collections::OperatorImpMap impTypes = colOpt.GetOperatorImpMap(Exp);
1951 Collections::Collection c(CollExp, impTypes);
1952
1954 factors[StdRegions::eFactorConst] = 1.5;
1956
1957 const int nq = Exp->GetTotPoints();
1958
1959 Array<OneD, NekDouble> xc(nq), yc(nq);
1960 Array<OneD, NekDouble> phys(nq), tmp;
1961
1962 Exp->GetCoords(xc, yc);
1963
1964 for (int i = 0; i < nq; ++i)
1965 {
1966 yc[i] = (fabs(yc[i]) < 1e-14) ? 0.0 : yc[i];
1967 phys[i] = pow(xc[i], 3) + pow(yc[i], 3);
1968 }
1969
1971 Array<OneD, NekDouble> xc1(nq1);
1972 Array<OneD, NekDouble> yc1(nq1);
1973 Array<OneD, NekDouble> phys1(nq1);
1974
1978
1979 double epsilon = 1.0e-8;
1980 // since solution is a polynomial should be able to compare soln directly
1981 for (int i = 0; i < nq1; ++i)
1982 {
1983 xc1[i] = (fabs(xc1[i]) < 1e-14) ? 0.0 : xc1[i];
1984 yc1[i] = (fabs(yc1[i]) < 1e-14) ? 0.0 : yc1[i];
1985 NekDouble exact = pow(xc1[i], 3) + pow(yc1[i], 3);
1986 phys1[i] = (fabs(phys1[i]) < 1e-14) ? 0.0 : phys1[i];
1987 exact = (fabs(exact) < 1e-14) ? 0.0 : exact;
1988 BOOST_CHECK_CLOSE(phys1[i], exact, epsilon);
1989 }
1990}
1991
1992} // namespace Nektar::SegCollectionTests
int GetOutputSize(const OperatorType &op)
Definition Collection.h:112
COLLECTIONS_EXPORT void Initialise(const OperatorType opType, StdRegions::FactorMap factors=StdRegions::NullFactorMap)
void ApplyOperator(const OperatorType &op, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &output)
Definition Collection.h:148
COLLECTIONS_EXPORT OperatorImpMap GetOperatorImpMap(LocalRegions::ExpansionSharedPtr pExp)
Get Operator Implementation Map from XMl or using default;.
Describes the specification for a Basis.
Definition Basis.h:45
Defines a specification for a set of points.
Definition Points.h:50
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
std::map< OperatorType, ImplementationType > OperatorImpMap
Definition Operator.h:131
std::shared_ptr< SessionReader > SessionReaderSharedPtr
@ eGaussLobattoLegendre
1D Gauss-Lobatto-Legendre quadrature points
Definition PointsType.h:51
@ eModified_A
Principle Modified Functions .
Definition BasisType.h:48
std::shared_ptr< SegExp > SegExpSharedPtr
Definition SegExp.h:208
SpatialDomains::SegGeomUniquePtr CreateSegGeom(unsigned int id, SpatialDomains::PointGeom *v0, SpatialDomains::PointGeom *v1, int coordim=1)
BOOST_AUTO_TEST_CASE(TestSegBwdTrans_StdMat_UniformP)
unique_ptr_objpool< SegGeom > SegGeomUniquePtr
Definition MeshGraph.h:102
unique_ptr_objpool< PointGeom > PointGeomUniquePtr
Definition MeshGraph.h:99
std::map< ConstFactorType, NekDouble > ConstFactorMap
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
Definition Vmath.hpp:180
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition Vmath.hpp:825