59 auto normal= gb.
nA.cartesian().normalized();
60 std::map<OrderedTuplet<dim+1>,
VectorDimD> xuPairs;
61 std::vector<LatticeVector<dim>> bicrystalBoxVectors(mesoStateCslVectors);
62 bicrystalBoxVectors[0]= 2*mesoStateCslVectors[0];
64 shift << -0.5-FLT_EPSILON,-FLT_EPSILON,-FLT_EPSILON;
67 for(
const auto& [b,s,include] : bs)
72 valueu= b.cartesian()/2;
115 if (tempx.dot(normal) < FLT_EPSILON)
116 keyx << gb.
bc.getLatticeVectorInD(gb.
bc.A.latticeVector(tempx)), 1;
118 keyx << gb.
bc.getLatticeVectorInD(gb.
bc.A.latticeVector(tempx)), -1;
120 catch(std::runtime_error& e) {
121 std::cout << e.what() << std::endl;
122 std::cout <<
"x key = " << keyx.transpose() <<
"; " << tempx.transpose() << std::endl;
123 std::cout <<
"b = " << b.cartesian().transpose() <<
" ; s= " << s.transpose() << std::endl;
126 xuPairs[keyx]=valueu;
128 if(xuPairs.size() != bs.size())
129 throw(std::runtime_error(
"Clash in constraints."));
174 const std::string& potentialName,
176 const std::array<Eigen::Index,dim>& n)
const
178 box(
"temp" + std::to_string(omp_get_thread_num()));
179 std::pair<double,double> densityEnergyPair=
energy(lmpLocation,
180 "temp" + std::to_string(omp_get_thread_num()) +
"_reference1.txt",
185 Eigen::Matrix3d rhoCell;
187 for (
int i=0; i<n[0]; ++i)
189 for (
int j=0; j<n[1]; ++j) {
190 for (
int k = 0; k < n[2]; ++k)
192 Eigen::Vector<double,Eigen::Dynamic> x= i*rho.
unitCell.col(0)/n[0] +
203 return {densityEnergyPair.first,densityEnergyPair.second,rho};
250 const auto& config= this->bicrystalConfig;
251 std::vector<LatticeVector<3>> boxVectors;
252 boxVectors.push_back(this->mesoStateCslVectors[0]);
253 boxVectors.push_back(this->mesoStateCslVectors[1]);
254 boxVectors.push_back(this->mesoStateCslVectors[2]);
256 std::vector<VectorDimD> referenceConfigA, deformedConfigA;
257 std::vector<VectorDimD> referenceConfigB, deformedConfigB;
258 std::vector<VectorDimD> configDscl;
261 for(
const auto& [b,s,include] : bs)
262 bmax= max(bmax,b.cartesian().norm());
264 int numberOfIgnoredPoints= 0;
265 for (
const auto &latticeVector: config) {
268 if (&(latticeVector.lattice) == &(this->gb.bc.A)) {
269 double height= latticeVector.cartesian().dot(gb.nA.cartesian().normalized());
270 if (height<FLT_EPSILON)
271 temp << gb.bc.getLatticeVectorInD(latticeVector),1;
273 temp << gb.bc.getLatticeVectorInD(latticeVector),-1;
275 else if (&(latticeVector.lattice) == &(this->gb.bc.B)) {
276 double height = latticeVector.cartesian().dot(gb.nB.cartesian().normalized());
277 if (height<FLT_EPSILON)
278 temp << gb.bc.getLatticeVectorInD(latticeVector),2;
280 temp << gb.bc.getLatticeVectorInD(latticeVector),-2;
285 if (&(latticeVector.lattice) == &(this->gb.bc.A)) {
286 x = latticeVector.cartesian() + this->displacement(temp) + this->uAverage;
288 else if (&(latticeVector.lattice) == &(this->gb.bc.B) )
289 x = latticeVector.cartesian() + this->displacement(temp) - this->uAverage;
291 x = latticeVector.cartesian() + this->displacement(temp);
296 cslShift << -0.5, -FLT_EPSILON, -FLT_EPSILON;
298 std::vector<LatticeVector<3>> localBoxVectors(boxVectors);
299 localBoxVectors[0]=5*boxVectors[0];
301 for(
const auto& [b,s, include] : bs) {
302 if (include == 2 && (s - xModulo).norm() < 1e-6) {
304 numberOfIgnoredPoints++;
313 if (&(latticeVector.lattice) == &(this->gb.bc.A) && x.dot(this->gb.nA.cartesian().normalized()) <= 1e-6)
317 referenceConfigA.push_back(latticeVector.cartesian());
318 deformedConfigA.push_back(x);
320 else if (&(latticeVector.lattice) == &(this->gb.bc.B) && x.dot(this->gb.nB.cartesian().normalized()) <= 1e-6)
324 referenceConfigB.push_back(latticeVector.cartesian());
325 deformedConfigB.push_back(x);
331 int numberOfIgnoredCSLPoints= 0;
332 for(
const auto& [b,s, include] : bs)
334 if (include==2) numberOfIgnoredCSLPoints++;
336 if(numberOfIgnoredPoints != 2*numberOfIgnoredCSLPoints)
337 throw(std::runtime_error(
"GB Mesostate construction failed: incorrect number of points"));
340 int nAtoms= referenceConfigA.size()+referenceConfigB.size()+configDscl.size();
342 std::string referenceFile= name +
"_reference0.txt";
343 std::string deformedFile= name +
"_reference1.txt";
345 std::ofstream reference, deformed;
346 reference.open(referenceFile);
347 deformed.open(deformedFile);
348 if (!reference || !deformed) std::cerr <<
"Unable to open files";
349 reference << nAtoms << std::endl; deformed << nAtoms << std::endl;
350 reference <<
"Lattice=\" "; deformed <<
"Lattice=\" ";
352 reference << std::setprecision(15) << (2*boxVectors[0].cartesian()).transpose() <<
" ";
353 deformed << std::setprecision(15) << (2*boxVectors[0].cartesian()).transpose() <<
" ";
354 reference << std::setprecision(15) << (boxVectors[1].cartesian()).transpose() <<
" ";
355 deformed << std::setprecision(15) << (boxVectors[1].cartesian()).transpose() <<
" ";
356 reference << std::setprecision(15) << (boxVectors[2].cartesian()).transpose();
357 deformed << std::setprecision(15) << (boxVectors[2].cartesian()).transpose();
358 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=\" ";
359 reference << std::setprecision(15) << (-1 * boxVectors[0].cartesian()).transpose() <<
"\"" << std::endl;
360 deformed << std::setprecision(15) << (-1 * boxVectors[0].cartesian()).transpose() <<
"\"" << std::endl;
362 for(
const auto& position : referenceConfigA)
363 reference << 1 <<
" " << std::setprecision(15) << position.transpose() <<
" " << 0.05 << std::endl;
364 for(
const auto& position : referenceConfigB)
365 reference << 2 <<
" " << std::setprecision(15) << position.transpose() <<
" " << 0.05 << std::endl;
366 for(
const auto& position : deformedConfigA)
367 deformed << 1 <<
" " << std::setprecision(15) << position.transpose() <<
" " << 0.05 << std::endl;
368 for(
const auto& position : deformedConfigB)
369 deformed << 2 <<
" " << std::setprecision(15) << position.transpose() <<
" " << 0.05 << std::endl;
370 for(
const auto& position : configDscl) {
371 reference << 4 <<
" " << std::setprecision(15) << position.transpose() <<
" " << 0.01 << std::endl;
372 deformed << 4 <<
" " << std::setprecision(15) << position.transpose() <<
" " << 0.01 << std::endl;