56 auto normal= gb.
nA.cartesian().normalized();
57 std::map<OrderedTuplet<dim+1>,
VectorDimD> xuPairs;
58 std::vector<LatticeVector<dim>> bicrystalBoxVectors(mesoStateCslVectors);
59 bicrystalBoxVectors[0]= 2*mesoStateCslVectors[0];
61 shift << -0.5-FLT_EPSILON,-FLT_EPSILON,-FLT_EPSILON;
64 for(
const auto& [b,s,include] : bs)
69 valueu= b.cartesian()/2;
112 if (tempx.dot(normal) < FLT_EPSILON)
113 keyx << gb.
bc.getLatticeVectorInD(gb.
bc.A.latticeVector(tempx)), 1;
115 keyx << gb.
bc.getLatticeVectorInD(gb.
bc.A.latticeVector(tempx)), -1;
117 catch(std::runtime_error& e) {
118 std::cout << e.what() << std::endl;
119 std::cout <<
"x key = " << keyx.transpose() <<
"; " << tempx.transpose() << std::endl;
120 std::cout <<
"b = " << b.cartesian().transpose() <<
" ; s= " << s.transpose() << std::endl;
123 xuPairs[keyx]=valueu;
125 if(xuPairs.size() != bs.size())
126 throw(std::runtime_error(
"Clash in constraints."));
171 const std::string& potentialName,
173 const std::array<Eigen::Index,dim>& n)
const
175 box(
"temp" + std::to_string(omp_get_thread_num()));
176 std::pair<double,double> densityEnergyPair=
energy(lmpLocation,
177 "temp" + std::to_string(omp_get_thread_num()) +
"_reference1.txt",
182 Eigen::Matrix3d rhoCell;
184 for (
int i=0; i<n[0]; ++i)
186 for (
int j=0; j<n[1]; ++j) {
187 for (
int k = 0; k < n[2]; ++k)
189 Eigen::Vector<double,Eigen::Dynamic> x= i*rho.
unitCell.col(0)/n[0] +
200 return {densityEnergyPair.first,densityEnergyPair.second,rho};
249 const auto& config= this->bicrystalConfig;
250 std::vector<LatticeVector<3>> boxVectors;
251 boxVectors.push_back(this->mesoStateCslVectors[0]);
252 boxVectors.push_back(this->mesoStateCslVectors[1]);
253 boxVectors.push_back(this->mesoStateCslVectors[2]);
255 std::vector<VectorDimD> referenceConfigA, deformedConfigA;
256 std::vector<VectorDimD> referenceConfigB, deformedConfigB;
257 std::vector<VectorDimD> configDscl;
260 for(
const auto& [b,s,include] : bs)
261 bmax= max(bmax,b.cartesian().norm());
263 int numberOfIgnoredPoints= 0;
264 for (
const auto &latticeVector: config) {
267 if (&(latticeVector.lattice) == &(this->gb.bc.A)) {
268 double height= latticeVector.cartesian().dot(gb.nA.cartesian().normalized());
269 if (height<FLT_EPSILON)
270 temp << gb.bc.getLatticeVectorInD(latticeVector),1;
272 temp << gb.bc.getLatticeVectorInD(latticeVector),-1;
274 else if (&(latticeVector.lattice) == &(this->gb.bc.B)) {
275 double height = latticeVector.cartesian().dot(gb.nB.cartesian().normalized());
276 if (height<FLT_EPSILON)
277 temp << gb.bc.getLatticeVectorInD(latticeVector),2;
279 temp << gb.bc.getLatticeVectorInD(latticeVector),-2;
284 if (&(latticeVector.lattice) == &(this->gb.bc.A)) {
285 x = latticeVector.cartesian() + this->displacement(temp) + this->uAverage;
287 else if (&(latticeVector.lattice) == &(this->gb.bc.B) )
288 x = latticeVector.cartesian() + this->displacement(temp) - this->uAverage;
290 x = latticeVector.cartesian() + this->displacement(temp);
295 cslShift << -0.5, -FLT_EPSILON, -FLT_EPSILON;
297 std::vector<LatticeVector<3>> localBoxVectors(boxVectors);
298 localBoxVectors[0]=5*boxVectors[0];
300 for(
const auto& [b,s, include] : bs) {
301 if (include == 2 && (s - xModulo).norm() < 1e-6) {
303 numberOfIgnoredPoints++;
312 if (&(latticeVector.lattice) == &(this->gb.bc.A) && x.dot(this->gb.nA.cartesian().normalized()) <= 1e-6)
316 referenceConfigA.push_back(latticeVector.cartesian());
317 deformedConfigA.push_back(x);
319 else if (&(latticeVector.lattice) == &(this->gb.bc.B) && x.dot(this->gb.nB.cartesian().normalized()) <= 1e-6)
323 referenceConfigB.push_back(latticeVector.cartesian());
324 deformedConfigB.push_back(x);
330 int numberOfIgnoredCSLPoints= 0;
331 for(
const auto& [b,s, include] : bs)
333 if (include==2) numberOfIgnoredCSLPoints++;
335 if(numberOfIgnoredPoints != 2*numberOfIgnoredCSLPoints)
336 throw(std::runtime_error(
"GB Mesostate construction failed: incorrect number of points"));
339 int nAtoms= referenceConfigA.size()+referenceConfigB.size()+configDscl.size();
341 std::string referenceFile= name +
"_reference0.txt";
342 std::string deformedFile= name +
"_reference1.txt";
344 std::ofstream reference, deformed;
345 reference.open(referenceFile);
346 deformed.open(deformedFile);
347 if (!reference || !deformed) std::cerr <<
"Unable to open files";
348 reference << nAtoms << std::endl; deformed << nAtoms << std::endl;
349 reference <<
"Lattice=\" "; deformed <<
"Lattice=\" ";
351 reference << std::setprecision(15) << (2*boxVectors[0].cartesian()).transpose() <<
" ";
352 deformed << std::setprecision(15) << (2*boxVectors[0].cartesian()).transpose() <<
" ";
353 reference << std::setprecision(15) << (boxVectors[1].cartesian()).transpose() <<
" ";
354 deformed << std::setprecision(15) << (boxVectors[1].cartesian()).transpose() <<
" ";
355 reference << std::setprecision(15) << (boxVectors[2].cartesian()).transpose();
356 deformed << std::setprecision(15) << (boxVectors[2].cartesian()).transpose();
357 reference <<
"\" Properties=atom_types:I:1:pos:R:3:radius:R:1 PBC=\"F T T\" origin=\" "; deformed <<
"\" Properties=atom_types:I:1:pos:R:3:radius:R:1 PBC=\" F T T\" origin=\" ";
358 reference << std::setprecision(15) << (-1 * boxVectors[0].cartesian()).transpose() <<
"\"" << std::endl;
359 deformed << std::setprecision(15) << (-1 * boxVectors[0].cartesian()).transpose() <<
"\"" << std::endl;
361 for(
const auto& position : referenceConfigA)
362 reference << 1 <<
" " << std::setprecision(15) << position.transpose() <<
" " << 0.05 << std::endl;
363 for(
const auto& position : referenceConfigB)
364 reference << 2 <<
" " << std::setprecision(15) << position.transpose() <<
" " << 0.05 << std::endl;
365 for(
const auto& position : deformedConfigA)
366 deformed << 1 <<
" " << std::setprecision(15) << position.transpose() <<
" " << 0.05 << std::endl;
367 for(
const auto& position : deformedConfigB)
368 deformed << 2 <<
" " << std::setprecision(15) << position.transpose() <<
" " << 0.05 << std::endl;
369 for(
const auto& position : configDscl) {
370 reference << 4 <<
" " << std::setprecision(15) << position.transpose() <<
" " << 0.01 << std::endl;
371 deformed << 4 <<
" " << std::setprecision(15) << position.transpose() <<
" " << 0.01 << std::endl;