40 const std::filesystem::path root(
argv[1]);
41 const auto folder=std::filesystem::temp_directory_path()/
42 (
"physics-bases-"+std::to_string(std::chrono::steady_clock::now().time_since_epoch().count()));
43 const auto input=folder/
"inputFiles";
44 std::filesystem::create_directories(input);
45 std::filesystem::create_directories(folder/
"F");
46 std::filesystem::copy_file(root/
"Library/Materials/W.txt",input/
"W.txt");
47 std::filesystem::copy_file(root/
"Library/Meshes/unitCube24.msh",input/
"mesh.msh");
48 auto configure=[&](
const std::string& physics,
double length,
const std::string& faces)
50 std::ofstream(input/
"DefectiveCrystal.txt")
51 <<
"physics="<<physics<<
";\nuseFEM=0;\nNsteps=0;\nmaxResolveSteps=0;\ndtMax=1;\n"
52 <<
"outputFrequency=1;\noutputBinary=0;\nstartAtTimeStep=0;\nperiodicImageSize=0 0 0;\nEwaldLengthFactor=0;\n";
53 std::ofstream(input/
"polycrystal.txt")<<std::setprecision(17)
54 <<
"materialFile=W.txt;\nmeshFile=mesh.msh;\nabsoluteTemperature=300;\nC2G1=1 0 0 0 1 0 0 0 1;\nF="
55 <<length<<
" 0 0 0 "<<length<<
" 0 0 0 "<<length<<
";\nX0=0 0 0;\nperiodicFaceIDs="<<faces<<
";\n";
57 configure(
"ElasticDeformation",123.456,
"-1");
60 require(base.periodicLatticeBasis.cols()==3,
"Expected periodic mesh");
61 require(!base.dislocationDynamicsBase && !base.clusterDynamicsBase && base.elasticDeformationBase,
62 "Active physics did not determine contexts");
63 require(base.hasPhysics(
"ELASTICDEFORMATION"),
"Case-insensitive lookup failed");
64 require(&base.elasticDeformation()==base.elasticDeformationBase.get(),
"Contexts are not shared");
65 mustFail([&](){base.dislocationDynamics();},
"not enabled");
68 mustFail([&](){generator.insertNetworkNode(Eigen::Vector3d::Zero());},
"not enabled");
69 require(generator.configIO.nodes().empty() && generator.configIO.loops().empty(),
"Disabled DD mutated configuration");
73 configure(
"DislocationDynamics",123.456,
"-1");
75 configure(
"DislocationDynamics ElasticDeformation dislocationdynamics",200/std::sqrt(3.0),
"-1");
76 std::shared_ptr<model::DislocationDynamicsBase<3>> context;
79 require(base.activePhysics.size()==2,
"Duplicate physics activation");
80 require(base.dislocationDynamicsBase && base.elasticDeformationBase && !base.clusterDynamicsBase,
"Incorrect mixed contexts");
84 context=base.dislocationDynamicsBase;
87 const auto grain=context->polyOwner->grain(1);
88 const auto plane=context->glidePlaneFactory.getFromKey(
model::GlidePlaneKey<3>(Eigen::Vector3d::Zero(),grain->reciprocalLatticeDirection(Eigen::Vector3d::UnitZ())));
89 require(
bool(plane),
"Context dependencies did not survive common-base destruction");
90 configure(
"none",123.456,
"");
93 require(base.activePhysics.empty() && !base.dislocationDynamicsBase && !base.clusterDynamicsBase && !base.elasticDeformationBase,
"Disabled contexts were constructed");
95 configure(
"typo",123.456,
"");
97 std::filesystem::remove_all(folder);
98 std::cout<<
"PASS: active physics contexts, DD validation, generator guards, and context lifetime\n";
101 catch(
const std::exception& error)
103 std::cerr<<error.what()<<
'\n';