26 void Test_mathRSVS_FD(
snake &testSnake,
triangulation &RSVStri, vector<double> &dt, vector<int> &isImpact,
34 if (testSnake.snaxs.size() > 0)
37 outSnake.PrintMesh(testSnake.snakeconn, 1, totT);
39 testSnake.snakeconn.PrepareForUse();
40 testTriangle.stattri.clear();
41 testTriangle.trivert.clear();
42 testTriangle.PrepareForUse();
43 triRSVS.PrepareForUse();
44 TriangulateMesh(testSnake.snakeconn, testTriangle);
45 MeshTriangulation(triMesh, testSnake.snakeconn, testTriangle.stattri, testTriangle.trivert);
46 outSnake.PrintMesh(triMesh, 2, totT);
47 MeshTriangulation(triMesh, testSnake.snakeconn, triRSVS.dynatri, triRSVS.trivert);
48 outSnake.PrintMesh(triMesh, 3, totT);
49 outSnake.PrintTriangulation(triRSVS, &triangulation::dynatri, 4, totT);
52 outSnake.PrintTriangulation(triRSVS, &triangulation::dynatri, 5, totT, rsvs3d::constants::tecplot::line);
53 outSnake.PrintTriangulation(triRSVS, &triangulation::dynatri, 6, totT, rsvs3d::constants::tecplot::line);
54 outSnake.PrintTriangulation(triRSVS, &triangulation::dynatri, 7, totT, rsvs3d::constants::tecplot::line);
56 outSnake.PrintTriangulation(triRSVS, &triangulation::intertri, 5, totT, rsvs3d::constants::tecplot::line);
57 outSnake.PrintTriangulation(triRSVS, &triangulation::trisurf, 6, totT, rsvs3d::constants::tecplot::line);
58 if (
int(triRSVS.acttri.size()) > 0)
60 outSnake.PrintTriangulation(triRSVS, &triangulation::stattri, 7, totT, rsvs3d::constants::tecplot::line,
65 for (jj = 0; jj < int(testSnake.isMeshVertIn.size()); ++jj)
67 if (testSnake.isMeshVertIn[jj])
69 vertList.push_back(testSnake.snakemesh()->verts(jj)->index);
72 if (
int(testSnake.isMeshVertIn.size()) == 0)
74 vertList.push_back(testSnake.snakemesh()->verts(0)->index);
76 outSnake.PrintMesh(*(testSnake.snakemesh()), 8, totT, rsvs3d::constants::tecplot::point, vertList);
77 outSnake.PrintVolumeDat(voluMesh, nVoluZone, 9, totT);
78 outSnake.PrintSnake(testSnake, 10, totT);
87 if (testSnake.snaxs.size() > 0)
90 outSnake.PrintMesh(testSnake.snakeconn, 1, totT);
92 testSnake.snakeconn.PrepareForUse();
93 testTriangle.stattri.clear();
94 testTriangle.trivert.clear();
95 testTriangle.PrepareForUse();
96 TriangulateMesh(testSnake.snakeconn, testTriangle);
97 MeshTriangulation(triMesh, testSnake.snakeconn, testTriangle.stattri, testTriangle.trivert);
98 outSnake.PrintMesh(triMesh, 2, totT);
99 MeshTriangulation(triMesh, testSnake.snakeconn, triRSVS.dynatri, triRSVS.trivert);
100 outSnake.PrintMesh(triMesh, 3, totT);
101 outSnake.PrintTriangulation(triRSVS, &triangulation::dynatri, 4, totT);
104 outSnake.PrintTriangulation(triRSVS, &triangulation::dynatri, 5, totT, rsvs3d::constants::tecplot::line);
105 outSnake.PrintTriangulation(triRSVS, &triangulation::dynatri, 6, totT, rsvs3d::constants::tecplot::line);
106 outSnake.PrintTriangulation(triRSVS, &triangulation::dynatri, 7, totT, rsvs3d::constants::tecplot::line);
108 outSnake.PrintTriangulation(triRSVS, &triangulation::intertri, 5, totT, rsvs3d::constants::tecplot::line);
109 outSnake.PrintTriangulation(triRSVS, &triangulation::trisurf, 6, totT, rsvs3d::constants::tecplot::line);
110 if (
int(triRSVS.acttri.size()) > 0)
112 outSnake.PrintTriangulation(triRSVS, &triangulation::stattri, 7, totT, rsvs3d::constants::tecplot::line,
117 for (jj = 0; jj < int(testSnake.isMeshVertIn.size()); ++jj)
119 if (testSnake.isMeshVertIn[jj])
121 vertList.push_back(testSnake.snakemesh()->verts(jj)->index);
124 if (
int(testSnake.isMeshVertIn.size()) == 0)
126 vertList.push_back(testSnake.snakemesh()->verts(0)->index);
128 outSnake.PrintMesh(*(testSnake.snakemesh()), 8, totT, rsvs3d::constants::tecplot::point, vertList);
129 outSnake.PrintVolumeDat(voluMesh, nVoluZone, 9, totT);
130 outSnake.PrintSnake(testSnake, 10, totT);
136 vector<int> elmMapping;
140 snakeMesh.PrepareForUse();
143 testSnake.SetSnakeMesh(&snakeMesh);
145 if (snakeMesh.WhatDim() == 3)
147 for (ii = 0; ii < snakeMesh.volus.size(); ++ii)
149 elmMapping.push_back(1);
152 else if (snakeMesh.WhatDim() == 2)
154 for (ii = 0; ii < snakeMesh.surfs.size(); ++ii)
156 elmMapping.push_back(1);
163 CartesianMapping(snakeMesh, elmMapping, dims);
165 snakeMesh.AddParent(&voluMesh, elmMapping);
169 DisplayVector(elmMapping);
170 for (ii = 0; ii < voluMesh.volus.size(); ++ii)
172 voluMesh.volus[ii].target = (double(rand() % 1001) / 1000.0);
174 voluMesh.PrepareForUse();
180 triRSVS.stattri.clear();
181 triRSVS.trivert.clear();
182 triRSVS.PrepareForUse();
183 TriangulateMesh(snakeMesh, triRSVS);
185 testSnake.PrepareForUse();
193 snakeMesh.PrepareForUse();
196 testSnake.SetSnakeMesh(&snakeMesh);
199 voluMesh.PrepareForUse();
205 triRSVS.stattri.clear();
206 triRSVS.trivert.clear();
207 triRSVS.PrepareForUse();
208 TriangulateMesh(snakeMesh, triRSVS);
210 testSnake.PrepareForUse();
213 void Test_randvelstep(
snake &testSnake, vector<double> dt, vector<int> &isImpact)
215 CalculateSnakeVelRand(testSnake);
216 testSnake.CalculateTimeStep(dt, 0.25);
217 testSnake.UpdateDistance(dt);
218 testSnake.PrepareForUse();
219 testSnake.UpdateCoord();
220 testSnake.PrepareForUse();
221 Test_stepalgo(testSnake, isImpact);
224 void Test_randvelstep_mc(
snake &testSnake, vector<double> dt, vector<int> &isImpact)
226 CalculateSnakeVelRand(testSnake);
227 testSnake.CalculateTimeStep(dt, 0.25);
228 testSnake.UpdateDistance(dt);
229 testSnake.PrepareForUse();
230 testSnake.UpdateCoord();
231 testSnake.PrepareForUse();
232 Test_stepalgo_mergeclean(testSnake, isImpact);
235 void Test_unitvelstep(
snake &testSnake, vector<double> dt, vector<int> &isImpact,
bool reflectVel =
true)
239 CalculateSnakeVelUnitReflect(testSnake);
243 CalculateSnakeVelUnit(testSnake);
245 testSnake.CalculateTimeStep(dt, 0.25);
246 testSnake.UpdateDistance(dt);
247 testSnake.PrepareForUse();
248 testSnake.UpdateCoord();
249 testSnake.PrepareForUse();
250 Test_stepalgo(testSnake, isImpact);
257 int Test_SnakeStructures()
261 int errFlag, errTest;
265 cout <<
"--------------------------------------------" << endl;
266 cout <<
" testing coordvec" << endl;
267 cout <<
"--------------------------------------------" << endl;
268 errTest = Test_coordvec();
269 errFlag = errFlag | (errTest != 0);
271 cout <<
"--------------------------------------------" << endl;
272 cout <<
" testing snax" << endl;
273 cout <<
"--------------------------------------------" << endl;
274 errTest = Test_snax();
275 errFlag = errFlag | (errTest != 0);
277 cout <<
"--------------------------------------------" << endl;
278 cout <<
" testing snaxedge" << endl;
279 cout <<
"--------------------------------------------" << endl;
280 errTest = Test_snaxedge();
281 errFlag = errFlag | (errTest != 0);
283 cout <<
"--------------------------------------------" << endl;
284 cout <<
" testing Snake" << endl;
285 cout <<
"--------------------------------------------" << endl;
286 errTest = Test_snake();
287 errFlag = errFlag | (errTest != 0);
298 testCoord.assign(1.0, 2.0, 3.0);
300 cout <<
"base vector: ";
303 unitCoord = testCoord.Unit();
304 cout <<
"unit vector: ";
307 cout <<
"unit access: ";
308 cout <<
"coord vec [" << testCoord.Unit(0) <<
"," << testCoord.Unit(1) <<
"," << testCoord.Unit(2) <<
"] norm 1"
311 cout <<
"base oper(): ";
312 cout <<
"coord vec [" << testCoord(0) <<
"," << testCoord(1) <<
"," << testCoord(2) <<
"] " << endl;
313 cout <<
"base oper(): ";
315 cout <<
"base oper[]: ";
316 cout <<
"coord vec [" << testCoord[0] <<
"," << testCoord[1] <<
"," << testCoord[2] <<
"] " << endl;
317 cout <<
"base oper[]: ";
320 cout <<
"base ope()=: {compile error}";
323 cout <<
"base ope[]=: ";
327 cout <<
"base getnor: ";
330 catch (exception
const &ex)
332 cerr <<
"Exception: " << ex.what() << endl;
348 snaxStack.assign(5, singleSnax);
350 snaxStack.PopulateIndices();
352 snaxStack[0].index = 10;
355 snaxStack.PrepareForUse();
356 i = snaxStack.find(10);
357 cout <<
"found position " << i <<
" Index " << snaxStack(i)->index << endl;
359 snaxStack2 = snaxStack;
361 snaxStack[0] = singleSnax;
364 cout <<
"Are the Same " << CompareDisp(snaxStack, snaxStack2) << endl;
366 catch (exception
const &ex)
368 cerr <<
"Exception: " << ex.what() << endl;
380 singleSnax.normvector[1] = 2;
382 snaxStack.PopulateIndices();
383 snaxStack[1] = singleSnax;
385 snaxStack.PrepareForUse();
389 catch (exception
const &ex)
391 cerr <<
"Exception: " << ex.what() << endl;
399 snake testSnake, testSnake2, testSnake3;
400 mesh snakeMesh, snakeMesh2;
407 snakeMesh.Init(8, 12, 6, 1);
408 snakeMesh2.Init(8, 12, 6, 1);
410 testSnake.Init(&snakeMesh, 8, 12, 6, 1);
411 testSnake2 = testSnake;
413 errFlag = CompareDisp(testSnake, testSnake2);
414 cout <<
"Compare snakes after = assignement: 1=" << errFlag << endl;
415 errTest = errTest + int(!errFlag);
416 testSnake.ChangeIndices(1, 2, 3, 4);
417 cout <<
"Succesfully changed indices (ChangeIndices)" << endl;
418 testSnake.ChangeIndicesSnakeMesh(5, 6, 7, 8);
419 cout <<
"Succesfully changed indices (ChangeIndicesSnakeMesh)" << endl;
421 testSnake.PrepareForUse();
423 cout <<
"-----------------------testSnake1-----------------------" << endl;
425 testSnake.displight();
427 testSnake3 = testSnake.MakeCompatible(testSnake2);
428 cout <<
"-----------------------testSnake2-----------------------" << endl;
430 cout <<
"-----------------------testSnake3-----------------------" << endl;
432 testSnake.Concatenate(testSnake3);
433 testSnake.PrepareForUse();
435 testSnake3.Init(&snakeMesh2, 8, 12, 6, 1);
436 testSnake.MakeCompatible_inplace(testSnake3);
440 testSnake.Concatenate(testSnake3);
441 cerr <<
"Error : Concatenation between snakes on different meshes was allowed" << endl;
443 catch (exception
const &ex)
445 cout <<
"Succesfully generated failure" << endl;
447 cout <<
"-----------------------testSnake-----------------------" << endl;
448 testSnake.displight();
450 catch (exception
const &ex)
452 cerr <<
"Exception: " << ex.what() << endl;
458 int Test_snakeinit_velselect(
int velCase = 0,
int nStep = 300)
461 mesh snakeMesh, triMesh;
463 std::string fileToOpen;
467 vector<int> isImpact;
468 int start_s, stop_s, ii;
474 fileToOpen =
"../TESTOUT/TestSnake";
478 fileToOpen +=
"_rand";
481 fileToOpen +=
"_unitref";
484 fileToOpen +=
"_unitnoref";
490 fileToOpen += std::string(
"_") + std::to_string(nStep) +
".plt";
492 outSnake.OpenFile(fileToOpen.c_str());
493 errTest += snakeMesh.read(
"../TESTOUT/mesh203010.dat");
494 snakeMesh.PrepareForUse();
495 testSnake.SetSnakeMesh(&snakeMesh);
496 outSnake.PrintMesh(*(testSnake.snakemesh()));
500 testSnake.PrepareForUse();
502 SpawnAtVertex(testSnake, 1022);
503 SpawnAtVertex(testSnake, 674);
504 SpawnAtVertex(testSnake, 675);
505 SpawnAtVertex(testSnake, 728);
506 SpawnAtVertex(testSnake, 729);
507 SpawnAtVertex(testSnake, 731);
508 testSnake.displight();
510 cout <<
"time: " << (stop_s - start_s) /
double(CLOCKS_PER_SEC) * 1000 <<
"ms" << endl;
513 testSnake.PrepareForUse();
514 for (ii = 0; ii < nStep; ++ii)
518 if (testSnake.snaxs.size() > 0)
521 outSnake.PrintMesh(testSnake.snakeconn, 1, totT);
523 testSnake.snakeconn.PrepareForUse();
524 testTriangle.stattri.clear();
525 testTriangle.trivert.clear();
526 testTriangle.PrepareForUse();
527 TriangulateMesh(testSnake.snakeconn, testTriangle);
528 testTriangle.CalcTriVertPos();
529 MeshTriangulation(triMesh, testSnake.snakeconn, testTriangle.stattri, testTriangle.trivert);
530 outSnake.PrintMesh(triMesh, 2, totT);
535 Test_randvelstep(testSnake, dt, isImpact);
538 Test_unitvelstep(testSnake, dt, isImpact,
true);
541 Test_unitvelstep(testSnake, dt, isImpact,
false);
552 if (testSnake.snaxs.size() > 0)
554 outSnake.PrintMesh(testSnake.snakeconn, 1, totT);
555 testTriangle.stattri.clear();
556 testTriangle.trivert.clear();
557 testTriangle.PrepareForUse();
558 TriangulateMesh(testSnake.snakeconn, testTriangle);
559 testTriangle.CalcTriVertPos();
561 MeshTriangulation(triMesh, testSnake.snakeconn, testTriangle.stattri, testTriangle.trivert);
562 outSnake.PrintMesh(triMesh, 2, totT);
565 cout <<
"time: " << (stop_s - start_s) /
double(CLOCKS_PER_SEC) * 1000 <<
"ms" << endl;
566 testSnake.displight();
571 catch (exception
const &ex)
573 cerr <<
"Exception: " << ex.what() << endl;
579 int Test_snakeinit_random()
582 return (Test_snakeinit_velselect(0));
584 int Test_snakeinit_unit()
587 return (Test_snakeinit_velselect(1));
589 int Test_snakeinit_unitnoreflect()
592 return (Test_snakeinit_velselect(2));
595 int Test_snakeinit_random_short()
598 return (Test_snakeinit_velselect(0, 20));
600 int Test_snakeinit_unit_short()
603 return (Test_snakeinit_velselect(1, 20));
605 int Test_snakeinit_unitnoreflect_short()
608 return (Test_snakeinit_velselect(2, 20));
611 int Test_snakeinit_MC()
614 mesh snakeMesh, triMesh;
616 const char *fileToOpen;
620 vector<int> isImpact;
621 int start_s, stop_s, ii;
627 fileToOpen =
"../TESTOUT/TestSnake.plt";
629 outSnake.OpenFile(fileToOpen);
630 errTest += snakeMesh.read(
"../TESTOUT/mesh203010.dat");
631 snakeMesh.PrepareForUse();
632 testSnake.SetSnakeMesh(&snakeMesh);
633 outSnake.PrintMesh(*(testSnake.snakemesh()));
637 testSnake.PrepareForUse();
639 SpawnAtVertex(testSnake, 1022);
640 SpawnAtVertex(testSnake, 674);
641 SpawnAtVertex(testSnake, 675);
642 SpawnAtVertex(testSnake, 728);
643 SpawnAtVertex(testSnake, 729);
644 SpawnAtVertex(testSnake, 731);
645 testSnake.displight();
647 cout <<
"time: " << (stop_s - start_s) /
double(CLOCKS_PER_SEC) * 1000 <<
"ms" << endl;
650 testSnake.PrepareForUse();
651 for (ii = 0; ii < 50; ++ii)
655 if (testSnake.snaxs.size() > 0)
658 outSnake.PrintMesh(testSnake.snakeconn, 1, totT);
660 testSnake.snakeconn.PrepareForUse();
661 testTriangle.stattri.clear();
662 testTriangle.trivert.clear();
663 testTriangle.PrepareForUse();
664 TriangulateMesh(testSnake.snakeconn, testTriangle);
665 testTriangle.CalcTriVertPos();
666 MeshTriangulation(triMesh, testSnake.snakeconn, testTriangle.stattri, testTriangle.trivert);
667 outSnake.PrintMesh(triMesh, 2, totT);
671 cout <<
"break here" << endl;
673 Test_randvelstep_mc(testSnake, dt, isImpact);
679 if (testSnake.snaxs.size() > 0)
681 outSnake.PrintMesh(testSnake.snakeconn, 1, totT);
682 testTriangle.stattri.clear();
683 testTriangle.trivert.clear();
684 testTriangle.PrepareForUse();
685 TriangulateMesh(testSnake.snakeconn, testTriangle);
686 testTriangle.CalcTriVertPos();
688 MeshTriangulation(triMesh, testSnake.snakeconn, testTriangle.stattri, testTriangle.trivert);
689 outSnake.PrintMesh(triMesh, 2, totT);
692 cout <<
"time: " << (stop_s - start_s) /
double(CLOCKS_PER_SEC) * 1000 <<
"ms" << endl;
693 testSnake.displight();
698 catch (exception
const &ex)
700 cerr <<
"Exception: " << ex.what() << endl;
706 int Test_snakeinitflat()
710 const char *fileToOpen;
712 int start_s, stop_s, ii;
714 vector<int> isImpact;
721 fileToOpen =
"../TESTOUT/TestSnake2.plt";
723 outSnake.OpenFile(fileToOpen);
724 errTest += snakeMesh.read(
"../TESTOUT/tecout100100.dat");
725 snakeMesh.PrepareForUse();
726 snakeMesh.SetBorders();
727 snakeMesh.PrepareForUse();
729 testSnake.SetSnakeMesh(&snakeMesh);
730 outSnake.PrintMesh(*(testSnake.snakemesh()));
733 testSnake.PrepareForUse();
734 SpawnAtVertex(testSnake, 103);
735 SpawnAtVertex(testSnake, 4020);
736 SpawnAtVertex(testSnake, 780);
737 testSnake.displight();
739 testSnake.PrepareForUse();
740 for (ii = 0; ii < 50; ++ii)
743 if (testSnake.snaxs.size() > 0)
745 outSnake.PrintMesh(testSnake.snakeconn, 1, totT);
748 Test_stepalgo(testSnake, isImpact);
755 cout <<
"time: " << (stop_s - start_s) /
double(CLOCKS_PER_SEC) * 1000 <<
"ms" << endl;
759 catch (exception
const &ex)
761 cerr <<
"Exception: " << ex.what() << endl;
767 void Test_stepalgo(
snake &testSnake, vector<int> &isImpact)
770 CalculateSnakeVelRand(testSnake);
771 testSnake.CalculateTimeStep(dt, 0.9);
772 testSnake.UpdateDistance(dt, 0.9,
true);
773 testSnake.PrepareForUse();
774 testSnake.UpdateCoord();
775 SnakeConnectivityUpdate(testSnake, isImpact);
778 void Test_stepalgo_mergeclean(
snake &testSnake, vector<int> &isImpact)
785 start_s = rsvs3d::TimeStamp(
"position: ", start_s);
787 testSnake.PrepareForUse();
788 MergeCleanSnake(testSnake, isImpact);
789 testSnake.PrepareForUse();
790 start_s = rsvs3d::TimeStamp(
"MergeClean: ", start_s);
792 testSnake.SnaxImpactDetection(isImpact);
793 SpawnArrivedSnaxels(testSnake, isImpact);
794 start_s = rsvs3d::TimeStamp(
"Spawn: ", start_s);
796 testSnake.PrepareForUse();
797 MergeCleanSnake(testSnake, isImpact);
798 testSnake.PrepareForUse();
800 testSnake.OrientFaces();
801 start_s = rsvs3d::TimeStamp(
"Clean: ", start_s);
804 int Test_snakeOrderEdges()
808 const char *fileToOpen;
816 fileToOpen =
"../TESTOUT/TestOrderEdges.plt";
818 outSnake.OpenFile(fileToOpen);
819 errTest += snakeMesh.read(
"../TESTOUT/mesh234.dat");
820 snakeMesh.HashArray();
821 snakeMesh.SetMaxIndex();
823 outSnake.PrintMesh(snakeMesh);
825 snakeMesh.OrderEdges();
826 outSnake.PrintMesh(snakeMesh);
829 catch (exception
const &ex)
831 cerr <<
"Exception: " << ex.what() << endl;
837 int Test_MeshRefinement()
840 mesh snakeMesh, voluMesh, triMesh;
841 const char *fileToOpen;
843 vector<int> elmMapping, dims;
853 fileToOpen =
"../TESTOUT/Test_Multimesh.plt";
855 outSnake.OpenFile(fileToOpen);
856 errTest += snakeMesh.read(
"../TESTOUT/mesh203010.dat");
857 snakeMesh.PrepareForUse();
858 outSnake.PrintMesh(snakeMesh);
860 snakeMesh.OrderEdges();
862 outSnake.PrintMesh(snakeMesh);
864 for (ii = 0; ii < snakeMesh.volus.size(); ++ii)
866 elmMapping.push_back(1);
872 CartesianMapping(snakeMesh, elmMapping, dims);
874 snakeMesh.AddParent(&voluMesh, elmMapping);
878 DisplayVector(elmMapping);
879 for (ii = 0; ii < voluMesh.volus.size(); ++ii)
881 voluMesh.volus[ii].fill = (double(rand() % 1001) / 1000.0);
882 voluMesh.volus[ii].target = voluMesh.volus[ii].fill;
883 voluMesh.volus[ii].error = voluMesh.volus[ii].fill;
885 voluMesh.PrepareForUse();
886 voluMesh.TightenConnectivity();
887 voluMesh.OrderEdges();
892 testTriangle.PrepareForUse();
893 TriangulateMesh(snakeMesh, testTriangle);
894 testTriangle.PrepareForUse();
895 testTriangle.CalcTriVertPos();
897 testTriangle.acttri.clear();
898 testTriangle.acttri.reserve(testTriangle.stattri.size());
899 for (ii = 0; ii < testTriangle.stattri.size(); ++ii)
901 testTriangle.acttri.push_back(testTriangle.stattri(ii)->index);
904 testTriangle.PrepareForUse();
913 MeshTriangulation(triMesh, voluMesh, testTriangle.stattri, testTriangle.trivert);
915 outSnake.PrintMesh(voluMesh);
916 outSnake.PrintMesh(triMesh);
918 catch (exception
const &ex)
920 cerr <<
"Exception: " << ex.what() << endl;
926 int Test_surfcentre()
932 vector<double> v1 = {0.0, 0.0, 0.0};
933 vector<double> v2 = {1.0, 1.0, 0.0};
934 vector<double> v3 = {0.0, 1.0, 1.0};
935 vector<double> v4 = {1.0, 0.0, 0.0};
936 vector<double> v5 = {1.0, 0.0, 0.0};
948 veccoord.push_back(&v1);
949 veccoord.push_back(&v2);
950 veccoord.push_back(&v3);
951 veccoord.push_back(&v4);
952 veccoord.push_back(&v5);
953 veccoord.push_back(&v5);
954 veccoord.push_back(&v5);
955 veccoord.push_back(&v5);
956 tempCalc.assign(veccoord);
965 int Test_RSVSalgo_init()
969 snake testSnake, testSnake2;
970 mesh snakeMesh, voluMesh, voluMesh2;
974 const char *fileToOpen;
989 fileToOpen =
"../TESTOUT/TestAlgoRSVS.plt";
991 outSnake.OpenFile(fileToOpen);
992 errTest += snakeMesh.read(
"../TESTOUT/mesh203010.dat");
994 PrepareMultiLvlSnake(snakeMesh, voluMesh, testSnake, dims, triRSVS);
995 PrepareMultiLvlSnake(snakeMesh, voluMesh2, testSnake2, dims, triRSVS2);
996 voluMesh.volus[0].target = 0.0;
997 voluMesh.volus[3].target = 0.0;
998 voluMesh.volus[4].target = 1.0;
999 voluMesh.PrepareForUse();
1000 outSnake.PrintMesh(*(testSnake.snakemesh()));
1001 outSnake.PrintMesh(voluMesh);
1005 SpawnRSVS(testSnake2, 0);
1006 SpawnRSVS(testSnake, 1);
1007 testSnake.PrepareForUse();
1008 testSnake2.PrepareForUse();
1011 cout <<
"time: " << (stop_s - start_s) /
double(CLOCKS_PER_SEC) * 1000 <<
"ms" << endl;
1012 testSnake.displight();
1013 outSnake.PrintMesh(testSnake.snakeconn);
1014 outSnake.PrintSnakeInternalPts(testSnake);
1015 outSnake.PrintMesh(testSnake2.snakeconn);
1016 outSnake.PrintSnakeInternalPts(testSnake2);
1018 if (testSnake.snaxs.size() == 0 && testSnake2.snaxs.size() == 0)
1023 else if (testSnake2.snaxs.size() == 0)
1028 else if (testSnake.snaxs.size() == 0)
1034 catch (exception
const &ex)
1036 cerr <<
"Exception: " << ex.what() << endl;
1042 int Test_RSVSvoro_init()
1046 snake testSnake, testSnake2;
1047 mesh snakeMesh, voluMesh;
1051 vector<double> vecPts;
1052 const char *fileToOpen;
1058 int start_s, stop_s;
1068 fileToOpen =
"../TESTOUT/TestVoroRSVS.plt";
1069 outSnake.OpenFile(fileToOpen);
1073 vecPts.assign(4, 0.66);
1074 vecPts.insert(vecPts.end(), 4, 0.33);
1076 PrepareMultiLvlSnakeNoVoluGen(snakeMesh, voluMesh, testSnake, triRSVS);
1077 PrepareMultiLvlSnakeNoVoluGen(snakeMesh, voluMesh, testSnake2, triRSVS2);
1083 for (
int i = 0; i < 3; ++i)
1085 voluMesh.volus[i1++].target = 1.0;
1088 voluMesh.PrepareForUse();
1089 outSnake.PrintMesh(*(testSnake.snakemesh()));
1090 outSnake.PrintMesh(voluMesh);
1094 SpawnRSVS(testSnake2, 1);
1095 SpawnRSVS(testSnake, 0);
1096 testSnake.PrepareForUse();
1099 cout <<
"time: " << (stop_s - start_s) /
double(CLOCKS_PER_SEC) * 1000 <<
"ms" << endl;
1100 testSnake.displight();
1101 outSnake.PrintMesh(testSnake.snakeconn);
1102 outSnake.PrintSnakeInternalPts(testSnake);
1103 outSnake.PrintMesh(testSnake2.snakeconn);
1104 outSnake.PrintSnakeInternalPts(testSnake2);
1106 if (testSnake.snaxs.size() == 0 && testSnake2.snaxs.size() == 0)
1111 else if (testSnake2.snaxs.size() == 0)
1116 else if (testSnake.snaxs.size() == 0)
1122 catch (exception
const &ex)
1124 cerr <<
"Exception: " << ex.what() << endl;
1135 mesh snakeMesh, voluMesh, triMesh;
1139 const char *fileToOpen;
1144 int start_s, stop_s;
1156 fileToOpen =
"../TESTOUT/TestAlgoRSVSstep.plt";
1157 outSnake.OpenFile(fileToOpen);
1158 fileToOpen =
"../TESTOUT/TestAlgoRSVSstep_snake.plt";
1159 outSnake2.OpenFile(fileToOpen);
1160 errTest += snakeMesh.read(
"../TESTOUT/mesh203010.dat");
1162 PrepareMultiLvlSnake(snakeMesh, voluMesh, testSnake, dims, triRSVS);
1164 voluMesh.volus[0].target = 0.0;
1165 voluMesh.volus[3].target = 0.0;
1166 voluMesh.volus[4].target = 1.0;
1167 voluMesh.PrepareForUse();
1168 outSnake.PrintMesh(*(testSnake.snakemesh()));
1169 outSnake.PrintMesh(voluMesh);
1170 nVoluZone = outSnake.ZoneNum();
1174 SpawnRSVS(testSnake, 1);
1175 testSnake.PrepareForUse();
1177 triRSVS.PrepareForUse();
1179 TriangulateSnake(testSnake, triRSVS);
1180 triRSVS.PrepareForUse();
1181 triRSVS.CalcTriVertPos();
1185 vector<int> isImpact;
1186 MaintainTriangulateSnake(triRSVS);
1188 for (ii = 0; ii < 50; ++ii)
1191 PrintRSVSSnake(outSnake, testSnake, totT, testTriangle, triMesh, triRSVS, voluMesh, nVoluZone, ii);
1193 Test_stepalgoRSVS(testSnake, triRSVS, dt, isImpact, calcObj, outSnake2, totT);
1194 stop_s = rsvs3d::TimeStamp(
"Total: ", stop_s);
1199 PrintRSVSSnake(outSnake, testSnake, totT, testTriangle, triMesh, triRSVS, voluMesh, nVoluZone, ii);
1202 cout <<
"time: " << (stop_s - start_s) /
double(CLOCKS_PER_SEC) * 1000 <<
"ms" << endl;
1203 testSnake.displight();
1204 outSnake.PrintMesh(testSnake.snakeconn);
1205 outSnake.PrintSnakeInternalPts(testSnake);
1207 catch (exception
const &ex)
1209 cerr <<
"Exception: " << ex.what() << endl;
1215 int Test_RSVSalgoflat()
1220 mesh snakeMesh, voluMesh, triMesh;
1224 const char *fileToOpen;
1229 int start_s, stop_s;
1240 fileToOpen =
"../TESTOUT/TestAlgoRSVS2Dstep.plt";
1241 outSnake.OpenFile(fileToOpen);
1242 fileToOpen =
"../TESTOUT/TestAlgoRSVS2Dstep_snake.plt";
1243 outSnake2.OpenFile(fileToOpen);
1244 errTest += snakeMesh.read(
"../TESTOUT/tecout100100.dat");
1246 PrepareMultiLvlSnake(snakeMesh, voluMesh, testSnake, dims, triRSVS);
1248 voluMesh.surfs[0].target = 1.0;
1249 voluMesh.surfs[1].target = 1.0;
1250 voluMesh.surfs[3].target = 1.0;
1251 voluMesh.surfs[2].target = 1.0;
1254 voluMesh.PrepareForUse();
1255 outSnake.PrintMesh(*(testSnake.snakemesh()));
1256 outSnake.PrintMesh(voluMesh);
1258 nVoluZone = outSnake.ZoneNum();
1262 SpawnRSVS(testSnake, 1);
1263 testSnake.PrepareForUse();
1265 triRSVS.PrepareForUse();
1267 TriangulateSnake(testSnake, triRSVS);
1268 triRSVS.PrepareForUse();
1269 triRSVS.CalcTriVertPos();
1273 vector<int> isImpact;
1274 MaintainTriangulateSnake(triRSVS);
1275 for (ii = 0; ii < 20; ++ii)
1279 PrintRSVSSnake2D(outSnake, testSnake, totT, testTriangle, triMesh, triRSVS, voluMesh, nVoluZone, ii);
1282 Test_stepalgoRSVS(testSnake, triRSVS, dt, isImpact, calcObj, outSnake2, totT);
1285 stop_s = rsvs3d::TimeStamp(
"Total: ", stop_s);
1290 PrintRSVSSnake2D(outSnake, testSnake, totT, testTriangle, triMesh, triRSVS, voluMesh, nVoluZone, ii);
1293 cout <<
"time: " << (stop_s - start_s) /
double(CLOCKS_PER_SEC) * 1000 <<
"ms" << endl;
1294 testSnake.displight();
1295 outSnake.PrintMesh(testSnake.snakeconn);
1296 outSnake.PrintSnakeInternalPts(testSnake);
1298 catch (exception
const &ex)
1300 cerr <<
"Exception: " << ex.what() << endl;
1306 int Test_snakeRSVS()
1310 mesh snakeMesh, triMesh, voluMesh;
1313 const char *fileToOpen;
1317 vector<int> isImpact;
1318 int start_s, stop_s, ii;
1329 fileToOpen =
"../TESTOUT/TestSnakeRSVS.plt";
1330 outSnake.OpenFile(fileToOpen);
1331 fileToOpen =
"../TESTOUT/TestSnakeRSVS_snake.plt";
1332 outSnake2.OpenFile(fileToOpen);
1334 errTest += snakeMesh.read(
"../TESTOUT/mesh203010.dat");
1335 PrepareMultiLvlSnake(snakeMesh, voluMesh, testSnake, dims, triRSVS);
1337 outSnake.PrintMesh(*(testSnake.snakemesh()));
1338 outSnake.PrintMesh(voluMesh);
1339 nVoluZone = outSnake.ZoneNum();
1346 SpawnAtVertex(testSnake, 731);
1347 testSnake.displight();
1350 testSnake.PrepareForUse();
1351 triRSVS.PrepareForUse();
1353 TriangulateSnake(testSnake, triRSVS);
1354 triRSVS.PrepareForUse();
1355 triRSVS.CalcTriVertPos();
1356 MaintainTriangulateSnake(triRSVS);
1358 for (ii = 0; ii < 20; ++ii)
1361 PrintRSVSSnake(outSnake, testSnake, totT, testTriangle, triMesh, triRSVS, voluMesh, nVoluZone, ii);
1363 Test_stepalgoRSVS(testSnake, triRSVS, dt, isImpact, calcObj, outSnake2, totT);
1364 stop_s = rsvs3d::TimeStamp(
"Total: ", stop_s);
1369 PrintRSVSSnake(outSnake, testSnake, totT, testTriangle, triMesh, triRSVS, voluMesh, nVoluZone, ii);
1372 cout <<
"time: " << (stop_s - start_s) /
double(CLOCKS_PER_SEC) * 1000 <<
"ms" << endl;
1373 testSnake.displight();
1375 catch (exception
const &ex)
1377 cerr <<
"Exception: " << ex.what() << endl;
1383 void repositionatquarteredge(
snake &snakein)
1387 for (
int ii = 0; ii < int(snakein.snaxs.size()); ++ii)
1389 if (snakein.snaxs(ii)->orderedge > 1)
1391 snakein.snaxs[ii].d = 0.75;
1395 snakein.snaxs[ii].d = 0.25;
1399 snakein.PrepareForUse();
1400 snakein.UpdateCoord();
1403 int Test_RSVSalgo_singlevol(
int sparseCutOff)
1408 mesh snakeMesh, voluMesh, triMesh, triMesh2, triMesh3, triMesh4;
1412 const char *fileToOpen;
1417 int start_s, stop_s;
1424 vector<int> isImpact;
1432 fileToOpen =
"../TESTOUT/TestAlgoRSVSstep.plt";
1434 outSnake.OpenFile(fileToOpen);
1436 fileToOpen =
"../TESTOUT/TestAlgoRSVSstep_snake.plt";
1437 outSnake2.OpenFile(fileToOpen);
1438 errTest += snakeMesh.read(
"../TESTOUT/mesh203010.dat");
1440 PrepareMultiLvlSnake(snakeMesh, voluMesh, testSnake, dims, triRSVS);
1441 for (ii = 0; ii < voluMesh.volus.size(); ++ii)
1443 voluMesh.volus[ii].target = 0.8;
1445 voluMesh.volus[1].target = 0.1;
1446 voluMesh.volus[2].target = 0.3;
1456 voluMesh.PrepareForUse();
1457 outSnake.PrintMesh(*(testSnake.snakemesh()));
1458 outSnake.PrintMesh(voluMesh);
1460 nVoluZone = outSnake.ZoneNum();
1464 SpawnRSVS(testSnake, 1);
1465 testSnake.PrepareForUse();
1467 triRSVS.PrepareForUse();
1469 TriangulateSnake(testSnake, triRSVS);
1470 triRSVS.PrepareForUse();
1471 triRSVS.CalcTriVertPos();
1472 MaintainTriangulateSnake(triRSVS);
1473 calcObj.SetSparseDVcutoff(sparseCutOff);
1474 for (ii = 0; ii < 2; ++ii)
1478 PrintRSVSSnake(outSnake, testSnake, totT, testTriangle, triMesh, triRSVS, voluMesh, nVoluZone, ii);
1481 Test_stepalgoRSVS(testSnake, triRSVS, dt, isImpact, calcObj, outSnake2, totT);
1482 stop_s = rsvs3d::TimeStamp(
"Total: ", stop_s);
1487 PrintRSVSSnake(outSnake, testSnake, totT, testTriangle, triMesh, triRSVS, voluMesh, nVoluZone, ii);
1490 cout <<
"time: " << (stop_s - start_s) /
double(CLOCKS_PER_SEC) * 1000 <<
"ms" << endl;
1491 testSnake.displight();
1492 testSnake.PrepareForUse();
1496 repositionatquarteredge(testSnake);
1497 triRSVS.CalcTriVertPos();
1498 triRSVS.PrepareForUse();
1502 triMesh2 = TriarrayToMesh(triRSVS, triRSVS.intertri);
1503 fid = fopen(
"../TESTOUT/triintertestbig.dat",
"w");
1504 triMesh2.PrepareForUse();
1505 triMesh2.write(fid);
1508 catch (exception
const &extriMesh2)
1516 triMesh3 = TriarrayToMesh(triRSVS, triRSVS.dynatri);
1517 fid = fopen(
"../TESTOUT/snakeconnouttri.dat",
"w");
1518 triMesh3.PrepareForUse();
1519 triMesh3.write(fid);
1522 catch (exception
const &extriMesh2)
1530 triMesh4 = TriarrayToMesh(triRSVS, triRSVS.stattri);
1531 fid = fopen(
"../TESTOUT/stattri.dat",
"w");
1532 triMesh4.PrepareForUse();
1533 triMesh4.write(fid);
1536 catch (exception
const &extriMesh2)
1542 catch (exception
const &ex)
1544 cerr <<
"Exception: " << ex.what() << endl;
1550 int Test_RSVSalgo_singlevol_fullmath()
1552 return (Test_RSVSalgo_singlevol(10000000));
1555 int Test_RSVSalgo_singlevol_sparse()
1557 return (Test_RSVSalgo_singlevol(0));
1560 int Test_snakeRSVS_singlevol()
1564 mesh snakeMesh, triMesh, voluMesh;
1567 const char *fileToOpen;
1571 vector<int> isImpact;
1572 int start_s, stop_s, ii;
1583 fileToOpen =
"../TESTOUT/TestSnakeRSVS.plt";
1584 outSnake.OpenFile(fileToOpen);
1585 fileToOpen =
"../TESTOUT/TestSnakeRSVS_snake.plt";
1586 outSnake2.OpenFile(fileToOpen);
1588 errTest += snakeMesh.read(
"../TESTOUT/mesh203010.dat");
1590 PrepareMultiLvlSnake(snakeMesh, voluMesh, testSnake, dims, triRSVS);
1591 voluMesh.volus[0].target = 0.01;
1592 voluMesh.volus.PrepareForUse();
1593 outSnake.PrintMesh(*(testSnake.snakemesh()));
1594 outSnake.PrintMesh(voluMesh);
1595 nVoluZone = outSnake.ZoneNum();
1602 SpawnAtVertex(testSnake, 731);
1603 testSnake.displight();
1606 testSnake.PrepareForUse();
1607 triRSVS.PrepareForUse();
1609 TriangulateSnake(testSnake, triRSVS);
1610 triRSVS.PrepareForUse();
1611 triRSVS.CalcTriVertPos();
1612 MaintainTriangulateSnake(triRSVS);
1613 for (ii = 0; ii < 20; ++ii)
1616 PrintRSVSSnake(outSnake, testSnake, totT, testTriangle, triMesh, triRSVS, voluMesh, nVoluZone, ii);
1618 Test_stepalgoRSVS(testSnake, triRSVS, dt, isImpact, calcObj, outSnake2, totT);
1619 stop_s = rsvs3d::TimeStamp(
"Total: ", stop_s);
1624 PrintRSVSSnake(outSnake, testSnake, totT, testTriangle, triMesh, triRSVS, voluMesh, nVoluZone, ii);
1627 cout <<
"time: " << (stop_s - start_s) /
double(CLOCKS_PER_SEC) * 1000 <<
"ms" << endl;
1628 testSnake.displight();
1630 catch (exception
const &ex)
1632 cerr <<
"Exception: " << ex.what() << endl;
1638 int Test_MeshOrient()
1644 mesh snakeMesh, voluMesh;
1648 const char *fileToOpen;
1664 fileToOpen =
"../TESTOUT/TestAlgoRSVSstep.plt";
1666 outSnake.OpenFile(fileToOpen);
1667 errTest += snakeMesh.read(
"../TESTOUT/mesh6612.dat");
1669 PrepareMultiLvlSnake(snakeMesh, voluMesh, testSnake, dims, triRSVS);
1670 voluMesh.volus[0].target = 1;
1671 voluMesh.volus[1].target = 1;
1672 voluMesh.volus[2].target = 1;
1674 voluMesh.PrepareForUse();
1675 outSnake.PrintMesh(*(testSnake.snakemesh()));
1676 outSnake.PrintMesh(voluMesh);
1678 fileToOpen =
"../TESTOUT/volumesh6612.dat";
1679 fid = fopen(fileToOpen,
"w");
1682 voluMesh.PrepareForUse();
1683 voluMesh.SetBorders();
1685 voluMesh.write(fid);
1690 void Test_stepalgoRSVS(
snake &testSnake,
triangulation &RSVStri, vector<double> &dt, vector<int> &isImpact,
1703 start_s = rsvs3d::TimeStamp(
" triangulate:", start_s);
1707 start_s = rsvs3d::TimeStamp(
" deriv:", start_s);
1710 start_s = rsvs3d::TimeStamp(
" solve:", start_s);
1714 CalculateNoNanSnakeVel(testSnake);
1715 outSnake2.PrintSnake(testSnake, 1, totT);
1716 testSnake.CalculateTimeStep(dt, 0.4);
1717 testSnake.UpdateDistance(dt, 0.9,
true);
1718 testSnake.PrepareForUse();
1719 testSnake.UpdateCoord();
1721 SnakeConnectivityUpdate(testSnake, isImpact);
1722 MaintainTriangulateSnake(RSVStri);
1725 void Test_mathRSVS_FD(
snake &testSnake,
triangulation &RSVStri, vector<double> &dt, vector<int> &isImpact,
1731 double fdStep = 1e-3;
1740 start_s = rsvs3d::TimeStamp(
" triangulate:", start_s);
1751 testSnake.snaxs[137].d += fdStep;
1752 testSnake.PrepareForUse();
1753 testSnake.UpdateCoord();
1754 testSnake.PrepareForUse();
1758 for (
int ii = 0; ii < calcObj.
numConstr(); ++ii)
1765 start_s = rsvs3d::TimeStamp(
" deriv:", start_s);
1768 start_s = rsvs3d::TimeStamp(
" solve:", start_s);
1769 outSnake2.PrintSnake(testSnake, 1, totT);
1773 CalculateNoNanSnakeVel(testSnake);
1774 testSnake.CalculateTimeStep(dt, 0.5);
1775 testSnake.UpdateDistance(dt, 0.34,
true);
1776 testSnake.PrepareForUse();
1777 testSnake.UpdateCoord();
1779 SnakeConnectivityUpdate(testSnake, isImpact);
1780 MaintainTriangulateSnake(RSVStri);
1783 int Test_SurfCentreDerivatives()
1786 std::vector<std::vector<double>> coords;
1787 double pi = 3.14159265358979323846;
1791 for (
auto nCoords : {4, 5, 6, 7})
1795 std::ostringstream filename;
1796 filename <<
"../TESTOUT/derivatives/surfcentre_jac" << nCoords <<
".csv";
1797 outfile.open(filename.str());
1798 outfile.precision(16);
1800 coords.assign(nCoords, {0.0, 0.0, 0.0});
1801 for (
int i = 0; i < nCoords; ++i)
1803 surfCentre.assign(i, coords[i]);
1805 for (
int ord = 0; ord < 8; ++ord)
1807 stepLength = pow(10.0, -ord);
1808 for (
int i = 0; i < nCoords; ++i)
1810 double x = sin(2.0 * pi / nCoords * i);
1811 double y = cos(2.0 * pi / nCoords * i);
1818 for (
int i = 0; i < 3; ++i)
1820 coords[0][i] = coords[1][i] + (coords[0][i] - coords[1][i]) * stepLength;
1822 for (
int i = 0; i < nCoords; ++i)
1824 std::cout <<
"coord vector " << i <<
": ";
1825 DisplayVector(coords[i]);
1826 std::cout << std::endl;
1828 for (
int i = 0; i < nCoords; ++i)
1830 for (
int j = 0; j < 3; ++j)
1832 outfile << coords[i][j] <<
", ";
1834 outfile << std::endl;
1837 surfCentre.jac_ptr().write(outfile);
1838 outfile << std::endl;
1847 Eigen::MatrixXd array3d(2, 4), vec(1, 2), returnVec(2, 2), expected(2, 2);
1849 array3d << 0, 1, 4, 5, 2, 3, 6, 7;
1851 expected << 8, 11, 14, 17;
1853 std::cout <<
"3d:" << std::endl << array3d << std::endl;
1854 std::cout <<
"vec:" << std::endl << vec << std::endl;
1855 std::cout <<
"expected:" << std::endl << expected << std::endl;
1857 VecBy3DimArray(vec, array3d, returnVec);
1859 std::cout <<
"returnVec:" << std::endl << returnVec << std::endl;
Functions which are part of the RSVS algorithm but not core to the snaking process.
Provides the infrastructure for calculation of the RSVS equations.
Integration into the full 3 dimensional Restricted Snake Volume of Solid method.
Performs Volume and Area calculations for the RSVS process.
Class to handle the RSVS calculation.
void CalculateMesh(mesh &meshin)
Calculates the mesh volumes.
Eigen::VectorXd constr
Constraint value vector, size: [nConstr, 1].
void ReturnConstrToMesh(triangulation &triRSVS) const
Returns a constraint to the triangulation::meshDep.
void CheckAndCompute(int calcMethod=0, bool sensCalc=false)
Prepare the active arrays for SQP calculation and calculate the SQP step.
void CalculateTriangulation(const triangulation &triRSVS, int derivMethod=0)
Calculates the triangulation volume and area derivatives.
void Print2Screen(int outType=0) const
Prints different amounts of RSVScalc owned data to the screen.
int numConstr() const
Getter for the number of constraints.
void ReturnVelocities(triangulation &triRSVS)
Returns velocities to the snaxels.
void BuildMathArrays(int nDv, int nConstr)
Builds mathematics arrays.
Handles the use and norm of a vector for which the norm and the unit value might be needed.
void OrientFaces()
Orients either surfaces or edges depending on the dimensionality of the object.
double distanceTol
Distance tolerance.
std::vector< double > edgelengths
Controls the edgelengths at regular intervals.
file containing the main functions and the command line parser.
std::vector< const std::vector< double > * > coordlist
Defines a list of coordinates.
Tools for the refinement and coarsening of meshes.
void CoarsenMesh(const mesh &meshchild, mesh &newparent, const std::vector< int > &elmMapping)
Provide tecplot file formating for mesh and snake outputs.
Provides the core restricted surface snake container.
Functions needed to evolve the r-surface snake.
Interface between the RSVS project and tetgen.
std::vector< int > RSVSVoronoiMesh(const std::vector< double > &vecPts, mesh &vosMesh, mesh &snakMesh, tetgen::apiparam &inparam)
Genrates Snaking and VOS RSVS meshes from the voronoi diagram of a set of points.
Provides a triangulation for snake and meshes.
Provides the error and warning system used by the RSVS3D project.
#define RSVS3D_ERROR_NOTHROW(M)
Generic rsvs warning.
#define RSVS3D_ERROR_ARGUMENT(M)
Throw a invalid_argument.