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};
252 const auto& config= this->bicrystalConfig;
253 std::vector<LatticeVector<3>> boxVectors;
254 boxVectors.push_back(this->mesoStateCslVectors[0]);
255 boxVectors.push_back(this->mesoStateCslVectors[1]);
256 boxVectors.push_back(this->mesoStateCslVectors[2]);
258 std::vector<VectorDimD> referenceConfigA, deformedConfigA;
259 std::vector<VectorDimD> referenceConfigB, deformedConfigB;
260 std::vector<VectorDimD> configDscl;
263 for(
const auto& [b,s,include] : bs)
264 bmax= max(bmax,b.cartesian().norm());
266 int numberOfIgnoredPoints= 0;
267 for (
const auto &latticeVector: config) {
270 if (&(latticeVector.lattice) == &(this->gb.bc.A)) {
271 double height= latticeVector.cartesian().dot(gb.nA.cartesian().normalized());
272 if (height<FLT_EPSILON)
273 temp << gb.bc.getLatticeVectorInD(latticeVector),1;
275 temp << gb.bc.getLatticeVectorInD(latticeVector),-1;
277 else if (&(latticeVector.lattice) == &(this->gb.bc.B)) {
278 double height = latticeVector.cartesian().dot(gb.nB.cartesian().normalized());
279 if (height<FLT_EPSILON)
280 temp << gb.bc.getLatticeVectorInD(latticeVector),2;
282 temp << gb.bc.getLatticeVectorInD(latticeVector),-2;
287 if (&(latticeVector.lattice) == &(this->gb.bc.A)) {
288 x = latticeVector.cartesian() + this->displacement(temp) + this->uAverage;
290 else if (&(latticeVector.lattice) == &(this->gb.bc.B) )
291 x = latticeVector.cartesian() + this->displacement(temp) - this->uAverage;
293 x = latticeVector.cartesian() + this->displacement(temp);
298 cslShift << -0.5, -FLT_EPSILON, -FLT_EPSILON;
300 std::vector<LatticeVector<3>> localBoxVectors(boxVectors);
301 localBoxVectors[0]=5*boxVectors[0];
303 for(
const auto& [b,s, include] : bs) {
304 if (include == 2 && (s - xModulo).norm() < 1e-6) {
306 numberOfIgnoredPoints++;
315 if (&(latticeVector.lattice) == &(this->gb.bc.A) && x.dot(this->gb.nA.cartesian().normalized()) <= 1e-6)
319 referenceConfigA.push_back(latticeVector.cartesian());
320 deformedConfigA.push_back(x);
322 else if (&(latticeVector.lattice) == &(this->gb.bc.B) && x.dot(this->gb.nB.cartesian().normalized()) <= 1e-6)
326 referenceConfigB.push_back(latticeVector.cartesian());
327 deformedConfigB.push_back(x);
333 int numberOfIgnoredCSLPoints= 0;
334 for(
const auto& [b,s, include] : bs)
336 if (include==2) numberOfIgnoredCSLPoints++;
338 if(numberOfIgnoredPoints != 2*numberOfIgnoredCSLPoints)
339 throw(std::runtime_error(
"GB Mesostate construction failed: incorrect number of points"));
342 int nAtoms= referenceConfigA.size()+referenceConfigB.size()+configDscl.size();
344 std::string referenceFile= name +
"_reference0.txt";
345 std::string deformedFile= name +
"_reference1.txt";
347 std::ofstream reference, deformed;
348 reference.open(referenceFile);
349 deformed.open(deformedFile);
350 if (!reference || !deformed) std::cerr <<
"Unable to open files";
351 reference << nAtoms << std::endl; deformed << nAtoms << std::endl;
352 reference <<
"Lattice=\" "; deformed <<
"Lattice=\" ";
354 reference << std::setprecision(15) << (2*boxVectors[0].cartesian()).transpose() <<
" ";
355 deformed << std::setprecision(15) << (2*boxVectors[0].cartesian()).transpose() <<
" ";
356 reference << std::setprecision(15) << (boxVectors[1].cartesian()).transpose() <<
" ";
357 deformed << std::setprecision(15) << (boxVectors[1].cartesian()).transpose() <<
" ";
358 reference << std::setprecision(15) << (boxVectors[2].cartesian()).transpose();
359 deformed << std::setprecision(15) << (boxVectors[2].cartesian()).transpose();
360 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=\" ";
361 reference << std::setprecision(15) << (-1 * boxVectors[0].cartesian()).transpose() <<
"\"" << std::endl;
362 deformed << std::setprecision(15) << (-1 * boxVectors[0].cartesian()).transpose() <<
"\"" << std::endl;
364 for(
const auto& position : referenceConfigA)
365 reference << 1 <<
" " << std::setprecision(15) << position.transpose() <<
" " << 0.05 << std::endl;
366 for(
const auto& position : referenceConfigB)
367 reference << 2 <<
" " << std::setprecision(15) << position.transpose() <<
" " << 0.05 << std::endl;
368 for(
const auto& position : deformedConfigA)
369 deformed << 1 <<
" " << std::setprecision(15) << position.transpose() <<
" " << 0.05 << std::endl;
370 for(
const auto& position : deformedConfigB)
371 deformed << 2 <<
" " << std::setprecision(15) << position.transpose() <<
" " << 0.05 << std::endl;
372 for(
const auto& position : configDscl) {
373 reference << 4 <<
" " << std::setprecision(15) << position.transpose() <<
" " << 0.01 << std::endl;
374 deformed << 4 <<
" " << std::setprecision(15) << position.transpose() <<
" " << 0.01 << std::endl;