Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
testNonconvexMeshSearch.cpp
Go to the documentation of this file.
1#include <SimplicialMesh.h>
2#include <iostream>
3#include <stdexcept>
4
5void require(bool condition,const char* message)
6{
7 if(!condition)
8 {
9 throw std::runtime_error(message);
10 }
11}
12
13int main(int argc,char** argv)
14{
15 try
16 {
17 require(argc==2,"Expected repository root");
18 model::SimplicialMesh<3> mesh(std::string(argv[1])+"/Library/Meshes/poly30_periodicXYZ.msh",
19 Eigen::Matrix3d::Identity(),Eigen::Vector3d::Zero(),{});
20 const auto* guess=mesh.simplices().begin()->second.get();
21 // Node 398 in the reported tutorial frame. The original global walk
22 // stopped at an external face, despite this point belonging to grain 26.
23 const Eigen::Vector3d point=Eigen::Vector3d(-311.5153825721246,816.6921641196241,2568.115086056312)/3666.1742093541243;
24 require(mesh.searchRegion(26,point).first,"Regression point is not in grain 26");
25 require(mesh.search(point).first,"Global search missed node 398");
26 require(mesh.searchWithGuess(point,guess).first,"Guessed search missed node 398");
27 require(mesh.searchWithGuess(point,nullptr).first,"Null-guess search missed node 398");
28 require(!mesh.searchRegion(1,point).first,"Region-restricted search escaped its grain");
29 for(const auto& entry : mesh.simplices())
30 {
31 const Eigen::Vector3d center=entry.second->bary2pos(Eigen::Vector4d::Constant(0.25));
32 const auto found=mesh.searchWithGuess(center,guess);
33 require(found.first,"Global search missed a tetrahedron center");
34 require(found.second->pos2bary(center).minCoeff()>-1.e-7,"Search returned a non-containing tetrahedron");
35 }
36 const Eigen::Vector3d outside=mesh.xMax()+Eigen::Vector3d::Ones()*(mesh.xMax()-mesh.xMin()).norm();
37 const auto missed=mesh.search(outside);
38 require(!missed.first && missed.second && missed.second->isBoundarySimplex(),
39 "Outside search must retain a boundary simplex and report failure");
40 std::cout<<"PASS: non-convex polycrystal mesh lookup\n";
41 return 0;
42 }
43 catch(const std::exception& error)
44 {
45 std::cerr<<error.what()<<'\n';
46 return 1;
47 }
48}
void require(bool condition, const char *message)
void argv
void b int argc