18 const std::map<int,double> nuclei{{2,20.0},{7,30.0}};
20 std::uniform_real_distribution<double> uniform(0.0,1.0);
22 for(
size_t trial=0;trial<100000;++trial)
24 const double u=uniform(gen),
v=uniform(gen),
w=uniform(gen);
26 for(
const size_t count : {2,10,100})
28 const std::vector<double> lengths(count,100.0/count);
29 const std::vector<std::map<int,double>> rates(count,{{2,2.0/count},{7,6.0/count}});
31 require(
bool(
result)==
bool(reference),
"Segmentation changed event occurrence");
34 require(
result->target==reference->target,
"Segmentation changed target competition");
35 require(std::abs(
result->centerFraction-reference->centerFraction)<1.e-12,
"Segmentation changed nucleation position");
36 require(
result->length==reference->length,
"Segmentation changed nucleus length");
42 second+=reference->target==7;
45 require(std::abs(
double(
events)/100000.0-(-std::expm1(-0.8)))<0.005,
"Incorrect total hazard");
46 require(std::abs(
double(second)/
events-0.75)<0.01,
"Incorrect target competition");
50 for(
const double v : {0.1,0.6})
56 const auto a=
model::sampleThermalCrossSlip({40.0,60.0},{{{2,1.0}},{{2,9.0}}},nuclei,1.0,0.1,0.1,0.6);
57 const auto b=
model::sampleThermalCrossSlip({10.0,30.0,20.0,40.0},{{{2,0.25}},{{2,0.75}},{{2,3.0}},{{2,6.0}}},nuclei,1.0,0.1,0.1,0.6);
58 require(
a &&
b && std::abs(
a->centerFraction-
b->centerFraction)<1.e-12,
"Nonuniform rates depend on segmentation");
59 std::cout<<
"PASS: thermal branch sampling independent of segmentation, competing hazards and physical nucleus lengths\n";
61 catch(
const std::exception& error)
63 std::cerr<<error.what()<<
'\n';
std::optional< ThermalCrossSlipEvent > sampleThermalCrossSlip(const std::vector< double > &lengths, const std::vector< std::map< int, double > > &rates, const std::map< int, double > &nucleusLengths, const double dt, const double occurrence, const double targetDraw, const double positionDraw)